我正在尝试mnist数据集的CNN模型。训练模型后,通过model.evaluate可以提供99%的测试准确性。 但是当我尝试预测一张图像的答案时,当我调用model.predict()时,它总是返回相同的数组。
规范化数据:
train_images = mnist_train_images.reshape(mnist_train_images.shape[0], 28, 28, 1)
test_images = mnist_test_images.reshape(mnist_test_images.shape[0], 28, 28, 1)
input_shape = (28, 28, 1)
train_images = train_images.astype('float32')
test_images = test_images.astype('float32')
train_images /= 255
test_images /= 255
#converting labels to one hot encoded format
train_labels = tensorflow.keras.utils.to_categorical(mnist_train_labels, 10)
test_labels = tensorflow.keras.utils.to_categorical(mnist_test_labels, 10)
模型结构和模型训练:
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
# 64 3x3 kernels
model.add(Conv2D(64, (3, 3), activation='relu'))
# Reduce by taking the max of each 2x2 block
model.add(MaxPooling2D(pool_size=(2, 2)))
# Dropout to avoid overfitting
model.add(Dropout(0.25))
# Flatten the results to one dimension for passing into our final layer
model.add(Flatten())
# A hidden layer to learn with
model.add(Dense(128, activation='relu'))
# Another dropout
model.add(Dropout(0.5))
# Final categorization from 0-9 with softmax
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
with tensorflow.device('/device:GPU:0'):
model.fit(train_images, train_labels,
batch_size=128,
epochs=7,
verbose=2,
validation_data=(test_images, test_labels))
现在,我有一个黑白(28,28)图像的数字(实际上,它是来自mnist训练数据本身的数字)。在标准化该图像后尝试进行预测:
image = image.reshape(-1,28, 28,1)
image = image.astype('float32')
image/=255
pred_array = model.predict(image)
print(pred_array)
pred_array = np.argmax(pred_array)
print('Result: {0}'.format(pred_array))
这总是每次都给出相同的pred_array,当然是错误的。 我尝试了类似问题的答案。例如,尝试增加时代, 还有一个答案说要做
from keras.layers.core import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D,MaxPooling2D
代替
from keras.layers import Dense, Dropout, Flatten, Conv2D,MaxPooling2D
尝试了一切,但似乎无济于事。也许,我对图像的规范化是错误的,或者因为我刚开始使用图像和使用CNN,所以可能犯了一些愚蠢的错误。请帮助
答案 0 :(得分:2)
我刚刚复制了代码,一切正常。我希望您不要从归一化的train_images加载测试图像,因为其中的图像已经被归一化了,您可以在预测之前再次对其进行归一化。以下作品符合我的预期:
image = train_images[14]
image = image.astype('float32')
image = image.reshape(-1,28, 28,1)
image/=255
pred_array = model.predict(image)
print(pred_array)
pred_array = np.argmax(pred_array)
print('Result: {0}'.format(pred_array))
编辑: 复制您的代码时,我做了一些不同的事情。我将标准化图像保留在不同的Numpy数组中,如下所示:
train_images_norm = train_images.astype('float32')
test_images_norm = test_images.astype('float32')
train_images_norm /= 255
test_images_norm /= 255
...
model.fit(train_images_norm, train_labels_norm,...)
所以现在,当我预测时,我会使用原始图像(未标准化)的图像,并在预测之前对其进行标准化。出现无法预测的结果的原因是,您将已经归一化的图像再次除以255,从而创建了完全不同的编号,网络无法使用该编号进行训练。您有两种选择,要么将原始图像保留在不同的数组中,然后在预测之前对其进行归一化(我的代码),或者如果您希望原始代码正常工作,则可以在预测之前删除image = image.astype('float32')
和image /= 255
。>