首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >机器学习模型在测试数据上的表现比验证数据差

机器学习模型在测试数据上的表现比验证数据差
EN

Stack Overflow用户
提问于 2020-12-29 12:36:38
回答 1查看 121关注 0票数 0

我是机器学习的新手。

首先,我想训练一个模型来对猫和狗的图片进行分类。

我的问题是,当我训练我的模型时,它给我提供了(大约) 80-85%的训练数据和验证数据的准确性。验证数据和训练数据的损失都很低,约为0.4 - 0.5。因为这些数字非常相似,我想我不会有过度拟合的问题,对吧?

但当我用数据集中的图片(它以前从未见过)测试我的模型时,准确率被证明是70%-73%左右。所以它要低得多。我找不到任何关于为什么会这样的信息。而且,正如我所说的,我怀疑过度匹配不是问题,但由于我是一个初学者,我不太确定。

我的模型看起来像这样(我在python中使用tensorflow ):

代码语言:javascript
运行
AI代码解释
复制
model = Sequential([
    Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding = 'same', input_shape=(224,224,3), kernel_initializer="he_uniform"),
    MaxPool2D(pool_size=(2, 2)),
    Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding = 'same', kernel_initializer="he_uniform"),
    MaxPool2D(pool_size=(2, 2)),
    Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding = 'same', kernel_initializer="he_uniform", kernel_regularizer=l2(.001)),
    MaxPool2D(pool_size=(2, 2)),
    Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding = 'same', kernel_initializer="he_uniform", kernel_regularizer=l2(.001)),
    MaxPool2D(pool_size=(2, 2)),
    Flatten(),
    Dense(units = 128, activation='relu'),
    Dropout(.5),
    Dense(units=2, activation='softmax')
])

Trainable params: 3,471,810
Non-trainable params: 0

优化器,损失:

代码语言:javascript
运行
AI代码解释
复制
model.compile(optimizer=Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

这是我使用的数据集:https://www.kaggle.com/tongpython/cat-and-dog I使用3000张图像进行训练(1500张狗和1500张猫),1000张用于验证,1000张用于测试。没有重复项(因此验证集中没有图像,这些图像也在训练集中,依此类推)。

我像这样对图像进行预处理(我也使用数据增强):

代码语言:javascript
运行
AI代码解释
复制
train_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input, rescale=1/255, horizontal_flip=True, vertical_flip=True, width_shift_range=.2, height_shift_range=.2) \
    .flow_from_directory(directory=training_path, target_size=(224,224), classes=['cat', 'dog'], batch_size=64)

valid_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input, rescale=1/255, horizontal_flip=True, vertical_flip=True, width_shift_range=.2, height_shift_range=.2) \
    .flow_from_directory(directory=validation_path, target_size=(224,224), classes=['cat', 'dog'], batch_size=64)

test_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input).flow_from_directory(directory=test_path, target_size=(224,224), classes=['cat', 'dog'], batch_size=64, shuffle=False)

编辑:解决了问题。我的错误是,我没有以完全相同的方式对训练、验证和测试数据进行预处理,因为我误解了一个参数。感谢所有帮助我的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-29 14:16:35

我相信你的问题是因为你的验证数据和训练数据

代码语言:javascript
运行
AI代码解释
复制
train_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input, rescale=1/255, .....

vgg16.preprocess_input函数在+1和-1之间重新缩放像素值,因此不需要包含rescale=1/255。在测试生成器中,您不需要重新缩放像素值。因此,在训练生成器和验证生成器中删除rescale=1/255

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65492248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档