Hi,
I’ve started to learn PyTorch and I’m loving it.
I’ve learned a few things and tried to implement logistic regression from scratch,
but challenging myself not to use nn
Module and any optimizer or loss function and write these myself.
So I’ve written the code, but I am having a problem which I’ve stuck at for quite some time now.
I really would appreciate if you show me why this does not work and how to avoid these situations as it seems to me autograd
can be confusing.
def get_one_sample(idx):
return dataset.iloc[idx, :-1].values, dataset.iloc[idx, -1]
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
w = torch.randn((d, 1), dtype=torch.float64, device=device, requires_grad=True)
b = torch.randn((1, 1), dtype=torch.float64, device=device, requires_grad=True)
losses = []
for epoch in range(epochs):
for i in range(m):
x_np, y_np = get_one_sample(i)
x = torch.from_numpy(x_np).to(device).view(-1, 1)
y = torch.tensor([y_np], dtype=torch.float, device=device)
# forward computation
y_hat = torch.sigmoid(w.T@x+b)
# loss computation & loss backprop
loss = torch.log(-y_hat) if y_np==1 else torch.log(1-y_hat)
losses.append(loss.item())
loss.backward()
print(w.grad)
# updating weights
w = w - alpha * w.grad
b = b - alpha * b.grad
print(w.grad)
w.grad.data.zero_()
b.grad.data.zero_()
print("epoch:", epoch)
plt.plot(losses)
plt.show();
the console output before crashing into error:
tensor([[-4.1593e-07],
[-9.9529e-07],
[ 3.2241e-07],
[ 5.1336e-08]], device='cuda:0', dtype=torch.float64)
None
None
the runtime stops at w.grad.data.zero_()
with the following error:
----------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-79-eb9f256e22e0> in <module>
32 print(w.grad)
33
---> 34 w.grad.data.zero_()
35 b.grad.data.zero_()
36
AttributeError: 'NoneType' object has no attribute 'data'
also, I can’t quite figure out why it is outputting 3 lines or print where as I obviously have only two!
Thanks in advance.