专栏首页Deep learning进阶路pytorch进行CIFAR-10分类(4)训练

pytorch进行CIFAR-10分类(4)训练

1、简述

经过前面的数据加载和网络定义后,就可以开始训练了,这里会看到前面遇到的一些东西究竟在后面会有什么用,所以这一步希望各位也能仔细研究一下

2、代码

for epoch in range(2):  # loop over the dataset multiple times 指定训练一共要循环几个epoch

    running_loss = 0.0  #定义一个变量方便我们对loss进行输出
    for i, data in enumerate(trainloader, 0): # 这里我们遇到了第一步中出现的trailoader,代码传入数据
                                              # enumerate是python的内置函数,既获得索引也获得数据,详见下文
        # get the inputs
        inputs, labels = data   # data是从enumerate返回的data,包含数据和标签信息,分别赋值给inputs和labels

        # wrap them in Variable
        inputs, labels = Variable(inputs), Variable(labels) # 将数据转换成Variable,第二步里面我们已经引入这个模块
                                                            # 所以这段程序里面就直接使用了,下文会分析
        # zero the parameter gradients
        optimizer.zero_grad()                # 要把梯度重新归零,因为反向传播过程中梯度会累加上一次循环的梯度

        # forward + backward + optimize      
        outputs = net(inputs)                # 把数据输进网络net,这个net()在第二步的代码最后一行我们已经定义了
        loss = criterion(outputs, labels)    # 计算损失值,criterion我们在第三步里面定义了
        loss.backward()                      # loss进行反向传播,下文详解
        optimizer.step()                     # 当执行反向传播之后,把优化器的参数进行更新,以便进行下一轮

        # print statistics                   # 这几行代码不是必须的,为了打印出loss方便我们看而已,不影响训练过程
        running_loss += loss.data[0]         # 从下面一行代码可以看出它是每循环0-1999共两千次才打印一次
        if i % 2000 == 1999:    # print every 2000 mini-batches   所以每个2000次之类先用running_loss进行累加
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))  # 然后再除以2000,就得到这两千次的平均损失值
            running_loss = 0.0               # 这一个2000次结束后,就把running_loss归零,下一个2000次继续使用

print('Finished Training')

3、分析

①autograd

在第二步中我们定义网络时定义了前向传播函数,但是并没有定义反向传播函数,可是深度学习是需要反向传播求导的,

Pytorch其实利用的是Autograd模块来进行自动求导,反向传播。

以上链接详细讲述了variable究竟是怎么能够实现自动求导的,怎么用它来实现反向传播的。

这里涉及到计算图的相关概念,这里我不详细讲,后面会写相关博文来讨论这个东西,暂时不会对我们理解这个程序造成影响

只说一句,想要计算各个variable的梯度,只需调用根节点的backward方法,Autograd就会自动沿着整个计算图进行反向计算

而在此例子中,根节点就是我们的loss,所以:

程序中的loss.backward()代码就是在实现反向传播,自动计算所有的梯度。

所以训练部分的代码其实比较简单:

running_loss和后面负责打印损失值的那部分并不是必须的,所以关键行不多,总得来说分成三小节

第一节:把最开始放在trainloader里面的数据给转换成variable,然后指定为网络的输入;

第二节:每次循环新开始的时候,要确保梯度归零

第三节:forward+backward,就是调用我们在第三步里面实例化的net()实现前传,loss.backward()实现后传

每结束一次循环,要确保梯度更新

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 生成对抗网络GAN系列(四)LSGAN---最小二乘GAN

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    TeeyoHuang
  • C++随记(一)---字符串数组的输入问题

    首先来看一段程序: #include<iostream> using namespace std; int main(){ char name[10],s...

    TeeyoHuang
  • caffe随记(二) --- 数据结构简介

    caffe随记(二) --- 数据结构简介 注:这篇文章博文我写的内容有点多,建议看一下左上角的目录,对本文结构有个大致了解。 1、Blob Blob其实...

    TeeyoHuang
  • 【AI初识境】深度学习中常用的损失函数有哪些?

    这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

    用户1508658
  • 深度学习中常用的损失函数loss有哪些?

    这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

    小草AI
  • CenterNet之loss计算代码解析

    本文主要讲解CenterNet的loss,由偏置部分(reg loss)、热图部分(heatmap loss)、宽高(wh loss)部分三部分loss组成,附...

    BBuf
  • 二分类语义分割损失函数

    1 - softmax 交叉熵损失函数(softmax loss,softmax with cross entroy loss)

    AIHGF
  • GAN对抗网络入门教程

    译:A Beginner's Guide to Generative Adversarial Networks (GANs) https://skymind.a...

    致Great
  • 目标检测损失函数Loss大盘点

    在one-stage检测算法中,会出现正负样本数量不平衡以及难易样本数量不平衡的情况,为了解决则以问题提出了focal loss。

    Amusi
  • 样本混进了噪声怎么办?通过Loss分布把它们揪出来!

    当训练样本中混有噪音,就很容易让模型过拟合,学习到错误的信息,因此必须加以干涉,来控制噪音带来的影响。这方面的研究,主要集中于“损失修正”方法,即loss co...

    beyondGuo

扫码关注云+社区

领取腾讯云代金券