pytorch复习笔记--loss.backward()、optimizer.step()和optimizer.zero_grad()的用法
创始人
2024-03-05 01:17:55
0

目录

1--loss.backward()的用法

2--optimizer.step()的用法

3--optimizer.zero_grad()的用法

4--举例说明

5--参考


1--loss.backward()的用法

作用:将损失loss向输入测进行反向传播;这一步会计算所有变量x的梯度值 \small \frac{d}{dx}loss,并将其累积为\small x*grad 进行备用,即 \small x*grad=(x*grad)_{pre}+\frac{d}{dx}loss ,公式中的 \small (x*grad)_{pre} 指的是上一个epoch累积的梯度。

2--optimizer.step()的用法

作用:利用优化器对参数x进行更新,以随机梯度下降SGD为例,更新的公式为:\small x = x - lr*(x*grad),lr 表示学习率 learning rate,减号表示沿着梯度的反方向进行更新;

3--optimizer.zero_grad()的用法

作用:清除优化器关于所有参数x的累计梯度值 \small x*grad,一般在loss.backward()前使用,即清除 \small (x*grad)_{pre}

4--举例说明

① 展示 loss.backward() 和 optimizer.step() 的用法:

import torch# 初始化参数值x
x = torch.tensor([1., 2.], requires_grad=True)# 模拟网络运算,计算输出值y
y = 100*x# 定义损失
loss = y.sum() print("x:", x)
print("y:", y)
print("loss:", loss)print("反向传播前, 参数的梯度为: ", x.grad)
# 进行反向传播
loss.backward()  # 计算梯度grad, 更新 x*grad    
print("反向传播后, 参数的梯度为: ", x.grad)# 定义优化器
optim = torch.optim.SGD([x], lr = 0.001) # SGD, lr = 0.001print("更新参数前, x为: ", x) 
optim.step()  # 更新x
print("更新参数后, x为: ", x)

② 展示不使用 optimizer.zero_grad() 的梯度:

import torch# 初始化参数值x
x = torch.tensor([1., 2.], requires_grad=True)# 模拟网络运算,计算输出值y
y = 100*x# 定义损失
loss = y.sum() print("x:", x)
print("y:", y)
print("loss:", loss)print("反向传播前, 参数的梯度为: ", x.grad)
# 进行反向传播
loss.backward()  # 计算梯度grad, 更新 x*grad    
print("反向传播后, 参数的梯度为: ", x.grad)# 定义优化器
optim = torch.optim.SGD([x], lr = 0.001) # SGD, lr = 0.001print("更新参数前, x为: ", x) 
optim.step()  # 更新x
print("更新参数后, x为: ", x)# 再进行一次网络运算
y = 100*x# 定义损失
loss = y.sum()# 不进行optimizer.zero_grad()
loss.backward()  # 计算梯度grad, 更新 x*grad 
print("不进行optimizer.zero_grad(), 参数的梯度为: ", x.grad)

③ 展示使用 optimizer.zero_grad() 的梯度:

import torch# 初始化参数值x
x = torch.tensor([1., 2.], requires_grad=True)# 模拟网络运算,计算输出值y
y = 100*x# 定义损失
loss = y.sum() print("x:", x)
print("y:", y)
print("loss:", loss)print("反向传播前, 参数的梯度为: ", x.grad)
# 进行反向传播
loss.backward()  # 计算梯度grad, 更新 x*grad    
print("反向传播后, 参数的梯度为: ", x.grad)# 定义优化器
optim = torch.optim.SGD([x], lr = 0.001) # SGD, lr = 0.001print("更新参数前, x为: ", x) 
optim.step()  # 更新x
print("更新参数后, x为: ", x)# 再进行一次网络运算
y = 100*x# 定义损失
loss = y.sum()# 进行optimizer.zero_grad()
optim.zero_grad()
loss.backward()  # 计算梯度grad, 更新 x*grad 
print("进行optimizer.zero_grad(), 参数的梯度为: ", x.grad)

通过②和③的对比,能看出 optimizer.zero_grad() 的作用是清除之前累积的梯度值。

5--参考

参考1

相关内容

热门资讯

快乐的暑假生活作文 快乐的暑假生活作文三篇  在日常学习、工作抑或是生活中,大家都不可避免地会接触到作文吧,作文是一种言...
512国际护士节的由来 512国际护士节的由来  国际护士节是每年的5月12日,是为纪念现代护理学科的创始人弗洛伦斯·南丁格...
国庆节的作文300字 关于国庆节的作文300字5篇  在日复一日的学习、工作或生活中,大家都不可避免地会接触到作文吧,作文...
端午节的作文 端午节的作文500字(精选73篇)  在日常生活或是工作学习中,许多人都有过写作文的经历,对作文都不...
六一儿童节优秀作文300字 六一儿童节优秀作文300字(精选26篇)  在日常学习、工作抑或是生活中,大家都经常看到作文的身影吧...
妈妈的网购生活作文600字 妈妈的网购生活作文600字 (精选15篇)  在平日的学习、工作和生活里,大家或多或少都会接触过作文...
那一盏灯作文 关于那一盏灯作文(精选39篇)  在平时的学习、工作或生活中,许多人都有过写作文的经历,对作文都不陌...
春节趣事作文600字 【热门】春节趣事作文600字三篇  在平平淡淡的日常中,大家最不陌生的就是作文了吧,借助作文人们可以...
二年级看图写话植树节作文 二年级看图写话植树节作文  春天到了,小明和小花一起到山上去种树。接下来是小编为你带来收集整理的二年...
快乐的圣诞节作文500字 【精选】快乐的圣诞节作文500字集合8篇  无论是身处学校还是步入社会,大家都写过作文吧,作文要求篇...
温暖是冬日里的一缕阳光 温暖... 温暖是冬日里的一缕阳光 关于温暖的作文温暖爷爷走的那年,我还不满九岁。也许是天意吧,那天我本该在学校...
又是一年三月三作文500字 又是一年三月三作文500字  杨柳依依,春风徐徐,放风筝的季节又到了!  周末,天格外的明朗,正好比...
我的一次选择作文600字 我的一次选择作文600字第1篇我的一次选择作文600字  生活中我们缺少不了选择,只有经历过,你才能...
感恩母亲节优秀作文 感恩母亲节优秀作文  在日常的学习、工作、生活中,大家总少不了接触作文吧,作文是通过文字来表达一个主...
旅游的作文 关于旅游的作文4篇  关于旅游的作文一  寒假假期将至,要打算起草寒假旅游计划了,今年寒假去哪儿?不...
秋天丰收的季节作文 秋天丰收的季节作文(通用53篇)  在日常的学习、工作、生活中,许多人都写过作文吧,借助作文人们可以...
难忘的父亲节优秀作文 难忘的父亲节优秀作文  在我们平凡的日常里,大家都尝试过写作文吧,借助作文人们可以实现文化交流的目的...
春节见闻作文 春节见闻作文15篇  在生活、工作和学习中,大家都有写作文的经历,对作文很是熟悉吧,作文是从内部言语...
暑假周记 【实用】暑假周记锦集10篇  时光飞逝,如梭之日,转眼一周又过去了,我们一定有印象深刻的事情,制定一...
元宵节的作文600字 【精品】元宵节的作文600字8篇  在日常生活或是工作学习中,大家都写过作文吧,写作文是培养人们的观...