@Xia
Pytorch的backward()与optim.setp()的理解
backward()与optim.setp()一直对这两个函数他们之间的调用不是很清楚,花点时间应该是搞明白了。
先看最简单的bp回归梯度下降的代码
for epoch in range(num_epoch):
for i, data in enumerate(train_loader):
optimizer.zero_grad() # 用 optimizer 將 model 參數的 gradient 歸零
train_pred = model(data[0].cuda()) # 利用 model 得到預測的機率分佈 這邊實際上就是去呼叫 model 的 forward 函數
batch_loss = loss(train_pred, data[1].cuda()) # 計算 loss (注意 prediction 跟 label 必須同時在 CPU 或是 GPU 上)
batch_loss.backward() # 利用 back propagation 算出每個參數的 gradient
optimizer.step() # 以 optimizer 用 gradient 更新參數值
我的疑问
- backward函数到底干了什么?
CSDN有很多资料,backward函数其实就是计算梯度,只是计算。
x=th.ones(1,requires_grad=True)
z=x+1
y=z**3
t=y+2
m=t*6
m.backward()
print(x.grad)
输出
tensor([72.])
参考:https://blog.csdn.net/qq_24884193/article/details/109517890
-
那么optim.step()函数做了什么呢?
本质上就是对计算出来的梯度就行最优化,不赘述。 -
Loss函数和backward函数有什么关系?
其实Loss函数就是相当于对CNN网络的输出再进行了一次function(函数),这个function(函数)的输出就叫做loss,我们对loss求backward,即loss.backward(),下面代码就是最简单的例子,只不过m不是卷积神经网络的输出,而是简单的线性函数。
x=th.ones(1,requires_grad=True)
z=x+1
y=z**3
t=y+2
m=t*6
loss=Loss(m) #具体的参数,由不同的Loss函数确定
loss.backward()
- 我看Loss函数的传参并没有传递model的参数,如果保存梯度呢?
这个问题其实上个问题其实可以回答,Loss函数传递的类型是tensor,其中包括grad属性,用来保存对应的梯度值。
并且tensor类型会记录网络结构(参考问题3中,对loss计算梯度,可以递归的计算出 loss对x的微分),所以虽然计算Loss没有传递model参数,但实际上tensor类型的参数中已经有了。