Keras模型过度拟合

时间:2018-11-05 21:00:54

标签: python keras

我正在研究喀拉拉邦的多类图像分类问题。在kaggle上使用dog-breeds数据集。我对12个品种的准确度是95%,但我的验证准确度只有50%。看起来模型过度拟合,但是我不确定为防止过度拟合我需要做什么

enter image description here

这是我的基本训练设置

from keras.utils.np_utils import to_categorical
from keras.layers import Conv2D, Activation, MaxPooling2D
from keras import optimizers
from keras.layers.normalization import BatchNormalization

img_width, img_height = 224, 224

datagen_top = ImageDataGenerator(
        rotation_range=180,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

generator_top = datagen_top.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=False)

nb_train_samples = len(generator_top.filenames)
num_classes = len(generator_top.class_indices)


train_data = bottleneck_features_train

# get the class lebels for the training data, in the original order
train_labels = generator_top.classes

# https://github.com/fchollet/keras/issues/3467
# convert the training labels to categorical vectors
train_labels = to_categorical(train_labels, num_classes=num_classes)

generator_top = datagen_top.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode=None,
    shuffle=False)

nb_validation_samples = len(generator_top.filenames)

validation_data = bottleneck_features_validation

validation_labels = generator_top.classes
validation_labels = to_categorical(
    validation_labels, num_classes=num_classes)

input_shape = train_data.shape[1:]

model = Sequential()
model.add(Flatten(input_shape=input_shape))
model.add(Dense(num_classes, activation='softmax'))

model.compile(optimizer=optimizers.RMSprop(lr=2e-4),
              loss='categorical_crossentropy', metrics=['accuracy'])

history = model.fit(train_data, train_labels,
                    epochs=epochs,
                    batch_size=batch_size,
                    callbacks=[],
                    validation_data=(validation_data, validation_labels))

model.save_weights(top_model_weights_path)

(eval_loss, eval_accuracy) = model.evaluate(
    validation_data, validation_labels, batch_size=batch_size, verbose=1)

笔记本正在合作中。 https://colab.research.google.com/drive/13RzXpxE-yMEuMFPHnmBpzD1gFXWxVyXK

2 个答案:

答案 0 :(得分:0)

单层网络不会出现图像分类问题。网络将永远无法泛化,因为没有机会。尝试将网络扩展更多,甚至可以尝试使用CNN。

示例:

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.RMSprop(),
              metrics=['accuracy'])

答案 1 :(得分:0)

这通常发生在您有太多的层并且结果维数(跨步和合并后)小于后续层的最小输入大小(卷积核)的情况下。

狗品种数据的图像大小是多少?

您确定重塑正确吗?