训练神经网络进行回归总是可以预测均值


9

我正在训练一个简单的卷积神经网络进行回归,其中的任务是预测图像中盒子的(x,y)位置,例如:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

网络的输出有两个节点,一个用于x,一个用于y。网络的其余部分是标准的卷积神经网络。损失是盒子的预测位置和地面真实位置之间的标准均方误差。我正在训练10000张这些图像,并在2000年进行验证。

我的问题是,即使经过大量培训,损失也不会真正减少。观察网络的输出后,我注意到对于两个输出节点,网络都倾向于输出接近零的值。这样,盒子位置的预测始终是图像的中心。预测中存在一些偏差,但始终在零附近。下面显示了损失:

在此处输入图片说明

我已经运行了比此图所示更多的时期,并且损失仍然从未减少。有趣的是,损失实际上增加了一点。

因此,似乎网络只是在预测训练数据的平均值,而不是学习合适的数据。关于这可能是什么的任何想法?我使用Adam作为优化器,初始学习率为0.01,并将relus作为激活


如果您对我的某些代码(Keras)感兴趣,请参见以下代码:

# Create the model
model = Sequential()
model.add(Convolution2D(32, 5, 5, border_mode='same', subsample=(2, 2), activation='relu', input_shape=(3, image_width, image_height)))
model.add(Convolution2D(64, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Convolution2D(128, 5, 5, border_mode='same', subsample=(2, 2), activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(2, activation='linear'))


# Compile the model
adam = Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


# Fit the model
model.fit(images, targets, batch_size=128, nb_epoch=1000, verbose=1, callbacks=[plot_callback], validation_split=0.2, shuffle=True)

图像是否在您的实际样品的最佳示例中?那是5个单独的样本吗?图像中似乎没有信息可以帮助推广。我的意思是,您不需要神经网络即可找到白色正方形的x,y位置,只需解析图像并寻找白色像素即可。进一步说明您对该模型的愿景。是否存在一些时间模式,您可以据此预测下一个位置?
photox

嗨,是的,这些图像是5个单独的样本。我不确定它们如何为您呈现,但是它们应该是5张独立的正方形图像(我对布局做了一些更改以帮助...)。是的,我意识到您不需要神经网络来完成此任务,但这只是一个测试实验,可以帮助我学习如何使用神经网络进行回归。我不了解您的意思,因为没有任何信息可以帮助概括...。每个训练对包括一个正方形图像和一个正方形(x,y)位置的二维向量。谢谢:)
Karnivaurus

1
1)您在第一个转换层上的输入形状使用3(rbg)通道,但是您的数据是灰度(1通道)2)您不需要那么多的转换层和过滤器,实际上我认为是一个层,并且少数几个小内核就可以了。
photox

您确定图像确实符合目标吗?
user31264 '17

1
就像@photox所说,您不需要conv层。添加这些使优化器很难找到一个好的解决方案。如果删除3个转换层,我怀疑您的“模型”将起作用。
Pieter

Answers:


9

优化器无法收敛到(次)最优解决方案。为什么?您的问题太容易和/或模型太复杂。

太简单的问题

正如@photox已经说过的那样,仅使用一个隐藏层即可解决此问题。我什至怀疑没有隐藏层也可以做到。那是因为这个问题是线性可分离的

让我说明一下。想象一下没有隐藏层和线性激活函数的神经网络(您也可以称其为线性回归)。为了计算正方形的x位置,每个像素都连接到x输出。第一列像素与权重。第二列与权重。这一直持续到与权重连接的最后一列(例如,列)。由于2 /高度宽度n n /高度宽度高度宽度1/height/width2/heightwidthnn/heightwidthheightwidth像素不为零(例如,偏置等于灰度值),x输出的激活等于正方形的中心。因此,线性函数可以计算正方形的位置。

有几种解决方案:

  • 选择一个较难的问题,例如图像分类
  • 添加噪音,例如盐和胡椒粉白噪声
  • 使问题更难解决,例如,当背景中有许多不同颜色的圆圈时,通过预测一个红色正方形的位置

过于复杂的模型

您的模型有几个部分,这些部分增加了很多复杂性,同时又不帮助优化器找到最佳选择。

例如,卷积层。第一层具有大小为 32个卷积滤波器。您希望这些过滤器学到什么?在图像分类中,这些滤镜学会检测边缘,拐角,渐变和斑点。但是在这种情况下,只有少数几个有意义的过滤器。我可以从左到右,从上到下,反之亦然。因此,根据您的情况,大约有28个滤波器只会增加随机噪声。删除这些(或仅删除整个层)可使优化程序更容易找到有效的最优值。5×5

另一个示例是具有许多额外参数的Adam优化器。Adam优化器可能与这些参数配合使用很好,但是为什么不从一个SGD带有默认值的简单优化器开始呢?

因此,您可以进行一些优化:

  • 使用LinearRegressionscikit-learn。好的,这不是您想要的,但我只是想说明一下此模型有多复杂。
  • 删除转换层
  • 减小隐藏Dense层的大小
  • 使用默认的SGD优化器
  • 如果您使用隐藏层,则应尝试sigmoid激活。您可以将隐藏层的每个节点视为检测正方形是否在特定位置。
  • 如果这一切都不起作用,请对学习率进行一些试验,以了解学习率是否太高或太低。

聚苯乙烯

我认为您会喜欢Adit Deshpande的这篇博文


让我知道这些解决方案是否确实改变了优化程序的行为。
Pieter

谢谢,这非常有用。我正在努力尝试您的建议。但是,我不明白您的第一点。我很困惑为什么,如果问题太简单了,那么比更复杂的问题更难优化。对于给定的网络,为什么较简单的问题比较复杂的问题难于优化?在一个简单的问题中,我会想到会有非常强的梯度和强大的全局最优值。但您的第一点说,问题的简单性使优化变得困难,这表明更复杂的问题将有助于优化……
Karnivaurus

0

它看起来像一个典型的过拟合问题。您的数据没有提供足够的信息来获得更好的结果。您在训练中选择复杂的 NN,以记住火车数据的所有细微差别。损失永远不会为零,就像在图表上一样。顺便说一句,您的验证似乎有错误,或者验证集不利于验证,因为验证损失也为零。


4
问题是网络几乎总是输出零。这将是严重的情况下欠拟合,而不是过度拟合。在学习曲线上的训练和验证错误之间也没有差距,表明过度拟合不是问题(错误不是零,标度是对数的)
user20160

0

我的数据集面临同样的问题。事实证明,在我的情况下,预测变量高度集中,差异很小。您应该检查预测变量的方差,并查看其分布方式。我试图预测的变量分布

但是,可以对输出变量进行一些转换以修改或更改其比例。这可能导致更均匀的类型分布。例如,在图像识别任务中,直方图均衡或对比度增强有时会有助于正确的决策。


-1

我实际上正在处理一个非常类似的问题。基本上,我在白色背景上有一堆点,并且正在训练NN来识别首先放在背景上的点。我发现工作的方法是只使用一层完全连接的神经元(即1层NN)。例如,对于100x100的图像,我将有10,000个输入神经元(像素)直接连接到2个输出神经元(坐标)。在PyTorch中,当我将像素值转换为张量时,它会通过减去平均值并除以标准偏差来自动归一化我的数据。在正常的机器学习问题中,这很好,但是对于图像中的彩色像素数量可能存在差异的图像(即,您的像素只有几个白色像素)而言,这不是很好。所以,我通过将所有像素强度值除以255进行了手动归一化处理(因此,如果没有典型的归一化技术尝试将所有强度值拟合为正态分布,它们现在处于0-1的范围内)。然后,我仍然遇到问题,因为它正在预测训练集中像素的平均坐标。因此,我的解决方案是将学习率设置得很高,这几乎与所有ML讲师和教程都背道而驰。就像大多数人所说的那样,我没有使用1e-3、1e-4、1e-5,而是使用了随机梯度下降的学习率1或0.1。这解决了我的问题,我的网络终于学会了记住我的训练集。它不能很好地推广到测试集,但是至少它在某种程度上可行,这比大多数其他人在您的问题上建议的方法要好。现在没有使用试图将所有强度值拟合为正态分布的典型归一化技术的0-1范围内)。然后,我仍然遇到问题,因为它正在预测训练集中像素的平均坐标。因此,我的解决方案是将学习率设置得很高,这几乎与所有ML讲师和教程都背道而驰。就像大多数人所说的那样,我没有使用1e-3、1e-4、1e-5,而是使用了随机梯度下降的学习率1或0.1。这解决了我的问题,我的网络终于学会了记住我的训练集。它不能很好地推广到测试集,但是至少它在某种程度上可行,这比大多数其他人在您的问题上建议的方法要好。现在没有使用试图将所有强度值拟合为正态分布的典型归一化技术的0-1范围内)。然后,我仍然遇到问题,因为它正在预测训练集中像素的平均坐标。因此,我的解决方案是将学习率设置得很高,这几乎与所有ML讲师和教程都背道而驰。就像大多数人说的那样,我没有使用1e-3、1e-4、1e-5,而是使用了随机梯度下降的学习率1或0.1。这解决了我的问题,我的网络终于学会了记住我的训练集。它不能很好地推广到测试集,但是至少它在某种程度上可行,这比大多数其他人在您的问题上建议的方法要好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.