I’d like to compute the gradient with respect to a hidden layer’s output(pred_z in the example below). requires_grad is set to True but the gradient is still None. Why?
import torch
from torch.autograd import Variable
x_data = Variable(torch.Tensor([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0]]))
y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]]))
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.l1 = torch.nn.Linear(2, 5)
self.l2 = torch.nn.Linear(5, 1)
def forward(self, x):
z = torch.nn.functional.relu(self.l1(x))
y_pred = self.l2(z)
return y_pred, z
# our model
our_model = Model()
criterion = torch.nn.MSELoss(size_average = False)
optimizer = torch.optim.SGD(our_model.parameters(), lr = 0.01)
for epoch in range(500):
# Forward pass: Compute predicted y by passing
# x to the model
pred_y, pred_z = our_model(x_data)
# Compute and print loss
loss = criterion(pred_y, y_data)
# Zero gradients, perform a backward pass,
# and update the weights.
optimizer.zero_grad()
loss.backward()
print('dL/dz', pred_z.grad)
optimizer.step()
print('epoch {}, loss {}'.format(epoch, loss.data[0]))
new_var = Variable(torch.Tensor([[4.0, 5.0]]))
pred_y = our_model(new_var)
print("predict (after training)", [4,5], our_model(new_var)[0].data[0])
I’d like to compute a gradient with of the loss w/ respect to z but I don’t actually want to apply it.