微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

keras 和 scikit-learn 中 MLP 回归器的不同损失值和精度

如何解决keras 和 scikit-learn 中 MLP 回归器的不同损失值和精度

我有一个神经网络,其中一个隐藏层在 Keras 和 scikit-learn 中实现,用于解决回归问题。在 scikit-learn 中,我使用了 MLPregressor 类,主要是认参数,在 Keras 中,我有一个隐藏的 Dense 层,其参数设置为与 scikit-learn 相同的认值(它使用具有相同学习率和 epsilon 的 Adam,batch_size 为 200)。当我训练网络时,scikit-learn 模型的损失值大约是 keras 的一半,并且其准确性(以平均绝对误差衡量)也更好。如果不相同,损失值是否应该相似并且精度也相似?有没有人经历过类似的事情并且能够使 Keras 模型更准确?

Scikit-learn 模型:

clf = MLPRegressor(hidden_layer_sizes=(1600,),max_iter=1000,verbose=True,learning_rate_init=.001)

Keras 模型:

inputs = keras.Input(shape=(cols,))
x = keras.layers.Dense(1600,activation='relu',kernel_initializer="glorot_uniform",bias_initializer="glorot_uniform",kernel_regularizer=keras.regularizers.L2(.0001))(inputs)
outputs = keras.layers.Dense(1,kernel_regularizer=keras.regularizers.L2(.0001))(x)
model = keras.Model(inputs=inputs,outputs=outputs)
model.compile(optimizer=keras.optimizers.Adam(epsilon=1e-8,learning_rate=.001),loss="mse")
model.fit(x=X,y=y,epochs=1000,batch_size=200)

解决方法

这是因为scikit-learn的均方损失(MSE)公式与tensorflow的不同。

来自scikit-learn的源码:

def squared_loss(y_true,y_pred):
    return ((y_true - y_pred) ** 2).mean() / 2

同时来自 tensorflow 的 MSE:

backend.mean(math_ops.squared_difference(y_pred,y_true),axis=-1)

如您所见,scikit-learn 一除以 2,与您所说的一致:

scikit-learn 模型的损失值大约是 keras 的一半

这意味着来自 keras 和 scikit-learn 的模型实际上实现了相似的性能。这也意味着 scikit-learn 中的学习率 0.001 并不等同于 tensorflow 中的相同学习率。

此外,另一个较小但显着的差异是 L2 正则化的公式。

来自scikit-learn的源码,

# Add L2 regularization term to loss
values = 0
for s in self.coefs_:
   s = s.ravel()
   values += np.dot(s,s)
loss += (0.5 * self.alpha) * values / n_samples

而 tensorflow 是 loss = l2 * reduce_sum(square(x))

因此,在相同的l2正则化参数下,tensorflow one的正则化更强,这将导致对训练数据的拟合较差。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。