Keras CNN-模型过拟合或过拟合

时间:2018-09-05 15:41:11

标签: python tensorflow image-processing keras conv-neural-network

我一直在尝试使用图像生成器预处理为我的图像数据集使用2个不同的模型来构建CNN模型。这是我的第一个模型代码:

height=150
width=150
channels=3
batch_size=32
seed=1337

# Training generator
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(train_dir, 
                                                    target_size=(height,width),
                                                    batch_size=batch_size,
                                                    seed=seed,
                                                    class_mode='categorical')

# Test generator
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(test_dir, 
                                                  target_size=(height,width), 
                                                  batch_size=batch_size,
                                                  seed=seed,
                                                  class_mode='categorical')

给出输出:

  

找到了7个类别的3004张图像。

     

找到了794张属于7类图像。

这是我的模型架构:

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(150, 150, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Conv2D(32, (3, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Conv2D(64, (3, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

# the model so far outputs 3D feature maps (height, width, features)
model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(7))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
history = model.fit_generator(
        train_generator,
        steps_per_epoch=3004 // batch_size,
        epochs=50,
        validation_data=test_generator,
        validation_steps=794 // batch_size)

在30个时期之后,这是我的状态:

Epoch 30/50
94/93 [==============================] - 295s 3s/step - loss: 0.1396 - acc: 0.9433 - val_loss: 2.3553 - val_acc: 0.4534

表明它完全过拟合。

现在这是我尝试的第二个模型:

图片生成器:

train_datagen = ImageDataGenerator(
    rotation_range = 40,                  
    width_shift_range = 0.2,                  
    height_shift_range = 0.2,                  
    rescale = 1./255,                  
    shear_range = 0.2,                  
    zoom_range = 0.2,                     
    horizontal_flip = True)
validation_datagen = ImageDataGenerator(rescale = 1./255)
train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(150,150),
    class_mode='categorical',
    batch_size = 32)
validation_generator = validation_datagen.flow_from_directory(
    test_dir,
    target_size=(150,150),
    class_mode='categorical',
    batch_size = 32)

我的模型架构:

cnn = Sequential()
cnn.add(Conv2D(filters=32, 
               kernel_size=(2,2), 
               strides=(1,1),
               padding='same',
               input_shape=(150,150,3),
               data_format='channels_last'))
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2,2),
                     strides=2))
cnn.add(Conv2D(filters=64,
               kernel_size=(2,2),
               strides=(1,1),
               padding='valid'))
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2,2),
                     strides=2))
cnn.add(Flatten())        
cnn.add(Dense(64))
cnn.add(Activation('relu'))
cnn.add(Dropout(0.25))
cnn.add(Dense(7))
cnn.add(Activation('softmax'))
cnn.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

这是我在30个时代之后得到的:

Epoch 30/50
    94/93 [==============================] - 295s 3s/step - loss: 1.1396 - acc: 0.5633 - val_loss: 1.3553 - val_acc: 0.5534

哪个表明模型不是过拟合的,但是肯定不能很好地预测。

基于以上两个模型,这两个模型还是我的图像是否有问题? 什么是解决此问题的最佳解决方案?我该如何尝试不同的模型,以检查哪种模型运行良好?

我还想知道,如果我能够成功构建模型,那么如何预测新图像,因为model.predict似乎不起作用,并且如果我将图像保留在文件夹并使用model.predict_generator它显示:

  

找到0个属于0类的图像

但是我的首要任务是如何构建模型,无论是过度拟合还是拟合不足,我都无法弄清楚问题所在。

1 个答案:

答案 0 :(得分:2)

具有相似训练和验证准确性的第二个模型看起来更好,这也许是因为模型更简单,所以可以防止过拟合。我说您可能需要更多数据。 CNN模型的图像只有3,000张。 ImageNet使用数百万个图像。您可能希望使用数据增强技术(例如图像变换(缩放,旋转,平移),向图像添加高斯噪声等)来增加图像数量。