mhy*_*efi 10 python pytorch autograd
我在 中使用该autograd工具PyTorch,并且发现自己需要通过整数索引访问一维张量中的值。像这样的东西:
def basic_fun(x_cloned):
res = []
for i in range(len(x)):
res.append(x_cloned[i] * x_cloned[i])
print(res)
return Variable(torch.FloatTensor(res))
def get_grad(inp, grad_var):
A = basic_fun(inp)
A.backward()
return grad_var.grad
x = Variable(torch.FloatTensor([1, 2, 3, 4, 5]), requires_grad=True)
x_cloned = x.clone()
print(get_grad(x_cloned, x))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
[tensor(1., grad_fn=<ThMulBackward>), tensor(4., grad_fn=<ThMulBackward>), tensor(9., grad_fn=<ThMulBackward>), tensor(16., grad_fn=<ThMulBackward>), tensor(25., grad_fn=<ThMulBackward>)]
Traceback (most recent call last):
File "/home/mhy/projects/pytorch-optim/predict.py", line 74, in <module>
print(get_grad(x_cloned, x))
File "/home/mhy/projects/pytorch-optim/predict.py", line 68, in get_grad
A.backward()
File "/home/mhy/.local/lib/python3.5/site-packages/torch/tensor.py", line 93, in backward
torch.autograd.backward(self, gradient, retain_graph, create_graph)
File "/home/mhy/.local/lib/python3.5/site-packages/torch/autograd/__init__.py", line 90, in backward
allow_unreachable=True) # allow_unreachable flag
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
Run Code Online (Sandbox Code Playgroud)
总的来说,我有点怀疑如何使用变量的克隆版本来保持该变量在梯度计算中。变量本身实际上并未用于 的计算A,因此当您调用 时A.backward(),它不应成为该操作的一部分。
感谢您对这种方法的帮助,或者是否有更好的方法来避免丢失梯度历史记录并仍然通过一维张量进行索引requires_grad=True!
res是含1至5平方值要在含有单张量串接零维张量的列表[1.0,4.0,...,25.0],我改变return Variable(torch.FloatTensor(res))到torch.stack(res, dim=0),这产生tensor([ 1., 4., 9., 16., 25.], grad_fn=<StackBackward>)。
但是,我收到了这个由A.backward()线路引起的新错误。
Traceback (most recent call last):
File "<project_path>/playground.py", line 22, in <module>
print(get_grad(x_cloned, x))
File "<project_path>/playground.py", line 16, in get_grad
A.backward()
File "/home/mhy/.local/lib/python3.5/site-packages/torch/tensor.py", line 93, in backward
torch.autograd.backward(self, gradient, retain_graph, create_graph)
File "/home/mhy/.local/lib/python3.5/site-packages/torch/autograd/__init__.py", line 84, in backward
grad_tensors = _make_grads(tensors, grad_tensors)
File "/home/mhy/.local/lib/python3.5/site-packages/torch/autograd/__init__.py", line 28, in _make_grads
raise RuntimeError("grad can be implicitly created only for scalar outputs")
RuntimeError: grad can be implicitly created only for scalar outputs
Run Code Online (Sandbox Code Playgroud)
我将其更改basic_fun为以下内容,这解决了我的问题:
def basic_fun(x_cloned):
res = torch.FloatTensor([0])
for i in range(len(x)):
res += x_cloned[i] * x_cloned[i]
return res
Run Code Online (Sandbox Code Playgroud)
此版本返回一个标量值。
| 归档时间: |
|
| 查看次数: |
13005 次 |
| 最近记录: |