我最初做的是使用神经网络对一些波浪数据进行分类。在这个问题中,我有一个大小约为 200 的向量,类数为 256。但是,损失永远不会减少。
所以,我想,波浪只是标签呢?
$wave_i(x) = N(i/256.0, (1/10000)^2)$
,将标记为i
,例如N代表正态分布。对于非常小的类(class),例如 32 或 64,神经网络效果很好,并且学习速度很快。
当我把它带到
classes = 256
时但学习速度却慢得让人难以忍受,甚至根本学不到。我使用的模型非常简单。我认为这甚至足以记住输入和输出之间的关系。 (为什么?你可以很容易地构建一个当
abs(input - const) < eps
时输出 1 的单元。)model = Sequential([ Dense(classes, input_dim=200), Activation('sigmoid'), Dense(classes * 2), Activation('sigmoid'), Dense(classes), Activation('softmax'), ])
然后,我向其提供批量大小为 256 的数据,每个不同的标 checkout 现一次。
结果是,损失达到
2.xxxx
并达到0.07
2500 epoch 后,3000 epoch 后停止变化。 (从0.09
到0.1
左右)
我知道更多的变量需要更多的时间来学习。然而,很明显,所有单个输出单元都应该轻松地减少它们与其他单元之间的关系(我有非常不同的输入集)。
def generator():
while 1:
data = [numpy.random.normal(i/255.0,1/10000.0,225).tolist() for i in range(0, classes)]
labels = to_categorical([i for i in range(0, classes)], classes)
yield (data,labels)
最佳答案
当输入和输出之间的关系非常简单时(例如您正在探索的关系),那么这可能无法发挥神经网络的优势,神经网络足够灵活,可以适应任何功能,但很少能做到完美。当您有一个简单的函数时,您可能会发现您会发现神经网络拟合中的缺陷,而神经网络以外的模型会做得更好。
您可能会做一些事情来获得更好的配合(大致按照我会尝试的事情的顺序):
尝试不同的优化器。你没有说你正在使用哪个优化器,而是 Keras library comes with a few choices .
神经网络在针对已标准化的输入特征进行训练和预测时效果更好。有效的选择是平均值 0,标准差 1。在您的情况下,如果您在训练和测试时预处理每个批处理,如下所示:
data = (data - 0.5)/0.289
,它可能帮助。增加隐藏层中的神经元数量,和/或更改激活函数。这里理想的激活函数甚至可能是高斯函数(因此单个神经元可以立即调整到每个类别),但这不是您通常在神经网络库中找到的东西。也考虑放弃中间层,然后只用例如Softmax* 之前单个隐藏层中的
8*class
个神经元。从生成器中的输入示例中采样,而不是每次从每个类中计算一个。生成器可能太规则了 - 我已经看到经典的 xor 示例网络在重复输入相同的输入时以与您的描述类似的方式陷入困境。
* 更简单的网络模型如下所示:
model = Sequential([
Dense(classes * 8, input_dim=200),
Activation('sigmoid'),
Dense(classes),
Activation('softmax'),
])
关于python - 是什么让神经网络学习 x/256 的类别是 x 的分类器如此困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40319172/