vscode中使用pytorch,终端中显示GPU版torch可用,编译器输出False。


请问这是为什么,怎么解决
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变量,