我正在研究神经网络系统来执行SED拟合,作为西澳大利亚大学学生项目的一部分.
我通过称为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)
Run Code Online (Sandbox Code Playgroud)
我一直在使用输入和输出数据的最小/最大标准化来压缩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
Run Code Online (Sandbox Code Playgroud)
注意所有输出都在9.2 - 9.4值附近,即使这些值非常不正确.
考虑到所有这一切,是什么导致像我这样的网络产生这些类似的平均输出?
我可以尝试采取哪些措施来解决这个问题并创建某种网络来实际生成正确的输出?