如何改进模型以防止过度拟合非常简单的图像分类

How to improve model to prevent overfitting for very simple image classification

首先:我是 TensorFlow(版本 2)的初学者。我通过阅读学到了很多东西。但是,我似乎没有找到以下问题的答案。

我正在尝试构建一个模型,用于将图像分类为三个标签。 正如您在下图中看到的,我的训练准确度还不错,但验证准确度太低了。

据我了解,这可能是一个 'overfitting' 问题。

也许我会先解释一下我要做什么:

我想使用图像作为输入。作为输出,我希望接收属于这些图像的零个或多个标签(分类器)。 我原以为这会是一件容易的事,因为输入图像很简单。 (只有两种颜色,并且只有 0、1、2 或 3 种可能 'labels'。 以下是一些图像示例。它们代表田野上的步行轨迹(绿色)(以蓝色多边形为界):

可能的标签是:

  1. 交叉:(前 2 张图片):您可以清楚地看到绿线正在形成一条或多条 'crosses'
  2. zig-zag:(第三张图片):不确定这在英语中是否正确,但我想你明白了;-)
  3. 行数:绿线多为平行线(无曲折,无交叉)
  4. none 以上(不知道这个是否需要标注)

我正在使用以下模型:

batch_size = 128
epochs = 30
IMG_HEIGHT = 150
IMG_WIDTH = 150

model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', 
           input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Dropout(0.2),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Dropout(0.2),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(1, activation='sigmoid')
])



model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])


model.summary()

Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_15 (Conv2D)           (None, 150, 150, 16)      448       
_________________________________________________________________
max_pooling2d_15 (MaxPooling (None, 75, 75, 16)        0         
_________________________________________________________________
dropout_10 (Dropout)         (None, 75, 75, 16)        0         
_________________________________________________________________
conv2d_16 (Conv2D)           (None, 75, 75, 32)        4640      
_________________________________________________________________
max_pooling2d_16 (MaxPooling (None, 37, 37, 32)        0         
_________________________________________________________________
conv2d_17 (Conv2D)           (None, 37, 37, 64)        18496     
_________________________________________________________________
max_pooling2d_17 (MaxPooling (None, 18, 18, 64)        0         
_________________________________________________________________
dropout_11 (Dropout)         (None, 18, 18, 64)        0         
_________________________________________________________________
flatten_5 (Flatten)          (None, 20736)             0         
_________________________________________________________________
dense_10 (Dense)             (None, 512)               10617344  
_________________________________________________________________
dense_11 (Dense)             (None, 3)                 1539      
=================================================================
Total params: 10,642,467
Trainable params: 10,642,467
Non-trainable params: 0

我使用 3360 张图像作为训练数据集,使用 496 张图像作为验证数据集。 这些已经 'augmented',因此这些集合包含其他现有图像的已旋转和镜像版本。

也许值得一提的是数据集是不平衡的:80% 的图像确实包含标签 'cross',而另外 20% 被 'zig-zag' 和 [=53= 覆盖].

任何人都可以指导我如何改进我的模型?

您希望网络输出 3 个可能的标签,这样您模型中的最后一层应该能够做到这一点。实际上,您可以将其更改为 Dense(3, activation='sigmoid').

我不知道为什么它在训练期间不会给你任何错误,但你还应该检查你向网络提供输入和标签的方式。