为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MM们 2023-03-16 15:45:24
我正在为 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 /= 255test_images /= 255#converting labels to one hot encoded formattrain_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 kernelsmodel.add(Conv2D(64, (3, 3), activation='relu'))# Reduce by taking the max of each 2x2 blockmodel.add(MaxPooling2D(pool_size=(2, 2)))# Dropout to avoid overfittingmodel.add(Dropout(0.25))# Flatten the results to one dimension for passing into our final layermodel.add(Flatten())# A hidden layer to learn withmodel.add(Dense(128, activation='relu'))# Another dropoutmodel.add(Dropout(0.5))# Final categorization from 0-9 with softmaxmodel.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))这每次总是给出相同的 pred_array,当然是错误的。我尝试了类似问题的答案。例如,尝试增加时代,也有一个答案说要做尝试了一切,但似乎无济于事。也许,我对图像的规范化是错误的,或者我可能犯了一些愚蠢的错误,因为我是处理图像和使用 CNN 的新手。请帮忙
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我只是复制了代码,一切正常。我希望您没有从规范化的 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。


查看完整回答
反对 回复 2023-03-16
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信