为什么 keras 神经网络对所有不同的图像预测相同的数字?

红党 |

我正在尝试使用 tensorflow 的 keras 神经网络来识别手写数字。但是我知道为什么当我调用时predict(),它为所有输入图像返回相同的结果。

这是代码:

  ### Train dataset ###
  mnist = tf.keras.datasets.mnist
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
  x_train = x_train/255
  x_test = x_test/255

  model = tf.keras.models.Sequential()
  model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
  model.add(tf.keras.layers.Dense(units=128,activation=tf.nn.relu))
  model.add(tf.keras.layers.Dense(units=10,activation=tf.nn.softmax))

  model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])

  model.fit(x_train, y_train, epochs=5)

结果如下所示:

Epoch 1/5
1875/1875 [==============================] - 2s 672us/step - loss: 0.2620 - accuracy: 0.9248
Epoch 2/5
1875/1875 [==============================] - 1s 567us/step - loss: 0.1148 - accuracy: 0.9658
Epoch 3/5
1875/1875 [==============================] - 1s 559us/step - loss: 0.0784 - accuracy: 0.9764
Epoch 4/5
1875/1875 [==============================] - 1s 564us/step - loss: 0.0596 - accuracy: 0.9817
Epoch 5/5
1875/1875 [==============================] - 1s 567us/step - loss: 0.0462 - accuracy: 0.9859

然后使用图像进行测试的代码如下:

  img = cv.imread('path/to/1.png')
  img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  img = cv.resize(img,(28,28))
  img = np.array([img])
    
  if cv.countNonZero((255-image)) == 0:
     print('')
  img = np.invert(img)
    
  plt.imshow(img[0])
  plt.show()
    
  prediction = model.predict(img)
  result = np.argmax(prediction)
  print(prediction)
  print(f'Result: {result}')

结果是:

输入数字 1

plt 显示: PLT 显示 1

[[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]
Result: 3

输入数字 2

显示 PLT 显示 2

[[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]
Result: 3
因纳特

与您在训练集上所做的一样,在推理时间内标准化您的数据

img = np.array([img]) / 255

查看此答案(推理)以获取更多详细信息。


根据您的第三条评论,这里有一些细节。

def input_prepare(img):            
    img = cv2.resize(img, (28, 28))   
    img = cv2.bitwise_not(img)   

    img = tf.cast(tf.divide(img, 255) , tf.float64)              
    img = tf.expand_dims(img, axis=0)   
    return img 

img = cv2.imread('/content/1.png')
orig = img.copy() # save for plotting later on 

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # gray scaling 
img = input_prepare(img)

plt.imshow(tf.reshape(img, shape=[28, 28]))

在此处输入图片说明

plt.imshow(cv2.cvtColor(orig, cv2.COLOR_BGR2RGB))
plt.title(np.argmax(model.predict(img)))
plt.show()

在此处输入图片说明

它按预期工作。但是由于调整图像大小,数字会损坏并丢失其空间信息。这对于模型来说似乎没问题,但如果它变得更糟,那么模型将预测错误。一个案例

在此处输入图片说明

并且模型对此预测是错误的。

plt.imshow(cv2.cvtColor(orig, cv2.COLOR_BGR2RGB))
plt.title(np.argmax(model.predict(img)))
plt.show()

在此处输入图片说明

为了解决这个问题,我们可以cv2.erode在调整大小后申请添加一些像素,例如

def input_prepare(img):            
    img = cv2.resize(img, (28, 28))   
    img = cv2.erode(img, np.ones((2, 2)))
    img = cv2.bitwise_not(img)   

    img = tf.cast(tf.divide(img, 255) , tf.float64)              
    img = tf.expand_dims(img, axis=0)   
    return img 

在此处输入图片说明

也许不是最好的方法,但现在模型会更好地理解。

plt.imshow(cv2.cvtColor(orig, cv2.COLOR_BGR2RGB))
plt.title(np.argmax(model.predict(img)))
plt.show()

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在循环中使用 Keras 序列神经网络会得到不同的预测?

keras神经网络为每个手写数字预测相同的数字

Keras (R) - 为什么所有输入的预测概率(二元分类)都相同?

在Keras中,为什么必须基于神经网络的输出来计算损失函数?

为什么重塑我的数据会完全改变Keras中完全连接的神经网络的行为?

螺旋问题,为什么我在这个使用 Keras 的神经网络中的损失会增加?

为什么所有样本的神经网络输出都相同

为什么这个keras网络不“学习”?

Keras中的神经网络具有两种不同的输入类型-图像和值

为什么我的 keras 模型总是预测相同的结果?

这两种在Keras中添加神经网络层的方式有什么区别?

为什么我从同一个神经网络模型得到不同的预测?

神经网络的Keras负载权重/预测时的误差

Python-使用带有Keras的LSTM递归神经网络进行模式预测

为什么keras模型预测编译后会变慢?

为什么预测需要Keras中的批量大小?

为什么 Keras 训练得很好但返回错误的预测?

为什么我训练有素的神经网络会产生相同的输出

为什么 Keras 的 MSE 与我计算的不同?

为什么 Keras BatchNorm 产生与 PyTorch 不同的输出?

为什么Keras Tokenizer文本到序列对所有文本返回相同的值?

Keras顺序神经网络

使用Keras的神经网络

预测(Keras)返回什么?

当我用 keras 训练网络时,为什么我的预测形状不准确?

为什么我在 Keras 中使用前馈神经网络进行单独训练、验证和测试数据集时获得 100% 的准确率?

Keras:建立神经网络以找到数字的模数

为什么用于预测的Keras LSTM批次大小必须与拟合批次大小相同?

使用keras和tensorflow的卷积神经网络(CNN)的输入应该是什么?