tensorflow - 使用 ResNet50 的二进制 CNN 垃圾邮件分类器生成 val-train 指标 > 0.99,但测试指标低于 0.6。错误的代码或方法?
问题描述
我正在研究二进制垃圾邮件分类器项目,我必须对图像是否为垃圾邮件进行分类。为了详细了解,让我首先向您展示什么不是垃圾邮件:
世界上任何不是纸上问题图片的图像都是垃圾邮件,无论是自行车、黑屏还是任何东西。
我使用了我定制的虚拟模型以及ResNet50
有和没有微调。我有很多问题图片,但我使用了 47000 张问题图片和COCO 2017 测试数据集作为垃圾邮件。模型做得很好,产生了很好的结果,但是当我将它与imagenet
数据集图像一起使用时,它的表现非常糟糕。我想问一下我是否在这里做错了什么,如果没有,我应该怎么做才能使我的模型泛化。
train_data_gen = ImageDataGenerator(preprocessing_function=preprocess_input,validation_split=0.20)
train_set = train_data_gen.flow_from_directory(TRAIN,batch_size=BATCH_SIZE,target_size=(224,224),
subset='training',class_mode='categorical')
val_set = train_data_gen.flow_from_directory(TRAIN,batch_size=128,target_size=(224,224),
subset='validation',class_mode='categorical')
res_net = ResNet50(include_top=False,weights='imagenet',input_shape=(224,224,3),pooling='avg')
fc1 = Dense(1024,activation='relu')(res_net.output)
d1 = Dropout(0.79)(fc1)
out_ = Dense(1,activation='sigmoid',name='output_layer')(d1)
model = Model(inputs=res_net.input, outputs= out_)
for layer in res_net.layers:
layer.trainable = False
model.compile(loss='binary_crossentropy', optimizer=adam,
metrics=['accuracy'])
history = model.fit(train_set,epochs=3,validation_data=val_set,
steps_per_epoch=len(train_set)//BATCH_SIZE,callbacks=callbacks)
我使用softmax
过categorical_crossentropy
(2 个神经元)和sigmoid
(binary_crossentropy
1 个神经元)。模型在所有训练和验证案例中都表现良好,但为什么不能泛化?我训练模型的方式有问题吗,代码有问题吗?我是否需要更多数据,我是否需要resnet
从头开始训练。
我认为我需要更多数据,但我应该针对多少数据,以便它倾向于了解问题图像看起来像什么,因为垃圾邮件可能是任何东西。
解决方案
推荐阅读
- android - 如何将子数据从 Firebase 检索到 Android 应用
- bash - 如何处理 Bash 算术运算的错误?
- google-app-engine - 文件不想被解析( app.yaml Google Cloud Platform - App Engine 上下文)
- google-voice - 我可以将某些号码直接转发到谷歌语音信箱吗
- c# - 反射,.net 项目在不同的解决方案中从 .net 核心项目中读取 dll
- pivot - 在 OctoberCMS 中使用关系渲染添加关系后如何更新后端表单?
- c# - 如何在 C# 中正确使用 C Dll
- php - [IMG] BBCode 的正则表达式,包含 Base64 编码的图像字符串
- python - 在特殊情况下删除标点符号
- machine-learning - Dlib 的 svm_c_linear_trainer 什么时候比 svm_c_linear_dcd_trainer 好?