我有一个多元线性回归问题,其中每个数据点看起来像这样:
y_i = 3 # Some integer between 0 and 20
X_i = [0.5, 80, 0.004, 0.5, 0.789] # A 5 dimensional vector
我可以使用sklearn来训练简单的线性模型,例如:
from sklearn import linear_model
ols = linear_model.LinearRegression()
model = ols.fit(X, y)
这使我的准确度达到了约55%(线性模型不适合该问题,但这是演示对该问题进行建模的可行性的基线,也是我以前使用过TensorFlow来学习PyTorch的一种方式)。
当我尝试使用PyTorch训练线性模型时,我将模型定义为:
class TwoLayerNet(torch.nn.Module):
def __init__(self, D_in, D_out):
super(TwoLayerNet, self).__init__()
self.linear1 = torch.nn.Linear(D_in, D_out)
def forward(self, x):
y_pred = self.linear1(x)
return y_pred
D_in, D_out = 5, 1
model = TwoLayerNet(D_in, D_out)
培训方式:
epochs = 10
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
for epoch in range(epochs):
for n, batch in enumerate(batches):
X = []
y = []
for values in batch:
X.append(values[0])
y.append(values[1])
X = torch.from_numpy(np.asarray(X))
y = torch.from_numpy(np.asarray(y))
# Forward pass: Compute predicted y by passing x to the model
optimizer.zero_grad()
y_pred = model(X)
# Compute and print loss
loss = criterion(y_pred, y)
if n % 100 == 99:
print(n, loss.item())
# Zero gradients, perform a backward pass, and update the weights.
loss.backward()
optimizer.step()
这只是我调整过的PyTorch文档中的一些代码。目前的设置只能达到约25%,无法接近线性模型所期望的精度。我在PyTorch的模型训练中做错了什么吗?
答案 0 :(得分:1)
tam63,
您在模型定义中缺少激活功能。替换
y_pred = self.linear1(x)
使用
y_pred = F.relu(self.linear1(x))
还有几处可能出错的地方。 例如(1)学习率太低,(2)层数太少(再增加一层)。如果您熟悉TF,请尝试使用TF中的相同问题,并在获得良好效果后-将其转换为具有相同网络结构和相同超参数的Pytorch。