Keras VGG16的flow_from_directory val_acc没有上升

时间:2019-05-26 06:55:26

标签: python keras conv-neural-network vgg-net

我使用keras并导入具有imagenet权重的VGG16网络以对男性/女性照片进行分类。

目录结构为:

  • split_1 / train / male / *。jpg
  • split_1 / train / female / *。jpg
  • split_1 / val / female / *。jpg
  • split_1 / val / male / *。jpg

我尝试了在互联网上找到的大多数解决方案,但没有一个起作用:

  • 更改batch_size
  • 更改优化程序
  • 更改class_mode /损失功能
  • 将每个图层设置为trainable
  • 将VGG中的每个图层复制到我的连续图片中
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications

[...]

img_width, img_height = 224, 224

top_model_weights_path = "%s_retry2.h5" % split
train_data_dir = "%s/train" % split
validation_data_dir = "%s/val" % split
batch_size = 48
nb_train_samples = 4000
nb_validation_samples = ( 299 // batch_size ) * batch_size
epochs = 5

def train_top_model():
    datagen = ImageDataGenerator(
        horizontal_flip=True,
        shear_range=0.2,
        rescale=1. / 255)

    vdatagen = ImageDataGenerator(rescale=1./255)

    traingen = datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical',
        follow_links=True,
        shuffle=True)

     valgen = vdatagen.flow_from_directory(
        validation_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical',
        follow_links=True,
        shuffle=True)

    vgg_model = applications.VGG16(input_shape=(224,224,3), weights="imagenet", include_top=False)
    model = Sequential()
    model.add(vgg_model)
    model.add(Flatten())
    model.add(Dense(2, activation='softmax'))
    model.compile(optimizer="rmsprop", loss='categorical_crossentropy', metrics=['accuracy'])

    history = model.fit_generator(traingen,
              epochs=epochs,
              steps_per_epoch=nb_train_samples // batch_size,
              validation_data=valgen,
              validation_steps=nb_validation_samples // batch_size)

它报告实际图像数量,以便正确找到jpg。 在整个训练过程中,val的准确性始终保持“随机”且保持相同(〜50%)。

2 个答案:

答案 0 :(得分:1)

尝试降低学习率,在这种情况下,您的模型每次都会超出最小值,因此无法收敛。

如果任何一种超参数调整都不起作用,那么您需要修复数据,但是我认为对于具有预训练权重的CNN模型而言,男性/女性分类数据应该不那么难学习。

答案 1 :(得分:0)

每个班级有多少个样品??? 似乎您没有足够的数据来微调VGG16具有的这些大规模参数。 (如果您可以训练所有层次,则为1.38亿)

我建议: 1.对于性别分类问题,请尝试使用官方数据库,例如IMDB-WIKI 2.如果您想使用自己的数据,请先收集更多标签样本,然后再增加所有样本 3.最后,使用最先进的CNN架构,例如Xception(您可以在keras中加载对xception进行预训练的imagenet)冻结20个第一层并进行其他功能的调整