【发布时间】:2018-06-18 23:25:39
【问题描述】:
为了比较这两种变体,我尝试实现一个简单的示例:学习 sinc 函数。
Matlab 在这里非常简单,用
创建数据x = 0 : 0.1 : 10;
y = sin(x) ./ x;
并使用神经网络拟合拟合工具进行训练。 Matlab 在 62 个 epoch 之后产生了 5.31e-10 的损失。
如您所见,完美贴合肉眼。 现在我用 keras 实现了相同的网络:
model = Sequential()
model.add(Dense(10, input_shape=(1,)))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('linear'))
opti = Adam()
model.compile(optimizer=opti,
loss='mean_squared_error')
并以类似的方式准备数据:
x = np.arange(0, 10.1, 0.1)
def sinc(x):
if x == 0:
return 1
else:
return (np.sin(x) / x)
y = [sinc(val) for val in x]
和训练
history = model.fit(x, y, epochs=100, validation_split=0.15)
在 100 个 epoch 之后,损失大约为 0.02。
Keras 的性能显然比 Matlabs 差很多。
我唯一能想到的是,Levenberg-Marquardt 比 Adam 优越得多,因为训练损失没有太大改善,即使在 1000 个 epoch 之后也是如此。
我也尝试提高 Adam 的学习率,但即便如此,损失也只是在 0.0003 左右停止下降
这里是 Jupyter 笔记本的链接,如果您想查看我用于 Keras 实现的确切代码:
现在我的问题是,我是否以及如何改进我的 Keras 实现,而不会留下明显的限制(例如增加隐藏层大小),因为我的挑战过于击败 Matlab?
【问题讨论】:
-
是的 LM 比 adam 好,可以导致这样的结果。
-
LM 在这种情况下更好。但通常在玩具问题上的更高性能并不能扩展到更复杂的问题。
-
你的问题是什么? :)
-
感谢您的 cmets! @Cleb 我的问题是我是否以及如何改进 Keras 的实现,忘记了
-
@refl3x 考虑将该问题添加到您的帖子中,以便用户知道如何为您提供帮助
标签: matlab neural-network keras curve-fitting