I have a convolutional neural network that predicts 3 quantities: Ux, Uy, and P. They are all 2D arrays of size [100,60], and my batch size is 10.
I want to compute the loss and update the network by calculating the CURL of the predicted velocity with the CURL of the target velocity. I have a function that does this: discrete_curl, and it computes it using (Ux_pred, Uy_pred), the predicted Ux and Uy. I want to compute the loss by comparing it to ground truth targets that I have: true_curl = curl(Ux_true, Uy_true)
To do this, I need to compute the curl loss in terms of Ux and Uy. I have not gotten past this error in Pytorch. this is my code so far:
# Curl function defined seperately
def discrete_curl(self,x,y,curl):
for m in range(100):
for n in range(60):
if n <= 58:
if m <= 98:
if x[m,n] != 0 and y[m,n] != 0:
curl[m,n] = ((y[m+1,n] - y[m-1,n]) / 2*1) - ((x[m,n+1] - x[m,n-1]) / 2*1)
return curl
Code:
inputs= torch.from_numpy(x)
targets= torch.from_numpy(y[:,0:3,:,:]) # Ux,Uy,P target
pred = self.forward(inputs)
pred_ux = pred[:,0,:,:] #Ux of batch: size [10,100,60]
pred_uy = pred[:,1,:,:]. #Uy of batch: size [10,100,60]
predicted_curl = np.zeros((len(pred),100,60), dtype=float)
predicted_curl = torch.from_numpy(predicted_curl)
for i in range(len(pred)):
pred_ux[i] = Variable(pred_ux[i], requires_grad=True) #Ux_pred
pred_uy[i] = Variable(pred_uy[i], requires_grad=True) #Uy_pred
predicted_curl[i] = Variable(predicted_curl[i], requires_grad=True) #curl from predicted velocity values, to be updated with curl function below
predicted_curl[i] = self.discrete_curl(pred_ux[i], pred_uy[i], predicted_curl[i])
grad_tensor = torch.autograd.grad(outputs=predicted_curl[i], inputs=(pred_ux[i], pred_uy[i]), grad_outputs=torch.ones_like(new_arr[i]), retain_graph=True)
print(grad_tensor)
However, it fails when I try to define grad_tensor, before I can even compute the loss. It fails with this error:
grad_tensor = torch.autograd.grad(outputs=new_arr[i], inputs=(pred_ux[i], pred_uy[i]), grad_outputs=torch.ones_like(new_arr[i]), retain_graph=True)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/torch/autograd/__init__.py", line 204, in grad
inputs, allow_unused)
RuntimeError: One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=True if this is the desired behavior.
How do I get past this?