PyTorch 优化中的丢失类型
Lost type in PyTorch optimization
我正在尝试在 PyTorch 中实现一个简单的最小化器,代码如下:
for i in range(10):
print('i =', i, ' q =', q)
v_trans = transform_dq(v, q)
loss = mse(v_trans, v_target)
loss.backward()
q = q - eta * q.grad
print('Final q = ', q)
其中 v 和 q 是张量,eta = 0.01。
问题是在第 q = q - eta * q.grad
行,我在循环的第二次迭代中遇到错误:
TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'
看起来 q 的更新以不需要的方式更改了图形(q 不再是图形的叶子,因此它没有梯度)。如果是这样,那么如何实现这个简单的最小化器?
首先,您需要在每次迭代前重置 q
的梯度。
其次,您应该在“渐变范围”之外更新 q
:
with torch.no_grad():
q = q - eta * q.grad
我正在尝试在 PyTorch 中实现一个简单的最小化器,代码如下:
for i in range(10):
print('i =', i, ' q =', q)
v_trans = transform_dq(v, q)
loss = mse(v_trans, v_target)
loss.backward()
q = q - eta * q.grad
print('Final q = ', q)
其中 v 和 q 是张量,eta = 0.01。
问题是在第 q = q - eta * q.grad
行,我在循环的第二次迭代中遇到错误:
TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'
看起来 q 的更新以不需要的方式更改了图形(q 不再是图形的叶子,因此它没有梯度)。如果是这样,那么如何实现这个简单的最小化器?
首先,您需要在每次迭代前重置 q
的梯度。
其次,您应该在“渐变范围”之外更新 q
:
with torch.no_grad():
q = q - eta * q.grad