【发布时间】:2016-04-15 06:06:06
【问题描述】:
我正在开发一个神经网络系统来执行SED fitting,作为西澳大利亚大学学生项目的一部分。
我通过称为MAGPHYS 的 SED 拟合程序创建了一组大约 20,000 次运行。每次运行都有我们感兴趣的 42 个输入值和 32 个输出值(系统有更多输出,但我们不需要它们)
我一直在尝试使用 Keras 神经网络包,以便创建一个网络来学习此功能。
我当前的网络设计使用 4 个完全互连的隐藏层,每层之间有 30 个连接。每一层都使用 TanH 激活函数。我还有一个 42 维输入层和 32 维输出层,都使用 TanH 激活,总共 6 层。
model = Sequential()
loss = 'mse'
optimiser = SGD(lr=0.01, momentum=0.0, decay=0, nesterov=True)
model.add(Dense(output_dim=30, input_dim=42, init='glorot_uniform', activation='tanh'))
for i in range(0, 4):
model.add(Dense(output_dim=30, input_dim=30, init='glorot_uniform', activation='tanh'))
model.add(Dense(output_dim=32, input_dim=30, init='glorot_uniform', activation='tanh'))
model.compile(loss=loss, optimizer=optimiser)
我一直在使用输入和输出数据的最小/最大归一化来压缩 0 到 1 之间的所有值。我正在使用随机梯度下降优化器,并且我已经尝试了各种损失函数,例如均方误差、平均绝对误差、平均绝对百分比误差等。
主要问题是,无论我如何构建我的网络,它只会生成大约所有训练输出值的平均值的输出值。实际上正确地学习了该函数,它只是生成平均值附近的值。更糟糕的是,我尝试过的一些网络设计,尤其是那些使用线性激活函数的网络设计,只会生成输出值的平均值,并且根本不会发生变化。
示例(针对 32 个输出之一):
Output Correct
9.42609868658 = 9.647
9.26345946681 = 9.487
9.43403506231 = 9.522
9.35685760748 = 9.792
9.20564885211 = 9.287
9.39240577382 = 8.002
请注意所有输出都在 9.2 - 9.4 值附近,即使这些值非常不正确。
考虑到所有这些,是什么原因导致像我这样的网络产生这些都在平均水平附近的输出?
我可以尝试哪些方法来解决这个问题并创建某种网络来实际生成正确的输出?
【问题讨论】:
-
这种行为的常见原因是特征没有意义。他们基本上不解释你的数据。这实际上并不少见。然而,在大多数情况下,如果观察到这主要是由于预处理错误。你试过吗?更简单,例如,建立一个线性模型(如果它工作你错误地使用了神经网络库),而不是规范化数据以避免这种影响。此外,您可以尝试在输入中包含输出。
-
看起来它陷入了局部最小值。当我将 BP NN 应用于我使用任意编码的一组数据时,我遇到了这个问题。看看这个 - 它可能会帮助你指出正确的方向......homepages.inf.ed.ac.uk/pseries/CCN09/CCN-wk8-1.pdf(有一个关于陷入局部最小值的部分)
-
@CAFEBABE 所以不知何故网络无法在输入和输出之间找到任何有意义的连接?据我所知,必须有一个,因为这些相同的输入可以通过 MAGPHYS 程序运行以产生有效的输出。
-
@S.Foster:当然。最简单的事情是预处理中的错误。我遇到过这样的问题,通常对我自己来说都是非常小的问题。我想到的第二个问题是,行(训练示例)之间可能存在依赖关系,例如 t |-> f(t-1)+t。这将需要一些循环结构。但是,我不太了解 SED 域。但是,局部最小值的解释对我来说实际上也很合理。
-
@CAFEBABE 你能发布你的 cmets 作为答案吗?
标签: python machine-learning neural-network keras