首页 文章

关键点模型的过度拟合问题(检测手腕,肘部,肩部等)

提问于
浏览
1

我'm building a model to detect keypoints of body parts. To do that I'm使用COCO数据集(http://cocodataset.org/#download) . 我遇到了过度拟合的问题(训练损失收敛,但我很早就达到了上限,以便测试失败) . 在模型中,我尝试添加辍学图层(逐渐添加更多具有更高概率的图层,但是当训练损失停止减少时,我很快就达到了一个点,这同样糟糕. My theory is that the model I use isn't complex enough but I'd like to know if that's the likely reason or if it could be something else. The models I've found online are all extremely deep (30+ layers).

Data

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

Targets

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

Model

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))

2 回答

  • 0

    你的理论

    我使用的模型不够复杂

    这是一个很好的理论,模型非常简单,并且鉴于我们并不确切知道你有多大的过度拟合,过度拟合似乎可能是因为模型的复杂性 .

    在模型中,我尝试添加辍学层

    可能是一个简单但有效的方法,使模型更复杂,但此外,我似乎你有一个0.1的丢失,尝试0.5例如,并比较过度拟合减少 .

    无论如何,我认为你可以尝试的最好的是模型的 incrementing the complexity ,但是在 convolution part 中,不仅仅是在Flatten之后添加Dense图层 . 如果你看起来很难,我建议找到一些用于图像识别的卷积神经网络的预构建通用架构,或者甚至是针对你的类似问题的更具体的构建 .

    告诉我们它是怎么回事!

  • 0

    除了在答案中已经说过:

    • 您可以拥有几个具有不同概率的 Dropout 层,例如在汇集层之后 . 早期层通常具有较高的保持概率,因为它们使用较少的过滤器 .

    • Image data augmentation是另一种推广方式,根据我的经验,它总是能够改善结果,至少是略微改善(当然,只要输入转换不严重) .

    • Batch normalization(及其后继者,weight normalizationlayer normalization)是一种现代正则化方法,可以减少所需的辍学强度,有时甚至可以完全消除辍学层 . 此外,batchnorm改进了激活统计,这通常使网络学得更快 . 除了辍学之外我还用它,效果很好 .

    • 称为缩放指数线性单位(SELU)的技术已经published very recently,据说具有隐式自标准化属性 . 在keras中甚至是already implemented .

    • 良好的旧L2或L1正规化器仍在使用中 . 如果没有其他帮助,请考虑添加它 . 但我很确定batchnorm,selu和少量辍学层就足够了 .

相关问题