我试图用人工神经网络建模技术过程(一些非线性方程)。该功能有许多输入和多个输出(例如50个输入,150个输出 - 所有浮点数)。
我已经尝试了python library ffnet(fortran库的包装器)并取得了巨大的成功。某个数据集的误差远低于0.2%。
它使用完全连接的图表和这些附加参数。
Basic assumptions and limitations:
Network has feed-forward architecture.
Input units have identity activation function, all other units have sigmoid activation function.
Provided data are automatically normalized, both input and output, with a linear mapping to the range (0.15, 0.85). Each input and output is treated separately (i.e. linear map is unique for each input and output).
Function minimized during training is a sum of squared errors of each output for each training pattern.
我使用一个输入层,一个隐藏层(大小:输入向量的2/3 +输出向量的大小)和输出层。我正在使用scipy共轭梯度优化器。
ffnet的缺点是培训时间长,缺乏使用GPU的功能。因此,我想切换到另一个框架,并选择 keras with TensorFlow 作为后端。
我尝试过模拟以前的配置:
model = Sequential()
model.add(Dense(n_hidden, input_dim=n_in))
model.add(BatchNormalization())
model.add(Dense(n_hidden))
model.add(Activation('sigmoid'))
model.add(Dense(n_out))
model.add(Activation('sigmoid'))
model.summary()
model.compile(loss='mean_squared_error',
optimizer='Adamax',
metrics=['accuracy'])
然而结果更糟糕,在几千(!)个训练时期,误差高达0.5%。 ffnet培训在292个时期自动取消。此外,网络响应和验证目标之间的差异不是以0为中心,而是以负数为中心。 我已经尝试了所有优化器和不同的损失函数。我也跳过了BatchNormalization,并以与ffnet相同的方式手动规范化数据。什么都没有帮助。
是否有人建议使用keras获得更好的结果?
答案 0 :(得分:1)
我知道您正在尝试从头开始重新训练相同的架构,使用不同的库。这里要记住的第一个基本问题是神经网are not necessarily reproducible,当权重随机初始化时。
例如,以下是Keras中Dense
的默认构造函数参数:
init='glorot_uniform'
但是,在尝试评估Keras优化的收敛性之前,我建议尝试将从ffnet获得良好结果的权重移植到Keras模型中。您可以使用每个图层的 kwarg Dense(..., weights=
)执行此操作,也可以在结尾处全局model.set_weights(...)
使用相同的权重必须在两个库之间产生完全相同的结果。除非你遇到一些浮点问题。我相信只要移植权重不一致,优化工作就不太可能有所帮助。