Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyTorch张量在添加到列表后具有相同的值_Python_Numpy_Pytorch_Gradient - Fatal编程技术网

Python PyTorch张量在添加到列表后具有相同的值

Python PyTorch张量在添加到列表后具有相同的值,python,numpy,pytorch,gradient,Python,Numpy,Pytorch,Gradient,在Pytorch学习梯度和优化过程时,我想用图表计算损失函数值与权重值的变化。当我试图绘制图表时,我同时使用了numpy和torch,因为我想进行比较。在存储grad列表的过程中。和损失函数值。 它在numpy工作: def梯度(x,y,y_预测): 返回np.dot(2*x,y_-y).mean() dw=梯度(x,y,y_pred) dw_list.append(dw) [-120.0、-112.8、-106.032、-99.67008、-93.68988、-88.06848、-82.78

在Pytorch学习梯度和优化过程时,我想用图表计算损失函数值与权重值的变化。当我试图绘制图表时,我同时使用了
numpy
torch
,因为我想进行比较。在存储grad列表的过程中。和损失函数值。 它在numpy工作:

def梯度(x,y,y_预测):
返回np.dot(2*x,y_-y).mean()
dw=梯度(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]

它在火炬上不起作用:

  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_()
[张量(-6.9485)、张量(-6.9485)、张量(-6.9485)、张量(-6.9485)、张量(-6.9485)、张量(-6.9485)、张量(-6.9485)、张量(-6.9485)、张量(-6.9485)、张量(-6.9485)]

为什么
dw\u list.append(dw)
在numpy工作,而
dw\u list.append(w.grad)
在torch不工作


为什么每次国际热核实验堆的整个阵列中都只填充了新的梯度值。在火炬张量下?

w.grad
是一个张量;它(相同的张量)在每次迭代时被追加到列表中,因此列表包含相同张量的副本,而不是您可能希望的每个时间点的值的副本

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

dw_list.append(w.grad.detach().cpu().numpy()) 
请查看此讨论,了解为什么需要分离():

相反,np.mean()每次调用时都返回一个新的python float对象,因此最后的值是不同的。list append()在这两种情况下没有任何不同

另外,我认为这也会起作用:

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

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

在第一种情况下,
mean()
返回一个标量。在第二种情况下,
w.grad
显然不是标量。List append没有做任何不同的操作。请更正缩进。显示列表的初始化。请发布完整的可运行示例(包括导入、示例数据等)-这样更容易找到答案:)