我正在尝试使用一些非常基本的模型对keras或pytorch进行回归。因此,我模拟了数据X=np.random.random((10000, 10))
和y = np.matmul(X, W)
,其中W是大小为(10,1)的随机矩阵。
我想通过一个单层且没有激活功能的模型来学习W。
我将SGD与lr=0.01
一起使用,MSE损失达20个纪元,并想检查对批量大小的影响。
当我使用Keras时,使用不等于1的批次大小不会影响最终性能,并且鉴于此玩具问题,该模型可以预测出很好的结果。
但是在pytorch上,当我的批处理大小等于1时,效果很好,但是一旦更改,性能就会大大降低。
我试图修改学习率,但是并没有太大帮助。
有人对它为何如此差劲有任何线索吗?
我有一个小代码可以尝试:
import numpy as np
import torch
import keras
from torch.utils.data import DataLoader, TensorDataset
import torch.nn.functional as F
# Data
X = np.random.random((10000, 10))
W = np.random.random((10, 1))
y = np.matmul(X, W).ravel()
batch_size = 32
n_epochs = 20
# Keras
model = keras.models.Sequential()
model.add(keras.layers.Dense(units=1, input_dim=10))
sgd = keras.optimizers.SGD(lr=0.01)
model.compile(loss='MSE', optimizer=sgd)
model.fit(X, y, epochs=n_epochs, batch_size=batch_size, verbose=0)
# pytorch
train_dataset = TensorDataset(torch.Tensor(X), torch.Tensor(y))
params = {'batch_size': batch_size}
trainloader = DataLoader(train_dataset, **params)
net = torch.nn.Linear(10, 1)
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
criterion = F.mse_loss
for epoch in range(n_epochs):
for X_batch, y_batch in trainloader:
optimizer.zero_grad()
outputs = net(X_batch)
loss = criterion(outputs, y_batch)
loss.backward()
optimizer.step()
# eval
X_test = np.random.random((100, 10))
y_test = np.matmul(X_test, W)
y_keras = model.predict(X_test)
y_torch = net(torch.Tensor(X_test)).detach().numpy()
print('error keras {}'.format(np.mean((y_test-y_keras)**2)))
print('error torch {}'.format(np.mean((y_test-y_torch)**2)))