如何改进模型以防止过度拟合非常简单的图像分类
How to improve model to prevent overfitting for very simple image classification
首先:我是 TensorFlow(版本 2)的初学者。我通过阅读学到了很多东西。但是,我似乎没有找到以下问题的答案。
我正在尝试构建一个模型,用于将图像分类为三个标签。
正如您在下图中看到的,我的训练准确度还不错,但验证准确度太低了。
据我了解,这可能是一个 'overfitting' 问题。
也许我会先解释一下我要做什么:
我想使用图像作为输入。作为输出,我希望接收属于这些图像的零个或多个标签(分类器)。
我原以为这会是一件容易的事,因为输入图像很简单。 (只有两种颜色,并且只有 0、1、2 或 3 种可能 'labels'。
以下是一些图像示例。它们代表田野上的步行轨迹(绿色)(以蓝色多边形为界):
可能的标签是:
- 交叉:(前 2 张图片):您可以清楚地看到绿线正在形成一条或多条 'crosses'
- zig-zag:(第三张图片):不确定这在英语中是否正确,但我想你明白了;-)
- 行数:绿线多为平行线(无曲折,无交叉)
- 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')
.
我不知道为什么它在训练期间不会给你任何错误,但你还应该检查你向网络提供输入和标签的方式。
首先:我是 TensorFlow(版本 2)的初学者。我通过阅读学到了很多东西。但是,我似乎没有找到以下问题的答案。
我正在尝试构建一个模型,用于将图像分类为三个标签。 正如您在下图中看到的,我的训练准确度还不错,但验证准确度太低了。
据我了解,这可能是一个 'overfitting' 问题。
也许我会先解释一下我要做什么:
我想使用图像作为输入。作为输出,我希望接收属于这些图像的零个或多个标签(分类器)。 我原以为这会是一件容易的事,因为输入图像很简单。 (只有两种颜色,并且只有 0、1、2 或 3 种可能 'labels'。 以下是一些图像示例。它们代表田野上的步行轨迹(绿色)(以蓝色多边形为界):
可能的标签是:
- 交叉:(前 2 张图片):您可以清楚地看到绿线正在形成一条或多条 'crosses'
- zig-zag:(第三张图片):不确定这在英语中是否正确,但我想你明白了;-)
- 行数:绿线多为平行线(无曲折,无交叉)
- 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')
.
我不知道为什么它在训练期间不会给你任何错误,但你还应该检查你向网络提供输入和标签的方式。