神经网络的 Matlab 实现大大优于 Keras 变体

标签 matlab neural-network keras curve-fitting

为了比较这两种变体,我尝试实现一个简单的示例:学习 sinc 函数。

Matlab 在这里非常简单,用

x = 0 : 0.1 : 10;
y = sin(x) ./ x;

并使用 Neural Network Fitting 拟合工具进行训练。 Matlab 在仅 62 个迭代后产生了 5.31e-10 的损失。

enter image description here

如您所见,肉眼完美契合。 现在我用 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 个时期后,损失约为 0.02。

enter image description here

Keras的性能明显比Matlabs差很多。

我唯一能想到的是,Levenberg-Marquardt 比 Adam 好得离谱,因为即使在 1000 个 epoch 之后,训练损失也没有太大改善。

我也尝试提高 Adam 的学习率,但即便如此,损失也只是在 0.0003 左右停止下降

如果您想查看我用于我的 Keras 实现的确切代码,这是一个指向 Jupyter notebook 的链接:

Jupyter Notebook

现在我的问题是,我是否以及如何改进我的 Keras 实现,而不会留下明显的限制(如增加隐藏层大小),这些限制是我挑战 Matlab 的挑战所强加的?

最佳答案

Now my question is if and how I can improve on my Keras implementation without leaving the obvious constraints (like increasing the hidden layer size) imposed by my challenge to beat Matlab too much?

为了改进您的 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),这样您就可以知道每个方法预期返回什么,并能够根据您的自定义需求构建它们。

关于神经网络的 Matlab 实现大大优于 Keras 变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176457/

相关文章:

matlab - 避免为 `textscan` 中的大表中的每一列键入转换说明符

python - 如何在例如上部署经过训练的 tensorflow 网络树莓派

python - Keras model.summary() 对象到字符串

machine-learning - 为什么keras中没有指定DNN的预训练?

python - 无法使用load_model()加载模型

matlab - 在 MATLAB 中创建淡入/淡出函数?

matlab - Matlab 编码器的 OOP Matlab 继承问题(Simulink MATLAB 功能 block )

image - 光流的简单案例

python - Siamese 网络的 Keras 模型不学习并且总是预测相同的输出

machine-learning - 当神经网络的偏差单元被正则化时到底会发生什么?