【发布时间】:2021-04-26 00:32:57
【问题描述】:
我正在学习 Pytorch,我正在尝试实现一个非常简单的网络,该网络接受长度为 2 的输入,即平面中的一个点,旨在学习其组件的总和。
原则上,网络应该只学习一个权重矩阵 W = [1.,1.] 和零偏差的线性层,所以我希望训练误差非常低。但是,我不明白为什么我没有按预期得到这个。
我写的代码是这样的:
import torch
from torch import nn, optim
import numpy as np
device = torch.device("cuda:0" if
torch.cuda.is_available() else "cpu")
N = 1000 # number of samples
D = 2 # input dimension
C = 1 # output dimension
def model(z):
q = z[:,0]
p = z[:,1]
return q+p
X = torch.rand(N, D,requires_grad=True).to(device)
y = model(X)
lr = 1e-2 #Learning rate
Rete = nn.Sequential(nn.Linear(D, C))
Rete.to(device) #Convert to CUDA
criterion = torch.nn.MSELoss()
optimizer = torch.optim.Adam(Rete.parameters(), lr=lr)
for t in range(5000):
y_pred = Rete(X)
loss = criterion(y_pred, y)
print("[EPOCH]: %i, [LOSS]: %.6f" % (t, loss.item()))
optimizer.zero_grad()
optimizer.step()
【问题讨论】:
-
你没有反向传播,即,做
loss.backward()。另外,我相信optimizer.zero_grad()应该在optimizer.step()之后。
标签: deep-learning neural-network pytorch linear-regression