Python 来自keras的model.predict总是返回相同的结果

Python 来自keras的model.predict总是返回相同的结果,python,tensorflow,keras,deep-learning,cnn,Python,Tensorflow,Keras,Deep Learning,Cnn,我正在尝试mnist数据集的CNN模型。训练模型后,模型的测试准确率达到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,

我正在尝试mnist数据集的CNN模型。训练模型后,模型的测试准确率达到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))
模型结构和模型培训:

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_数组,当然这是错误的。 我试着回答类似的问题。例如,尝试增加年代, 还有一个回答说要做什么

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。请帮助

我刚刚复制了代码,一切正常。我希望您没有从标准化的train_图像加载测试图像,因为其中的图像已经标准化,您在预测之前再次对其进行标准化。以下是我期望的工作:

image=列车图像[14]
image=image.astype('float32')
图像=图像。重塑(-1,28,28,1)
图像/=255
pred_数组=model.predict(图)
打印(pred_数组)
pred_数组=np.argmax(pred_数组)
打印('Result:{0}'。格式(pred_数组))
编辑: 我在复制你的代码时做了一些不同的事情。我将标准化图像保存在不同的Numpy数组中,如下所示:

train\u images\u norm=train\u images.astype('float32'))
test\u images\u norm=test\u images.astype('float32'))
列车图像\u标准/=255
测试图像\u范数/=255
...
模型拟合(序列图像、序列标签、序列标准等)

所以现在,当我预测时,我使用原始图像(不是标准化的)并在预测之前对它们进行标准化。您得到不可预测结果的原因是,您正在将已规范化的图像再次除以255,这将创建网络未使用的完全不同的数字。您有两种选择,要么将原始图像保留在不同的数组中,并在预测之前对其进行规格化(我的代码),要么如果希望原始代码正常工作,您可以在预测之前删除
image=image.astype('float32')
image/=255

我刚刚复制了代码,一切正常。我希望您没有从标准化的train_图像加载测试图像,因为其中的图像已经标准化,您在预测之前再次对其进行标准化。以下是我期望的工作:

image=列车图像[14]
image=image.astype('float32')
图像=图像。重塑(-1,28,28,1)
图像/=255
pred_数组=model.predict(图)
打印(pred_数组)
pred_数组=np.argmax(pred_数组)
打印('Result:{0}'。格式(pred_数组))
编辑: 我在复制你的代码时做了一些不同的事情。我将标准化图像保存在不同的Numpy数组中,如下所示:

train\u images\u norm=train\u images.astype('float32'))
test\u images\u norm=test\u images.astype('float32'))
列车图像\u标准/=255
测试图像\u范数/=255
...
模型拟合(序列图像、序列标签、序列标准等)

所以现在,当我预测时,我使用原始图像(不是标准化的)并在预测之前对它们进行标准化。您得到不可预测结果的原因是,您正在将已规范化的图像再次除以255,这将创建网络未使用的完全不同的数字。您有两种选择,要么将原始图像保留在不同的数组中,并在预测之前对其进行规范化(我的代码),要么如果您希望原始代码正常工作,您可以在预测之前删除
image=image.astype('float32')
image/=255

我不认为重新发布代码并说“适合我”应该有资格作为答案。最好留下评论。我不会标记它,但它可能应该改为注释。用户提供的代码工作正常。给出了用户预测方法可能存在的问题,代码没有重新发布,而是按照用户期望的实际工作的修改版本。虽然diffidence是一行代码,但这很可能是用户弄错的,因为他/她没有提供图像值的加载方式。@NimaAghli您在代码中也使用了train_图像。通过标准化,我指的是转换为float32,重塑,除以255,你们也都这么做了。我得到这个输出:[0.09712957 0.12846719 0.10435061 0.09085704 0.09937355 0.09544346 0.09477601 0.10677139 0.08749077 0.09534037]]结果:1对于不同的图像,当我复制我没有提到的代码时,我做了一些不同的事情。我编辑了我的答案。请看一看@NimaAghli非常感谢,不同数组中的归一化有帮助。我的输出现在是正确的。我不认为重新发布代码和说“适合我”应该作为一个答案。最好留下评论。我不会标记它,但它可能应该改为注释。用户提供的代码工作正常。给出了用户预测方法可能存在的问题,代码没有重新发布,而是按照用户期望的实际工作的修改版本。虽然diffidence是一行代码,但这很可能是用户弄错的,因为他/她没有提供图像值的加载方式。@NimaAghli您在代码中也使用了train_图像。通过标准化,我指的是转换为float32,重塑,除以255,你们也都这么做了。我得到这个输出:[0.09712957 0.12846719 0.10435061 0.09085704 0.09937355 0.09544346 0.09477601 0.10677139 0.08749077 0.09534037]]结果:1对于不同的图像,当我复制我没有提到的代码时,我做了一些不同的事情。我编辑了我的答案。请看一看@NimaAghli非常感谢,他在不同的数组中正常化了