我有一个包含 5 个类的数据集,下面是每个类中的图像数量:
第 1 类:6427 张图片
第 2 类:12678 张图片
第 3 类:9936 张图片
第 4 类:26077 张图片
第 5 类:1635 张图片
我在这个数据集上运行我的第一个 CNN 模型,我的模型被过度拟合,如下所示:
在这些模型中,过度拟合很明显,label4 的灵敏度也很高。我尝试了不同的方法,如增强等来解决这个问题,最后我使用 VGG16 模型修复了它。但是我仍然有类不平衡,但奇怪的是现在类不平衡转移到标签 1,如下所示。
为了解决类不平衡,我选择每个类的数量相等,例如,我从每个类中选择 1600 张图像,然后在上面运行我的模型,但我对 label1 的敏感度再次很高。我不知道是什么问题。我想提一下,当我添加 Dropout 层时,我收到以下混淆矩阵的结果,这是非常糟糕的:
我添加了我的第一个模型,我在下面的标签 4 上得到了过度拟合和高灵敏度:
os.chdir('.')
train_path = './train'
test_path = './test'
valid_path = './val'
train_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \
.flow_from_directory(directory=train_path, target_size=(224,224), classes=['label1', 'label2','label3','label4','label5'], batch_size=32)
test_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \
.flow_from_directory(directory=test_path, target_size=(224,224), classes=['label1', 'label2','label3','label4','label5'], batch_size=32)
valid_batches = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input) \
.flow_from_directory(directory=valid_path, target_size=(224,224), classes=['label1', 'label2','label3','label4','label5'], batch_size=32)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation='relu', padding= 'same', input_shape=(224,224,3)))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=2))
model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3),activation= 'relu', padding='same'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(5, activation='softmax'))
print(model.summary())
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x=train_batches, validation_data= valid_batches, epochs=10)
predictions = model.predict(x=test_batches, verbose=0)