【问题标题】:Deploying a CNN: High training and test accuracy but low prediction accuracy部署 CNN:训练和测试准确度高,但预测准确度低
【发布时间】:2020-11-06 14:18:51
【问题描述】:

刚开始学习机器学习并创建了我的第一个 CNN 来检测人脸图像的方向。在 2 组不同的 1000 张图片(128x128 RGB)上,我得到了高达 96-99% 的训练和测试准确率。但是,当我自己从测试集中预测图像时,模型很少能正确预测。我认为在测试和预测期间将数据加载到模型中的方式肯定有所不同。以下是我将数据加载到模型中以进行训练和测试的方式:

datagen = ImageDataGenerator()
train_it = datagen.flow_from_directory('twoThousandTransformed/', class_mode='categorical', batch_size=32, color_mode="rgb", target_size=(64,64))
val_it = datagen.flow_from_directory('validation/', class_mode='categorical', batch_size=32, color_mode="rgb", target_size=(64,64))
test_it = datagen.flow_from_directory('test/', class_mode='categorical', batch_size=32, color_mode='rgb', target_size=(64,64))

这是我加载图像以进行预测的方式:

image_path='inputPicture/02001.png'
image = tf.keras.preprocessing.image.load_img(image_path)
input_arr = keras.preprocessing.image.img_to_array(image)
reshaped_image = np.resize(input_arr, (64,64,3))
input_arr = np.array([reshaped_image]) 
predictions = model.predict(input_arr)
print(predictions)
classes = np.argmax(predictions, axis = 1)
print(classes)

ImageDataGenerator 处理图像的方式与我在预测中的处理方式肯定存在一些差异。你们都可以帮助一个菜鸟吗?谢谢!

编辑:下面是我的模型

imageInput = Input(shape=(64,64,3))
conv1 = Conv2D(128, kernel_size=16, activation='relu')(imageInput)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(64, kernel_size=12, activation='relu')(pool1)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = Conv2D(64, kernel_size=4, activation='relu')(pool2)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
flat = Flatten()(pool3)
hidden1 = Dense(16, activation='relu')(flat)
hidden2 = Dense(16, activation='relu')(hidden1)
hidden3 = Dense(10, activation='relu')(hidden2)
output = Dense(4, activation='softmax')(hidden3)
model = Model(inputs=imageInput, outputs=output)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(train_it, steps_per_epoch=16, validation_data=val_it, validation_steps=8, epochs=25)
print('here we go!')
_, accuracy = model.evaluate(test_it)
print('Accuracy: %.2f' % (accuracy*100))

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    您可以尝试的一件事是复制所选图像,使其与您训练模型时使用的批量大小相似。此外,由于训练精度如此之高,您的模型似乎一定是过拟合的。因此,如果第一件事不起作用,请尝试添加 dropout 或减少网络中的层数。

    【讨论】:

    • 如何复制图像?另外,关于过度拟合的事情:我可能理解错了,但是 96-99% 的准确率在训练集和测试集(它们是不同的 1000 张图像集)上,所以我不认为过度拟合发生了?
    • 没关系,我想出了如何复制图像并制作一批 32。问题仍然存在:(
    • 然后,尝试使用您的模型并找到一个好的模型。
    • 现在我很困惑。我的模型似乎非常擅长训练和测试,但预测(使用相同的数据集)非常糟糕。这怎么可能是模型的问题?一定是我预测的方式有问题吧?
    • 但是,正如我所见,您的预处理在两种情况下都是相同的。我认为这可能是您如何批处理它的问题,这就是为什么我告诉您复制单个测试图像以匹配批处理大小,但现在情况并非如此。
    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 2018-12-01
    • 2018-10-08
    • 2020-10-17
    • 1970-01-01
    • 2021-07-22
    • 2017-10-05
    • 2020-10-16
    相关资源
    最近更新 更多