【问题标题】:Matlab implementation of neural network is vastly superior to Keras variant神经网络的 Matlab 实现大大优于 Keras 变体
【发布时间】: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 实现的确切代码:

Jupyter Notebook

现在我的问题是,我是否以及如何改进我的 Keras 实现,而不会留下明显的限制(例如增加隐藏层大小),因为我的挑战过于击败 Matlab?

【问题讨论】:

  • 是的 LM 比 adam 好,可以导致这样的结果。
  • LM 在这种情况下更好。但通常在玩具问题上的更高性能并不能扩展到更复杂的问题。
  • 你的问题是什么? :)
  • 感谢您的 cmets! @Cleb 我的问题是我是否以及如何改进 Keras 的实现,忘记了
  • @refl3x 考虑将该问题添加到您的帖子中,以便用户知道如何为您提供帮助

标签: matlab neural-network keras curve-fitting


【解决方案1】:

现在我的问题是,我是否以及如何改进我的 Keras 实现,而不会留下明显的限制(例如增加隐藏层大小),因为我的挑战过于击败 Matlab?

为了改进您的 Keras 实现,我建议您首先在默认情况下使用其他可用的优化器,因为其中一个可能非常适合您的情况,并且可能超过 Matlab 的实现。

如果这不起作用,您仍然可以创建一个自定义优化器类,以满足您的需求。在您的情况下,您可以尝试自己实现 Levenberg-Marquardt 优化器。为此,您应该扩展 Optimizers 类并覆盖 get_updatesget_config 方法,例如:

class myLM(Optimizer):
    def __init__(self, your=0., parameters=0., here=0., **kwargs):
       #Initialize your custom Optimizer
    def get_updates(self, loss, params):
       #Calculate and return the update according to LM implementation
       return self.updates
    def get_config(self):
       #override configuration method
       config = {'your': float(K.get_value(self.lr)),
              'parameters': float(K.get_value(self.beta_1)),
              'here': float(K.get_value(self.beta_2)),
               }
       base_config = super(myML, self).get_config() #other configs
       return dict(list(base_config.items()) + list(config.items()))

然后您可以在编译模型时实例化您的自定义优化器并将其传递给optimizer

我建议您检查Keras Optimizers 代码(在本例中为Adam),这样您就可以知道每个方法预期返回什么,并能够根据您的自定义需求构建它们。

【讨论】:

    猜你喜欢
    • 2017-08-06
    • 1970-01-01
    • 2021-04-05
    • 2016-05-07
    • 2012-03-15
    • 2019-07-13
    • 2015-12-03
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多