Keras 和 PyToch 中的 MSE 损失不同

数据挖掘 喀拉斯 损失函数 火炬
2022-02-13 01:00:39

我的问题是在 PyTorch 中我无法重现我在 Keras 中实现的 MSE 损失。

我在 Keras 中训练了以下模型:

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(10))
model.add(Dense(1))
model.compile(optimizer = "adam", loss = "mean_squared_error")
model.fit(X_train, y_train,
      batch_size = 32,
      epochs = 200
     )

训练数据的形状为:

print(X_train.shape)
>>>(3550, 10)
print(y_train.shape)
>>>(3550,)

训练后的 MSE 约为 0.15:

mse_train = model.evaluate(X_train, y_train)
>>>3550/3550 [==============================] - 0s 18us/step
print("Train MSE: ", mse_train)
>>>Train MSE:  0.1499910642017781

然后我在 PyTorch 中初始化相同的模型:

import torch
import torch.nn as nn

class NN(nn.Module):
 def __init__(self):
  super(NN, self).__init__()
  self.dense1 = nn.Linear(10, 10)
  self.dense2 = nn.Linear(10, 1)

 def forward(self, x):
  out = self.dense1(x)
  out = self.dense2(out)
  return out

net = NN()
criterion = nn.MSELoss()

并分配我在 Keras 中实现的权重:

from keras.models import load_model
keras_model = load_model(MODEL_PATH)

dense_weights = keras_model.layers[0].get_weights()
weights = torch.tensor(dense_weights[0].swapaxes(0,1))
bias = torch.tensor(dense_weights[1])
net.dense1.weight.data = weights
net.dense1.bias.data = bias

dense_weights = keras_model.layers[1].get_weights()
weights = torch.tensor(dense_weights[0].swapaxes(0,1))
bias = torch.tensor(dense_weights[1])
net.dense2.weight.data = weights
net.dense2.bias.data = bias

现在我尝试计算 MSE 损失:

X_train_torch = torch.tensor(X_train, dtype=torch.float)
y_train_torch = torch.tensor(y_train, dtype=torch.float)

outputs = net(X_train_torch)
loss = criterion(outputs, y_train_torch)
print("Train loss: ", loss)
>>>Train loss:  0.338391376896338

MSE 现在约为 0.34,是 Keras 计算的两倍。

可能是什么原因?我的计算中有错误吗?

1个回答

问题是,outputs并且y_train_torch有不同的形状。