Двоичный классификатор спама CNN, использующий ResNet50, выдает метрику val-train> 0,99, но тестовая метрика c падает ниже 0,6. Неправильный код или подход? - PullRequest
0 голосов
/ 06 августа 2020

Я работаю над проектом двоичного классификатора спама, в котором мне нужно определить, является ли изображение спамом или нет. Чтобы получить более подробную информацию, позвольте мне сначала показать вам, что такое не спам : enter image description here

введите описание изображения здесь

Любое изображение в мире, которое не является изображением вопроса на бумаге, является спамом, будь то велосипед, черный экран или что-то еще.

Я использовал манекен, сделанный на заказ модель а также 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 с нуля.

Думаю, мне нужно больше данных, но на сколько данных я должен ориентироваться, чтобы УЗНАТЬ, ЧТО ВОПРОС ИЗОБРАЖЕНИЕ ВЫГЛЯДИТ НА , потому что спамом может быть что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...