【问题标题】:Very high overfitting in image classification model图像分类模型中非常高的过拟合
【发布时间】:2021-05-12 09:26:52
【问题描述】:

我是 CNN 开发的初学者,为了完成一项大学任务,我的任务是为食品创建一个图像分类器。我使用的数据集是Recipes5k。它有101类食物:

我正在使用与 Tensorflow 配对的 Google Colab 来实现这一点,并且一直在关注 Tensorflow's image classification beginner tutorial

到目前为止,一切都清晰易懂,但在训练我的模型时遇到了一个问题:与训练准确度(90 %+)。我怀疑这可能是由于模型的过度拟合。到目前为止,我已经尝试了图像增强技术并将 dropout 应用于模型。这没有按预期工作,仅将准确率提高了约 5%。我已经在下面发布了必要的代码 sn-ps:

数据增强层:

data_augmentation = keras.Sequential(
  [
    layers.experimental.preprocessing.RandomFlip("horizontal", 
                                                 input_shape=(img_height, 
                                                              img_width,
                                                              3)),
    layers.experimental.preprocessing.RandomRotation(0.1),
    layers.experimental.preprocessing.RandomZoom(0.1),
  ]
)

型号:

model = Sequential([
  data_augmentation,
  layers.experimental.preprocessing.Rescaling(1./255),
  layers.Conv2D(16, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(64, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Dropout(0.3),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])

模型总结:

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
sequential_1 (Sequential)    (None, 224, 224, 3)       0         
_________________________________________________________________
rescaling_2 (Rescaling)      (None, 224, 224, 3)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 224, 224, 16)      448       
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 112, 112, 16)      0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 112, 112, 32)      4640      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 56, 56, 32)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 56, 56, 64)        18496     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 28, 28, 64)        0         
_________________________________________________________________
dropout (Dropout)            (None, 28, 28, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 50176)             0         
_________________________________________________________________
dense_2 (Dense)              (None, 128)               6422656   
_________________________________________________________________
dense_3 (Dense)              (None, 101)               13029     
=================================================================
Total params: 6,459,269
Trainable params: 6,459,269
Non-trainable params: 0
_________________________________________________________________

训练 250 轮后的结果

Epoch 250/250
121/121 [==============================] - 3s 25ms/step - loss: 0.2564 - accuracy: 0.9270 - val_loss: 17.6184 - val_accuracy: 0.1202

我还可以使用哪些其他技术来提高模型的准确性?

更新:我按照 Gerry P 的建议编辑了最后一个密集层以使用 softmax 激活。 1250 个 epoch 的训练结果显示训练准确度增加较慢,验证准确度增加约 5-6%。这改进了我的模型,但准确度仍然很低。

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    对于最后一个密集层,将其更改为

    layers.Dense(num_classes, activation='softmax')
    

    model.compile()使用

    loss='categorical_crossentropy' 
    

    如果您的标签是热编码的。如果它们是整数,则使用

    loss='sparse_categorical_crossentropy'
    

    【讨论】:

    • 感谢您的建议!我研究了 softmax 函数并将其应用到我的模型中,以进行 100 个训练周期的测试。训练准确度的增加要慢得多,并且验证准确度似乎有更好的提高,每当模型训练不同的类时,偶尔会出现“下降”。我会做 1000 个 epoch 并在完成后更新你。
    • “当模型训练不同的类时”是什么意思?您是否对一个班级的所有样本进行培训,然后转到下一个班级?这绝对应该是随机的。
    • 对不起,它实际上是随机的。我的意思是,因为验证准确性每隔一段时间就会降低,我只能假设训练的时期包含更多尚未训练/足够的类的样本,从而导致准确性降低。它最终会在一段时间后恢复
    猜你喜欢
    • 2020-03-23
    • 2020-08-12
    • 2022-01-10
    • 2020-12-10
    • 2021-08-28
    • 2020-01-06
    • 2020-02-01
    • 2019-08-11
    • 2020-08-26
    相关资源
    最近更新 更多