Pytorch的backward()与optim.setp()的理解

@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 更新參數值

我的疑问

  1. 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

  1. 那么optim.step()函数做了什么呢?
    本质上就是对计算出来的梯度就行最优化,不赘述。

  2. 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()
  1. 我看Loss函数的传参并没有传递model的参数,如果保存梯度呢?
    这个问题其实上个问题其实可以回答,Loss函数传递的类型是tensor,其中包括grad属性,用来保存对应的梯度值。
    并且tensor类型会记录网络结构(参考问题3中,对loss计算梯度,可以递归的计算出 loss对x的微分),所以虽然计算Loss没有传递model参数,但实际上tensor类型的参数中已经有了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值