【问题标题】:PyTorch tensors have same value after being added to a listPyTorch 张量在添加到列表后具有相同的值
【发布时间】:2020-11-22 14:26:41
【问题描述】:

在通过 Pytorch 学习梯度和优化过程时,我想通过图表找出损失函数值与权重值的变化。当我尝试绘制图表时,我同时使用了numpytorch,因为我想进行比较。在存储毕业生名单期间。和损失函数值。 它适用于 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


【解决方案1】:

w.grad 是张量;它(same 张量)在每次迭代时都附加到列表中,因此列表包含相同张量的副本,而不是每个时间点其 的副本你可能会打算。

处理这个问题的标准方法是使用:

dw_list.append(w.grad.detach().cpu().numpy()) 

请查看此讨论,了解为什么需要 detach(): https://discuss.pytorch.org/t/should-it-really-be-necessary-to-do-var-detach-cpu-numpy/35489/6

相比之下,np.mean() 每次调用它都会返回一个 new python 浮点对象,因此最后的值是不同的。列表 append() 在这两种情况下没有做任何不同的事情。

附:我认为这也可以:

dw_list.append(w.grad.clone())

但是,它会将克隆的张量保留在图中(如果原始张量在 gpu 上,则保留在 gpu 上)。这可能是也可能不是你想要的。

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 2020-06-10
    • 1970-01-01
    • 2021-03-14
    • 2020-05-22
    • 2021-07-21
    • 2021-04-11
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多