批次大小大于1滴性能pytorch

时间:2019-02-27 16:38:47

标签: python keras pytorch

我正在尝试使用一些非常基本的模型对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)))

0 个答案:

没有答案