我正在训练一个分类器,它接受RGB输入(三个0到255的值),并返回黑色或白色(0或1)的字体与该颜色最匹配。训练后,我的分类器总是返回0.5(或大致如此),并且从未比这更准确。
代码如下:
...
如您所见,我首先导入了将要使用的模块。接下来,我生成了输入x数据集和期望的输出y数据集。x_train数据集由10000个随机的RGB值组成,而y_train数据集由0和1组成,1对应于平均值低于128的RGB值,0对应于平均值高于128的RGB值(这确保了亮背景使用深色字体,反之亦然)。
我的神经网络承认有点过于复杂(至少我认为如此),但据我所知,它是一个相当标准的前馈网络,使用Adadelta优化器和默认的学习率。
据我有限的知识,网络的训练是正常的,但无论如何,模型总是输出0.5。
代码的最后一块允许用户输入值并查看它们在传入神经网络后会变成什么样。
我尝试过不同的激活函数、损失函数、初始化偏差的方法等,但都没有效果。有时当我调整代码时,模型总是返回1或0,但这与总是返回0.5一样不准确。我在网上找不到解决这个问题的方法。欢迎任何建议或建议。
编辑:
在训练过程中,损失、权重、偏差和输出变化不大(权重和偏差每1000次迭代仅变化几百分之一和千分之一,损失在0.3左右波动)。此外,输出有时会根据输入变化(如您所期望的),但有时是恒定的。一次运行程序导致输出恒定为0.7,而另一次总是返回0.5,除了非常接近零的地方,返回0.3或0.4类型的值。上述两种情况都不是期望的输出。应该发生的情况是,(255, 255, 255)应该映射到0,(0, 0, 0)应该映射到1,(128, 128, 128)应该映射到1或0,因为在中间字体颜色并不重要。
回答:
最大的问题是您在分类问题上使用了均方误差作为损失函数。交叉熵损失函数更适合这种类型的问题。
这是交叉熵损失函数与均方误差损失函数之间差异的可视化:
注意,当模型越来越远离正确预测(在这种情况下为1)时,损失如何渐进增加。这种曲率在反向传播过程中提供了更强的梯度信号,同时也满足了许多重要的理论概率分布距离(散度)属性。通过最小化交叉熵损失,您实际上也在最小化模型预测分布与训练数据标签分布之间的KL散度。您可以在此处阅读更多关于交叉熵损失函数的信息:http://colah.github.io/posts/2015-09-Visual-Information/
我还调整了一些其他东西以使代码更好,并使模型更易于修改。这应该能解决您所有的问题:
...
我用注释记录了我的更改,如果您有任何问题,请告诉我!我在这端运行了它,效果完美:
...