【问题标题】:Overfitting problems for key points model (detecting wrists, elbows, shoulders, etc.)关键点模型的过拟合问题(检测手腕、肘部、肩膀等)
【发布时间】:2017-10-08 22:18:10
【问题描述】:

我正在构建一个模型来检测身体部位的关键点。为此,我使用了 COCO 数据集 (http://cocodataset.org/#download)。我试图理解为什么我会遇到过度拟合的问题(训练损失收敛,但我很早就达到了测试损失的上限)。在模型中,我尝试添加 dropout 层(逐渐添加更多具有更高概率的层,但我很快就达到了训练损失停止减少的程度,这同样糟糕。我的理论是我使用的模型不够复杂,但我想知道这是可能的原因还是其他原因。我在网上找到的模型都非常深(30 层以上)。

数据

我正在使用 10,000 张 RGB 图像,每张图像中都有一个人。它们每个都有不同的尺寸,但最大长度和宽度为 640。作为预处理步骤,我通过用 (0,0,0) 或黑色填充任何额外区域(图像的底部和右侧)使每个图像的大小为 640x640。

目标

完整的数据集有很多关键点,但我只对右肩、右肘和右手腕感兴趣。每个身体部位都有 2 个关键点(X 坐标和 Y 坐标),所以我的目标是长度为 6 的列表。

型号

activation_function = 'relu'
batch_size = 16  # ##
epoch_count = 40  # ##
loss_function = 'mean_squared_error'
opt = 'adam'

model = Sequential()
model.add(Conv2D(filters=16, kernel_size=(3, 3), input_shape=inp_shape))
# model.add(Conv2D(filters=16, kernel_size=(3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=32, kernel_size=(3, 3)))
# model.add(Conv2D(filters=32, kernel_size=(3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(300, activation=activation_function))
model.add(Dropout(rate=0.1))
model.add(Dense(300, activation=activation_function))
model.add(Dense(num_targets))
model.summary()
model.compile(loss=loss_function, optimizer=opt)
hist = model.fit(x_train, y_train, batch_size=batch_size, epochs=epoch_count,
                 verbose=verbose_level,
                 validation_data=(x_valid, y_valid))

【问题讨论】:

  • 遇到同样的问题,你解决了吗?

标签: neural-network keras conv-neural-network keypoint


【解决方案1】:

你的理论

我使用的模型不够复杂

这是一个很好的理论,模型非常简单,而且鉴于我们不知道您究竟遭受了多少过拟合,过拟合似乎是由于模型的复杂性造成的。

在模型中,我尝试添加 dropout 层

可能是使模型更复杂一点的简单但有效的方法,但此外,我会提高 dropout 率。您的 dropout 似乎为 0.1,例如尝试 0.5 并比较过拟合是否减少。

无论如何,我认为您可以尝试的最好方法是增加模型的复杂性,但在卷积部分,而不仅仅是添加Dense Flatten 之后的图层。如果您觉得很难,我建议为图像识别的卷积神经网络找到一些预构建的通用架构,或者针对与您类似的问题甚至更具体的构建。

告诉我们进展如何!

【讨论】:

    【解决方案2】:

    除了答案中已经说过的:

    • 您可以拥有多个具有不同概率的Dropout 层,例如在池化层之后。早期层通常具有较高的保留概率,因为它们使用的过滤器较少。
    • Image data augmentation 是另一种泛化方法,根据我的经验,它总能改善结果,至少是轻微的(当然,前提是输入转换不严重)。
    • Batch normalization(及其后继者,weight normalizationlayer normalization)是一种现代正则化方法,可以降低所需的 dropout 强度,有时甚至完全降低,即您可以摆脱 dropout 层。此外,batchnorm 改进了激活统计,这通常使网络学习得更快。除了 dropout 之外,我还使用了它,效果很好。
    • published very recently 是一种称为缩放指数线性单位 (SELU) 的技术,据说它具有隐式的自归一化特性。甚至是 keras 中的 already implemented
    • 旧的 L2 或 L1 正则化器仍在使用中。如果没有其他帮助,请考虑添加它。但我很确定,batchnorm、selu 和几个 dropout 层就足够了。

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多