我一直在尝试使用图像生成器预处理为我的图像数据集使用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类的图像
但是我的首要任务是如何构建模型,无论是过度拟合还是拟合不足,我都无法弄清楚问题所在。
答案 0 :(得分:2)
具有相似训练和验证准确性的第二个模型看起来更好,这也许是因为模型更简单,所以可以防止过拟合。我说您可能需要更多数据。 CNN模型的图像只有3,000张。 ImageNet使用数百万个图像。您可能希望使用数据增强技术(例如图像变换(缩放,旋转,平移),向图像添加高斯噪声等)来增加图像数量。