【发布时间】:2019-03-20 19:24:36
【问题描述】:
假设我有一个简单的单层网络,我正在以典型方式进行训练:
for x,y in trainData:
optimizer.zero_grad()
out = self(x)
loss = self.lossfn(out, y)
loss.backward()
optimizer.step()
这按预期工作,但如果我改为预先分配和更新输出数组,我会收到错误:
out = torch.empty_like(trainData.tensors[1])
for i,(x,y) in enumerate(trainData):
optimizer.zero_grad()
out[i] = self(x)
loss = self.lossfn(out[i], y)
loss.backward()
optimizer.step()
RuntimeError: 试图第二次向后遍历图形,但是 缓冲区已被释放。指定retain_graph=True 时 第一次向后调用。
在第二个版本中,Pytorch 再次尝试向后遍历图表是怎么回事?为什么这在第一个版本中不是问题? (注意即使我不zero_grad()也会出现这个错误)
【问题讨论】:
标签: pytorch backpropagation tensor autograd autodiff