【问题标题】:calling Keras predict on CNN simply returns the input在 CNN 上调用 Keras predict 只会返回输入
【发布时间】:2020-01-04 22:30:29
【问题描述】:

基于矩阵,我试图逼近一个值(回归)。然而,CNN 总是预测一个与predict 的输入相同矩阵。 我没有收到任何错误。

用于训练的数据(矩阵)存储在一个 numpy 数组中,但我只有大约 9000 个可用样本。每个矩阵的值都存储在一个一维数组中(每个矩阵一个值)。

这是我的模型:

model = keras.Sequential([
    layers.Conv2D(64, kernel_size=3, activation='selu', input_shape=(8, 8, 1)),
    layers.Conv2D(64, kernel_size=3, activation='selu'),
    layers.MaxPooling2D(pool_size=(2, 2)),
    layers.Conv2D(64, kernel_size=2, activation='selu'),
    layers.Flatten(),
    layers.Dense(1, activation='linear')
])

optimizer = keras.optimizers.RMSprop(0.001)
model.compile(optimizer=optimizer,
              loss='mean_squared_error',
              metrics=['mean_squared_error'])

model.fit(matrices, values, epochs=10)

test_loss = model.evaluate(test_boards,  test_values, verbose=2)

调用prediction = model.predict(some_matrix) 时的示例输出如下所示。在这种情况下,some_matrix 等于下面的输出。

[[  51.    0.   33.    0.  100.   33.    0.   51.]
 [  10.   10.   10.    0.    0.   10.   10.   10.]
 [   0.    0.   32.    0.    0.   32.    0.    0.]
 [   0.    0.    0.   88.   10.    0.    0.    0.]
 [   0.    0.    0.    0.    0.    0.    0.    0.]
 [   0.    0.    0.  -10.    0.  -32.    0.    0.]
 [ -10.  -10.  -10.    0.    0.  -10.  -10.  -10.]
 [ -51.  -32.  -33.  -88. -100.  -33.    0.  -51.]]

为了获得单个值作为输出,我缺少什么?或者至少是输入的修改版本?

编辑

My matrix data(不适合免费的 pastebin 帐户,抱歉)

My values

An example google colab file

我没有找到将数据提供给 Google Colab 并将它们包含在链接中的方法,对于给您带来的不便,我深表歉意。

这次我确实遇到了一个错误,我在自己的环境中运行代码时没有遇到这个错误。这绝对是问题所在,但我仍然不知道如何解决这个问题。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-595f98617fa0> in <module>()
     97   [ -51,   -32,  -33,  -88, -100,  -33,    0,  -51,]])
     98 print(test_boards[0])
---> 99 prediction = model.predict(test_boards[0])
    100 print("Prediction:")
    101 print(prediction)

3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    561                            ': expected ' + names[i] + ' to have ' +
    562                            str(len(shape)) + ' dimensions, but got array '
--> 563                            'with shape ' + str(data_shape))
    564         if not check_batch_axis:
    565           data_shape = data_shape[1:]

ValueError: Error when checking input: expected conv2d_12_input to have 4 dimensions, but got array with shape (8, 8, 1)

【问题讨论】:

  • 没看懂问题,能否提供样例输入输出?它不能预测 8x8x1 矩阵,因为模型只有一个神经元。确保您使用的是正确的模型。
  • 感谢您的回复,我也是这么想的。最低代码块的矩阵是我在predict 中用作参数的矩阵。但它返回完全相同的矩阵,没有改变。
  • 好吧,老实说,我怀疑它是否会像您描述的那样发生,如果您制作一个我们可以运行的自包含示例,我们可以验证您所说的。
  • 这里是 colab colab.research.google.com/drive/…的链接
  • 您需要添加样本维度,因此您的数据为(1、8、8、1),因为您只有一个样本。你可以用 np.expand_dims 或 np.reshape 做到这一点

标签: python keras regression conv-neural-network


【解决方案1】:

您需要在测试样本中添加批量大小维度。

some_matrix = some_matrix[np.newaxis,:,:,np.newaxis]

【讨论】:

  • 这不起作用,但有人在问题的 cmets 中给出了一个可行的解决方案:我也会在这里为潜在的未来访问者提供它。形状必须是(1,8,8,1)。 (维度和#channels 为 2x a 1)。数据由numpy.reshape(1,8,8,1) 重塑。不过,我会接受您的回复作为答案,因为您也发现了问题。
  • 很高兴您找到了解决方案。我想我知道我的答案哪里出错了,并在上面尝试过更正。
猜你喜欢
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2015-04-20
  • 2015-08-21
  • 2015-03-29
  • 2018-11-04
相关资源
最近更新 更多