pytorch笔记 <三>

optimizer.zero_grad()

将梯度变为0,用于每个batch最开始,因为梯度在不同batch之间不是累加的,所以必须在每个batch开始的时候初始化累计梯度,重置为0.

for epoch in range(num_epoches):# 每个epoch
for inputs,labels in dataloader:# 每个batch
optimizer.zero_grad()# 初始化梯度
outputs = model(inputs)# 正向
_,pred = torch.max(outputs,1)
loss = criterion(inputs,pred)# 计算loss
#...
loss.backward() # 反向
optimizer.step()# 更新权重

torch.max()

在某个dim上返回最大的值以及在该dim上的索引,所以是返回两个值。

max(input, dim, keepdim=False, out=None)

>>> import torch
>>> a = torch.randn(3,3)
>>> print(torch.max(a,1))
(tensor([1.0404, 1.8460, 0.5961]), tensor([2, 1, 0]))

model(x)输出的是概率,要获得类别必须通过torch.max来获得,但是我们求loss的时候还是求网络输出概率与label的loss,因为我们的label是被one-hot编码的,所以这两者的loss才是有效的,因为交叉熵衡量的是两个概率分布之间的相似度。

optimizer.step() 以及 scheduler.step()

optimizer.step()用在每个batch内,当一个batch的数据计算完之后,通过optimizer.step()函数来完成权重的更新,而scheduler.step()用在每个epoch内,当一个epoch的数据运算完之后,调用一下这个函数,以此来决策是否更新我们的learning_rate超参等。

exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
# 每隔step_size个epoch learning_rate变为原来的0.1
# 然后在一个epoch之后执行
exp_lr_scheduler.step()

最新文章

  1. cglib动态新增类方法
  2. DevExpress中设置PanelControl背景的方法
  3. Application Initialization Module for IIS 7.5
  4. Android 5.x特性概览三
  5. TFS 配置 报表权限问题
  6. app 性能优化的那些事
  7. html背景自动移动
  8. C++ notes for beginners(2)
  9. WPF后台访问XAML元素
  10. uva 1391 Astronauts(2-SAT)
  11. TypeScript环境搭建
  12. MSMQ是什么?
  13. javascript设计模式——中介者模式
  14. cf24D. Broken robot(高斯消元)
  15. [转] js中的事件委托或是事件代理详解
  16. Python学习(十六)—— 数据库
  17. javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段
  18. Vue中directives的用法
  19. manacher算法求最长回文子序列
  20. &quot;废物利用&quot;也抄袭——废旧喷墨打印机和光驱DIY&quot;绘图仪&quot;

热门文章

  1. 如何使用线程安全的HashMap
  2. Autel MaxiSYS Pro Diagnostic System
  3. my27_OGG MySQL To MySQL错误汇总
  4. linux的shell脚本
  5. docker 镜像保存为文件及从文件导入镜像的方法
  6. vue首次赋值不触发watch(deep immediate handler)
  7. appium使用常见问题汇总--持续更新
  8. c++ 封装线程库 0
  9. Turing Year 2012
  10. [inner] bug