我在youtube上关注一系列关于深度学习的教程,我遇到了一个令我困惑的问题.

X = torch.tensor([1,2,3,4], dtype = torch.float32)
Y = torch.tensor([2,4,6,8], dtype = torch.float32)

w = torch.tensor(0.0, dtype = torch.float32, requires_grad=True)

def forward(x):
  return w*x;

def loss(y, y_predicted):
  return ((y-y_predicted)**2).mean()

print(f'Prediction before training: f(5) = {forward(5):.3f}')


learning_rate= 0.01
epoch = 20
for i in range(epoch):
  y_pred = forward(X)
  l = loss(Y, y_pred)
  l.backward()
  with torch.no_grad():
    w = w - learning_rate * w.grad
    # (w -= learning_rate * w.grad) # would not cause error in the following line


  w.grad.zero_() #error : 'NoneType' object has no attribute 'zero_'
  if i % 1 ==0:
    print(f'weight : {w}, loss : {l}')

我真的很想知道"w = w - learning_rate * w.grad"和"w -= learning_rate * w.grad"之间的区别,因为这两个在我的经验中是一样的.谢谢

推荐答案

正如 comments 中所指出的,问题在于Pytorch如何计算/存储梯度.事实上

w-= learning_rate * w.grad

是就地操作,这将使w保持其初始属性(requires\u grad=True).通常在Pytorch中,我们避免就地操作,因为它可能会 destruct Autograd使用的计算图(参见Pytorch Forum Post).

但对你来说,这:

w = w - learning_rate * w.grad

未安装到位.因此,由于 torch ,w被分配给新副本.no\u grad()语句,此副本将没有.梯度属性.

Python相关问答推荐

Django管理面板显示字段最大长度而不是字段名称

Pandas 在最近的日期合并,考虑到破产

根据不同列的值在收件箱中移动数据

韦尔福德方差与Numpy方差不同

滚动和,句号来自Pandas列

在Python中处理大量CSV文件中的数据

numba jitClass,记录类型为字符串

如何从.cgi网站刮一张表到rame?

如何使用它?

如果值发生变化,则列上的极性累积和

如何在Python中找到线性依赖mod 2

多处理队列在与Forking http.server一起使用时随机跳过项目

实现神经网络代码时的TypeError

numpy数组和数组标量之间的不同行为

解决Geopandas和Altair中的正图和投影问题

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

如何写一个polars birame到DuckDB

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

pyspark where子句可以在不存在的列上工作

Sknowled线性回归()不需要迭代和学习率作为参数