0

我有一个包含 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)
4

0 回答 0