首页 > 解决方案 > 使用 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)

我使用softmaxcategorical_crossentropy(2 个神经元)和sigmoidbinary_crossentropy1 个神经元)。模型在所有训练和验证案例中都表现良好,但为什么不能泛化?我训练模型的方式有问题吗,代码有问题吗?我是否需要更多数据,我是否需要resnet从头开始训练。

我认为我需要更多数据,但我应该针对多少数据,以便它倾向于了解问题图像看起来像什么,因为垃圾邮件可能是任何东西。

标签: tensorflowkerasdeep-learningcomputer-visionconv-neural-network

解决方案


推荐阅读