Python 梯度是没有的

Python 梯度是没有的,python,pytorch,Python,Pytorch,对于以下代码,我希望通过get_grads()获得梯度,但输出总是None,原因是什么 导入火炬 导入torch.nn作为nn 将matplotlib.pyplot作为plt导入 将numpy作为np导入 X=火炬。随机数n(100,1)*10#随机数为100行*1col,*10以使其更大(原始值为0左右的小方差) y=X+3*火炬。randn(100,1)#3*火炬。randn(100,1),是噪音 plt.plot(X.numpy(),y.numpy(),'o') plt.ylabel('y

对于以下代码,我希望通过
get_grads()
获得梯度,但输出总是
None
,原因是什么

导入火炬
导入torch.nn作为nn
将matplotlib.pyplot作为plt导入
将numpy作为np导入
X=火炬。随机数n(100,1)*10#随机数为100行*1col,*10以使其更大(原始值为0左右的小方差)
y=X+3*火炬。randn(100,1)#3*火炬。randn(100,1),是噪音
plt.plot(X.numpy(),y.numpy(),'o')
plt.ylabel('y')
plt.xlabel('x')
LR类(nn.模块):
定义初始大小(自身大小、输入大小、输出大小):
super()。\uuuu init\uuuuu()
self.linear=nn.linear(输入大小、输出大小)
def前进(自身,x):
pred=自线性(x)
返回pred
手电筒。手动种子(1)
型号=LR(1,1)
[w,b]=模型参数()
def get_params():
返回(w[0][0]。项(),b[0]。项()
def get_grads():
返回值(w[0][0]。梯度,b[0]。梯度)
标准=nn.MSELoss()
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
纪元=30
损失=[]
对于范围内的i(历元):
y_pred=模型正向(X)
损失=标准(y_pred,y)
打印(“epoch:,i,“loss:,loss.item())
损失。追加(损失)
optimizer.zero_grad()#清除参数的梯度]
打印(“model=“+str(get_params())+str(get_grads()))
loss.backward()#计算参数的梯度
打印(“model2=“+str(get_params())+str(get_grads()))
optimizer.step()#使用渐变更新参数
打印(“model3=“+str(get_params())+str(get_grads()))
打印()
输出

epoch:0损失:31.3035831451416
模型=(0.5152631998062134,-0.44137823581695557)(无,无)
模型2=(0.5152631998062134,-0.44137823581695557)(无,无)
模型3=(1.447475790977478,-0.4449453055858612)(无,无)
时代:1损失:31.142377853393555
型号=(1.447475790977478,-0.4449453055858612)(无,无)
模型2=(1.447475790977478,-0.4449453055858612)(无,无)
模型3=(0.5188075304031372,-0.41897052526474)(无,无)
时代:2损失:30.982675552368164
型号=(0.5188075304031372,-0.41897052526474)(无,无)
模型2=(0.5188075304031372,-0.41897052526474)(无,无)
模型3=(1.4446537494659424,-0.42287370562553406)(无,无)
时代:3损失:30.824453353881836
型号=(1.4446537494659424,-0.42287370562553406)(无,无)
模型2=(1.4446537494659424,-0.42287370562553406)(无,无)
模型3=(0.5223162770271301,-0.39742958545684814)(无,无)
时代:4损失:30.667678833007812
模型=(0.5223162770271301,-0.39742958545684814)(无,无)
模型2=(0.5223162770271301,-0.39742958545684814)(无,无)
模型3=(1.4418396949768066,-0.40165263414382935)(无,无)
时代:5损失:30.51233673095703
型号=(1.4418396949768066,-0.40165263414382935)(无,无)
模型2=(1.4418396949768066,-0.40165263414382935)(无,无)
模型3=(0.5257899761199951,-0.37672188878059387)(无,无)
时代:6损失:30.35841563637695
型号=(0.5257899761199951,-0.37672188878059387)(无,无)
模型2=(0.5257899761199951,-0.37672188878059387)(无,无)
模型3=(1.439034235565186,-0.3812492787837982)(无,无)
时代:7损失:30.20585632242188
型号=(1.439034235565186,-0.3812492787837982)(无,无)
模型2=(1.439034235565186,-0.3812492787837982)(无,无)
模型3=(0.5292295813560486,-0.35681530833244324)(无,无)
时代:8损失:30.054668426513672
型号=(0.5292295813560486,-0.35681530833244324)(无,无)
模型2=(0.5292295813560486,-0.35681530833244324)(无,无)
模型3=(1.4362375736236572,-0.361631086883545)(无,无)
时代:9损失:29.904821395874023
型号=(1.4362375736236572,-0.3616321086883545)(无,无)
模型2=(1.4362375736236572,-0.361631086883545)(无,无)
模型3=(0.532635509967804,-0.3376788794994354)(无,无)
时代:10损失:29.756284713745117
型号=(0.532635509967804,-0.3376788794994354)(无,无)
模型2=(0.532635509967804,-0.3376788794994354)(无,无)
模型3=(1.4334499835968018,-0.3427707254886627)(无,无)
纪元:11损失:29.609052658081055
型号=(1.4334499835968018,-0.3427707254886627)(无,无)
模型2=(1.4334499835968018,-0.3427707254886627)(无,无)
模型3=(0.5360085964202881,-0.3192828297615051)(无,无)
...

您需要直接将梯度设置为
w.grad
b.grad
,而不是
w[0][0]。grad
如下所示:

def get_grads():
  return (w.grad, b.grad)
或者也可以直接在训练循环中使用参数的名称来打印其渐变:

print(model.linear.weight.grad)
print(model.linear.bias.grad)

您需要直接获取梯度,即
w.grad
b.grad
,而不是
w[0][0]。grad
如下所示:

def get_grads():
  return (w.grad, b.grad)
或者也可以直接在训练循环中使用参数的名称来打印其渐变:

print(model.linear.weight.grad)
print(model.linear.bias.grad)

只需使用
.data
.grad
属性即可获取您的值,但最好使用
克隆
分离
安全地提取它们,如下所示:

代码:

[w,b]=模型参数()
def get_params():
返回(w.data.clone().detach().item(),b.data.clone().detach().item())
def get_grads():
#如果梯度不是无的,则安全地提取它们:
如果w.grad和b.grad:
返回(w.grad.clone().detach().item(),b.grad.clone().detach().item())
其他:
返回(w.grad,b.grad)
输出:

因此,我们期望在第一次
向后()之前
向后()之后
计算的梯度
向后()
->->在
优化器之后相同
步骤()
->在
之后为零

epoch:0损失:36.44832992553711
模型=(0.5152631998062134,-0.44137823581695557)(无,无)
模型2=(0.5152631998062134,-0.44137823581695557)(-108.91305541992188,0.6554011106491089)
模型3=(1.60439720626831,-0.44793224334716797)(-108.91305541992188,0.6554011106491089)
时代:1损失:43.94552230834961
模型=(1.60439720626831,-0.44793224334716797)(张量([[0.]]),张量([0.]))
模型2=(1.60439720626831,-0.44793224334716797)(122.66950988769531,-2.455918073654175)
模型3=(0.3776986598968506,-0.4233730733394623)(122.669