我正在尝试使用人工神经网络对技术流程(许多非线性方程)进行建模。该函数有多个输入和多个输出(例如 50 个输入,150 个输出 - 均为 float )。
我已经尝试过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 的功能。因此,我想切换到不同的框架,并选择带有 TensorFlow 的 keras 作为后端。
我尝试对以前的配置进行建模:
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'])
然而,结果要差得多,经过几千 (!) 个 epoch 的训练,误差高达 0.5%。 ffnet 训练在 292 个 epoch 时自动取消。此外,网络响应和验证目标之间的差异并不以 0 为中心,而是大多为负值。 我已经尝试了所有优化器和不同的损失函数。我还跳过了 BatchNormalization 并以与 ffnet 相同的方式手动标准化数据。没有任何帮助。
有人有关于使用 keras 获得更好结果的建议吗?
最佳答案
我知道您正在尝试使用不同的库从头开始重新训练相同的架构。这里要记住的第一个基本问题是神经网络 are not necessarily reproducible ,当权重随机初始化时。
例如,以下是 Keras 中 Dense
的默认构造函数参数:
init='glorot_uniform'
但即使在尝试评估 Keras 优化的收敛性之前,我也建议尝试将您获得良好结果的权重从 ffnet 移植到您的 Keras 模型中。您可以使用每层的 kwarg Dense(..., Weights=
) 来执行此操作,也可以在末尾进行全局 model.set_weights(... )
使用相同的权重必须在两个库之间产生完全相同的结果。除非您遇到一些浮点舍入问题。我相信,只要移植的权重不一致,进行优化就不太可能有帮助。
关于python - 使用不同的人工神经网络框架(ffnet、tensorflow)复制结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39993598/