So, I have been trying to recreate a TensorFlow function in PyTorch, and the code below should in theory replicate the TensorFlow code. Though I appear to missing something as I get an error when testing the code. The logit_activ
variable is the captured activations from a model’s final layer (before softmax), and the layer_activ
variable is the capture activations from the target layer.
def fwd_gradients(logit_activ, layer_activ):
zeros = torch.nn.Parameter(torch.zeros_like(logit_activ))
grad_one = torch.autograd.grad(
outputs=[logit_activ],
inputs=[layer_activ],
grad_outputs=[zeros],
create_graph=True,
)[0]
grad_two = torch.autograd.grad(
outputs=[grad_one],
inputs=zeros,
grad_outputs=[torch.ones_like(grad_one)],
create_graph=True,
)[0]
# Issue occurs somewhere after here:
# Equivalent tensorflow code is:
# logit_attr = grad_two.eval({layer_name: layer_activ, d_previous: layer_zeros})
layer_zeros = nn.Parameter(torch.zeros_like(target_activ))
layer_zeros[..., x, y] = layer_activ[..., x, y]
# Calc logit attribution
logit_attr = torch.autograd.grad(
outputs=[layer_activ],
inputs=grad_two,
grad_outputs=[layer_zeros],
create_graph=True,
)[0]
return logit_attr
The error message when running the above function looks like this:
1 frames
<ipython-input-48-326f99eba6c0> in fwd_gradients(logit, activ)
21 inputs=out,
22 grad_outputs=[layer_zeros],
---> 23 create_graph=True,
24 )[0]
25 return out
/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py in grad(outputs, inputs, grad_outputs, retain_graph, create_graph, only_inputs, allow_unused)
202 return Variable._execution_engine.run_backward(
203 outputs, grad_outputs_, retain_graph, create_graph,
--> 204 inputs, allow_unused)
205
206
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.
Any help resolving the issue would be appreciated!