vscode中使用pytorch,终端中显示GPU版torch可用,编译器输出False。
是一个程序问题,和python新建变量的机制有关。
w-=
,是一直对w
进行本地操作w=w-lr*w.grad
,其实是等式右边进行计算,然后赋值给一个新的w
,所以新的那个w
就是一个普通的Tensor,而不是parameter,没有.grad
属性,所以是False一直记得好像在哪里看到过这个公式更新,后来找了一下,发现是在:
验证代码如下(使用的就是线性回归从头实现的代码,进行以下简单改动即可):
# 定义优化算法
def sgd(params,lr,batch_size):
with torch.no_grad():
for param in params:
print(f"更新前param的id为:{id(param)}")
param-=lr*param.grad/batch_size
print(f"更新后param的id为:{id(param)}")
break # 添加break,只查看一个参数内存地址变化情况
# 训练
lr=2
num_epoches=1
net=linreg
loss=squared_loss
for epoch in range(num_epoches):
for X,y in data_iter(batch_size,features,labels):
l=loss(net(X,w,b),y)
l.sum().backward()
sgd([w,b],lr,batch_size)
break # 添加break,只查看更新一次的情况
> 更新前param的id为:140308589009168
更新后param的id为:140308589009168
# 将梯度公式进行修改,改为不使用自增自减的,再运行,结果如下:
> 更新前param的id为:140308589009168
更新后param的id为:140308644360432
所以,确实可以说明,自增自减运算是本地操作,赋值运算会新建一个Tensor(没有grad的那种)
更进一步,如果说w=w-xxx
会创建一个没有grad的tensor(可以打印一下更新前后param的type,新建的确实是Tensor,而不是普通的变量),那说明pytorch对这个=
进行了重载。找找源代码
赋值运算符
才会新建一个 Tensor变量,