zoukankan      html  css  js  c++  java
  • [Pytorch] pytorch笔记 <三>

    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()
    
  • 相关阅读:
    数据库设计中的四个范式(转)
    几个SQL
    一个整形数组,找其中第二大值
    装箱与拆箱
    继承与隐藏方法
    C++/C# 最基本的Marshal和Ptr
    C++/C#结构体转化-传string给C++
    C++/C#结构体转化-二维数组-bytes To Strings
    C# 懒人常用异步方法
    jsplumb 的初次使用
  • 原文地址:https://www.cnblogs.com/aoru45/p/10720981.html
Copyright © 2011-2022 走看看