【发布时间】:2020-11-22 14:26:41
【问题描述】:
在通过 Pytorch 学习梯度和优化过程时,我想通过图表找出损失函数值与权重值的变化。当我尝试绘制图表时,我同时使用了numpy 和torch,因为我想进行比较。在存储毕业生名单期间。和损失函数值。
它适用于 numpy:
def gradient(x,y, y_predicted):
return np.dot(2*x, y_predicted-y).mean()
dw = gradient(x,y,y_pred)
dw_list.append(dw)
[-120.0, -112.8, -106.032, -99.67008, -93.68988, -88.06848, -82.78437, -77.81731, -73.14827, -68.75938]
它不适用于torch:
for epoch in range(n_iters):
# prediction = forward pass
y_pred = forward(x)
# loss
l = loss(y, y_pred)
loss_list.append(l)
print('loss')
print(l_list)
# gradients = backward pass
l.backward() # calculate w.grad = dl/dw and cumulative
# update weights
with torch.no_grad():
w -= learning_rate * w.grad
print(f'w.grad before zero setting = {w.grad}')
dw_list.append(w.grad)
print(dw_list)
#print(f'w.grad before zero setting = {w.grad}')
# zero gradients
w.grad.zero_()
[tensor(-6.9485), tensor(-6.9485), tensor(-6.9485), tensor(-6.9485), tensor(-6.9485), tensor(-6.9485), tensor(-6.9485), tensor(-6.9485), tensor(-6.9485), tensor(-6.9485)]
为什么dw_list.append(dw) 在 numpy 可以工作,而dw_list.append(w.grad) 在 torch 却不行?
为什么每次迭代时只有 grad 的新值填满了整个数组。在火炬张量?
【问题讨论】:
-
在第一种情况下,
mean()返回一个标量。在第二个显然w.grad不是一个标量。列表追加没有做任何不同的事情。 -
更正缩进。显示列表的初始化。
-
请发布完整的可运行示例(包括导入、示例数据等)——这样更容易找出答案:)
标签: python numpy pytorch gradient