【发布时间】:2021-11-19 03:53:57
【问题描述】:
运行代码 sn-p (PyTorch 1.7.1; Python 3.8),
import numpy as np
import torch
def batch_matrix(vector_pairs, factor=2):
baselen = len(vector_pairs[0]) // factor
split_batch = []
for j in range(factor):
for i in range(factor):
start_j = j * baselen
end_j = (j+1) * baselen if j != factor - 1 else None
start_i = i * baselen
end_i = (i+1) * baselen if i != factor - 1 else None
mini_pairs = vector_pairs[start_j:end_j, start_i:end_i, :]
split_batch.append(mini_pairs)
return split_batch
def concat_matrix(vectors_):
vectors = vectors_.clone()
seq_len, dim_vec = vectors.shape
project_x = vectors.repeat((1, 1, seq_len)).reshape(seq_len, seq_len, dim_vec)
project_y = project_x.permute(1, 0, 2)
matrix = torch.cat((project_x, project_y), dim=-1)
matrix_ = matrix.clone()
return matrix_
if __name__ == "__main__":
vector_list = []
for i in range(10):
vector_list.append(torch.randn((5,), requires_grad=True))
vectors = torch.stack(vector_list, dim=0)
pmatrix = concat_matrix(vectors)
factor = np.ceil(vectors.shape[0]/6).astype(int)
batched_feats = batch_matrix(pmatrix, factor=factor)
for i in batched_feats:
i = i + 5
print(i.shape)
summed = torch.sum(i)
summed.backward()
我得到如下输出和错误:
torch.Size([5, 5, 10])
torch.Size([5, 5, 10])
Traceback (most recent call last):
File "/home/user/PycharmProjects/project/run.py", line 43, in <module>
summed.backward()
File "/home/user/anaconda3/envs/diff/lib/python3.8/site-packages/torch/tensor.py", line 221, in backward
torch.autograd.backward(self, gradient, retain_graph, create_graph)
File "/home/user/anaconda3/envs/diff/lib/python3.8/site-packages/torch/autograd/__init__.py", line 130, in backward
Variable._execution_engine.run_backward(
RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results have already been freed. Specify retain_graph=True when calling backward the first time.
我已阅读有关该问题的所有现有帖子,但自己无法解决。在backward() 中传递retain_graph=True 修复了提供的sn-p 中的问题,但是,sn-p 只是大型网络的一个过度简化的版本,其中retain_graph=True 将错误更改为以下内容:
RuntimeError:梯度计算所需的变量之一已被inplace操作修改:[torch.FloatTensor [3000, 512]],即TBackward的输出0,版本3;而是预期的版本 2。提示:使用 torch.autograd.set_detect_anomaly(True) 启用异常检测以查找未能计算其梯度的操作。
我尝试设置torch.autograd.set_detect_anomaly(True) 并确定故障点,但我尝试的所有方法都失败了,错误仍然存在。
我怀疑如果我能理解当前情况下的错误原因,那么它将帮助我在实际代码库中解决这个错误。
因此,我想了解为什么backward() 对batched_feats 中的前两个张量工作正常,而对第三个张量却失败了?如果有人可以帮助我查看已释放的中间结果的重用情况,我将不胜感激。
非常感谢!
【问题讨论】:
-
@bobcat 感谢您的链接。但是,我已经看到了这个问题,即使它是相同的错误,但上下文是不同的。这个问题有一个 GRU,它的状态,没有被分离,需要向后两次。这不适用于我的问题。在我的例子中,我不明白为什么在一个释放的张量上调用了两次 back。
-
你用的不是GRU,但原理是一样的。
标签: python deep-learning pytorch autograd