【发布时间】:2020-03-23 12:19:32
【问题描述】:
首先:我是 TensorFlow(版本 2)的初学者。我通过阅读学到了很多东西。但是,我似乎没有找到以下问题的答案。
我正在尝试构建一个模型,用于将图像分类为三个标签。 正如您在下面的图表中看到的,我的训练准确度还不错,但验证准确度太低了。
据我了解,这可能是一个“过度拟合”问题。
也许我会先解释一下我要做什么:
我想使用图像作为输入。作为输出,我希望接收属于这些图像的零个或多个标签(分类器)。 我期待这将是一项简单的任务,因为输入图像很简单。 (只有两种颜色,只有 0、1、2 或 3 个可能的“标签”。 以下是图像的一些示例。它们是田野(以蓝色多边形为界)上的步行轨迹(绿色)的表示:
可能的标签有:
- 十字:(前 2 张图片):您可以清楚地看到绿线正在形成一个或多个“十字”
- zig-zag:(第三张图片):不完全确定这是否是正确的英文术语,但我想你明白了 ;-)
- 行:绿线大多是平行线(没有锯齿形,也没有交叉)
- 以上都不是(不知道这是否需要标签)
我正在使用以下模型:
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 张作为验证数据集。 这些已经“增强”,因此这些集合包含其他现有图像的已旋转和镜像版本。
也许值得一提的是数据集是不平衡的:80% 的图像确实包含标签“cross”,而另外 20% 被“zig-zag”和“rows”覆盖。
任何人都可以指导我如何改进我的模型?
【问题讨论】:
-
您可以尝试更高的辍学率。另外,我坚持使用
tf.keras.layers.LeakyReLU层。 -
使用较高的 Dropout 率不会提高验证准确性。使用 LeakyReLU 似乎不起作用:给出错误:对象没有属性“形状”
标签: tensorflow google-colaboratory tensorflow2.0