【发布时间】:2019-07-23 15:24:17
【问题描述】:
我正在通过两个简单的 nn.Module PyTorch 模型实例 model1 和 model2 转发和反向支持张量数据 X。
如果不使用depreciated Variable API,我无法让这个过程工作。
所以这很好用:
y1 = model1(X)
v = Variable(y1.data, requires_grad=training) # Its all about this line!
y2 = model2(v)
criterion = nn.NLLLoss()
loss = criterion(y2, y)
loss.backward()
y1.backward(v.grad)
self.step()
但这会抛出错误:
y1 = model1(X)
y2 = model2(y1)
criterion = nn.NLLLoss()
loss = criterion(y2, y)
loss.backward()
y1.backward(y1.grad) # it breaks here
self.step()
>>> RuntimeError: grad can be implicitly created only for scalar outputs
我似乎无法找到第一个实现中的v 和第二个实现中的y1 之间的相关区别。在这两种情况下,requires_grad 都设置为 True。我唯一能找到的是y1.grad_fn=<ThnnConv2DBackward>和v.grad_fn=<ThnnConv2DBackward>
我在这里缺少什么? 我不知道什么(张量属性?),如果 Variable 被贬值,还有什么其他实现可以工作?
【问题讨论】:
-
虽然我看不到您的完整代码(
model1的定义或自身所属的类),但您确定这不仅仅是一个错字吗?第一个写y1.backward(v.grad),第二个写y1.backward(y1.grad)。注意y1 -
模型中没有错别字,它们是单层 nn.Module 实例。我没有得到您认为第二行中的错字
-
y1.backward(y1.grad.data)在第二种情况下没有帮助吗?
标签: python machine-learning pytorch