我的问题是在 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 计算的两倍。
可能是什么原因?我的计算中有错误吗?