【问题标题】:Deep learning CNN model not learning深度学习 CNN 模型不学习
【发布时间】:2021-03-16 16:15:21
【问题描述】:

我正在处理一个图像分类项目,但我的模型似乎没有正确训练。

我的数据集由 4000 张图像组成,每张图像的形状为 (120,120,3)。 测试集占总数据集的 20%。 所有图像均已正确标记。 图像经过标准化和单热编码。现在我只使用两个目标,但我会再添加一个,我会开始获得不错的结果。 我使用的批量大小为 16 我想使用 CNN 模型。

我现在的模特:

model = keras.models.Sequential()
model.add(Conv2D(filters=16, kernel_size=(6,6), input_shape=(IMG_SIZE,IMG_SIZE,3), activation='relu',))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.2))

model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu',))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(filters=64, kernel_size=(4,4), activation='relu',))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(filters=128, kernel_size=(3,3), activation='relu',))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(filters=256, kernel_size=(2,2), activation='relu',))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.2))


model.add(Flatten())


model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

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

model.summary()

模型摘要给出: 总参数:273,330 可训练参数:273,330 不可训练参数:0

from tensorflow.keras.callbacks import EarlyStopping
early_stop = EarlyStopping(monitor='val_loss',patience=10)



history = model.fit(x_train_sample, y_train_sample,
                   batch_size = BATCH_SIZE,
                   epochs = EPOCHS,
                   verbose = 1,
                   validation_data = (x_test, y_test)
                   ,callbacks=[early_stop,PlotLossesKeras()])

当我的模型运行 30 个 epoch 时,earlystopping 会触发。

Epoch 1/30
43/43 [==============================] - 9s 205ms/step - loss: 0.1109 - accuracy: 0.9531 - val_loss: 0.5259 - val_accuracy: 0.8397
Epoch 2/30
43/43 [==============================] - 10s 231ms/step - loss: 0.0812 - accuracy: 0.9692 - val_loss: 0.5793 - val_accuracy: 0.8355
Epoch 3/30
43/43 [==============================] - 9s 219ms/step - loss: 0.1000 - accuracy: 0.9721 - val_loss: 0.5367 - val_accuracy: 0.8547
Epoch 4/30
43/43 [==============================] - 9s 209ms/step - loss: 0.0694 - accuracy: 0.9707 - val_loss: 0.6101 - val_accuracy: 0.8269
Epoch 5/30
43/43 [==============================] - 9s 203ms/step - loss: 0.0891 - accuracy: 0.9633 - val_loss: 0.6116 - val_accuracy: 0.8419
Epoch 6/30
43/43 [==============================] - 9s 210ms/step - loss: 0.0567 - accuracy: 0.9765 - val_loss: 0.4833 - val_accuracy: 0.8419
Epoch 7/30
43/43 [==============================] - 9s 218ms/step - loss: 0.0312 - accuracy: 0.9897 - val_loss: 1.4513 - val_accuracy: 0.8034
Epoch 8/30
43/43 [==============================] - 9s 213ms/step - loss: 0.0820 - accuracy: 0.9707 - val_loss: 0.5821 - val_accuracy: 0.8248
Epoch 9/30
43/43 [==============================] - 9s 222ms/step - loss: 0.0513 - accuracy: 0.9897 - val_loss: 0.8516 - val_accuracy: 0.8462
Epoch 10/30
43/43 [==============================] - 11s 246ms/step - loss: 0.0442 - accuracy: 0.9853 - val_loss: 0.7927 - val_accuracy: 0.8397
Epoch 11/30
43/43 [==============================] - 10s 222ms/step - loss: 0.0356 - accuracy: 0.9897 - val_loss: 0.7730 - val_accuracy: 0.8141
Epoch 12/30
43/43 [==============================] - 10s 232ms/step - loss: 0.0309 - accuracy: 0.9824 - val_loss: 0.9528 - val_accuracy: 0.8226
Epoch 13/30
43/43 [==============================] - 9s 220ms/step - loss: 0.0424 - accuracy: 0.9839 - val_loss: 1.2109 - val_accuracy: 0.8013
Epoch 14/30
43/43 [==============================] - 10s 228ms/step - loss: 0.0645 - accuracy: 0.9824 - val_loss: 0.5308 - val_accuracy: 0.8547
Epoch 15/30
43/43 [==============================] - 11s 259ms/step - loss: 0.0293 - accuracy: 0.9927 - val_loss: 0.9271 - val_accuracy: 0.8333
Epoch 16/30
43/43 [==============================] - 9s 217ms/step - loss: 0.0430 - accuracy: 0.9795 - val_loss: 0.6687 - val_accuracy: 0.8483

我尝试了许多不同的模型架构,改变了层数、内核大小等......我似乎无法弄清楚出了什么问题。

【问题讨论】:

  • 但是你的训练准确率似乎是 97%,验证准确率是 84% 问题出在哪里?我不知道您的数据是什么,但也许第一个时代足以学习它。或许可以尝试降低学习率,这样准确度就会提高得更慢,波动也更小
  • 不,它确实训练得很好,你的标题误导了:深度学习 CNN 模型不学习。您的模型存在过拟合问题。

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

有很多可能的原因。

对于初学者,根据您的类别,您可能需要考虑使用迁移学习来加快您的训练过程。

您的架构看起来很合理,并且训练和验证损失似乎也正确(正在发生过度拟合)。

鉴于您已声明可以有 3 个类别,而目前只使用 2 个类别,您的训练集和测试集之间的分布可能不同吗?这可能会导致模型无法很好地泛化。

例如,您的数据集包含数量均匀分布的猫、狗和人类的图像。您设置了 2 个类别进行训练,因此您的模型在尝试验证时尝试在人和动物之间进行分割,训练数据中的分布不均匀导致模型看到人类的训练规模不足 (33%)?

【讨论】:

  • 请不要将接受和/或投票加入答案的呼吁(已编辑)。
  • 在准备我的数据集时,我确保平均分配我的每个类。本练习的目标是处理 X 射线(正常/细菌性肺炎/病毒性肺炎)