调参侠带你入门深度学习:Lenet分类实战:模型的构建

Posted 神佑我调参侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调参侠带你入门深度学习:Lenet分类实战:模型的构建相关的知识,希望对你有一定的参考价值。

前言

为什么要再次学习呢?因为我以前都是基于飞桨学的,飞桨实现起来是真的很容易,但是吧,我虽然知道咋实现的,但是我没有能力去将其自己写出来,也不够深入,所以本次学习为了摆脱这种困境,会选择使用其他的框架深入学习!

定义模型

首先我们创建好model.py文件夹:

然后我们先来了解一下Lenet网络,

这个网络是CNN的开山之作,网络结构非常简单,很适合入门。

导入库

import torch.nn as nn #构建网络的库
import torch.nn.functional as F #函数库

书写模型的类

这个类中要包含初始化函数和前向传播函数

class Lenet(nn.Module):#继承构造自定义层的类
    def __init__(self):
        super(Lenet, self).__init__()#父类初始化
        pass

    def forward(self,x):
        pass

这里继承的类的作用是用来自定义构建我们的网络层的,然后super是父类初始化,这就相当于模板,可以套用!

初始化书写

第一个卷积层

在初始化中我们会定义我们需要的网络层,这时就得参照网络结构!

在这个图中我们是使用到了卷积操作,基础知识需要自行去补,然后我们来定义一下卷积层,参数为:通道数,卷积核数量和大小

有个重要的知识点:输出的通道数为卷积核的数量,这里第一次卷积用到的数量是16,作者定义的

self.conv1 = nn.Conv2d(3,16,5)

第一个池化层

self.pool1 = nn.MaxPool2d(2,2)#参数为池化核的大小,作者用的2

然后这里有个细节,就是池化层的大小为2时,原图像直接除以2.

第二个卷积层和池化层同上

这里我们直接给出代码:

 self.conv2 = nn.Conv2d(16,32,5)
 self.pool2 = nn.MaxPool2d(2,2)

3个全连接层

为了进行线性操作且减少计算量,会将二维数据变成一维,具体操作在后面

变成一维后,我们来进行全连接,全连接层的作用就是将我们提取到的特征映射到几个类别上,就是分类器的作用,然后我们来看一下参数怎么来的:

self.fc1 = nn.Linear(32*5*5,120)
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84, 10)

·下面这个图看懂了就全明白了。可以看我的b站视频讲解

前向传播的书写

    def forward(self,x):
        x = F.relu(self.conv1(x))
        x = self.pool1(x)
        x = F.relu(self.conv2(x))
        x = self.pool2(x)
        x = x.view(-1,32*5*5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x) #这个不用激活函数,最后要分类
        return x

这个就是这个网络的前向传播过程,relu是激活函数,为了提高模型的非线性。数据进来,卷积,池化,第二次卷积,池化,将二维转化为一维,3个全连接层,最后一层不要激活函数,因为我们要分类

测试

我们先来看一下模型的结构

import torch
model = Lenet()
print(model)



ok,然后我们输入数据来看一下

总结

那这篇文章,就到这里结束了,本以为我全都理解了,但是通过做笔记,发现了很多不足,这次是真理解了,虽然这种学习方式很慢,但是怎么说呢,质量才是最重要的,我们下篇内容再见!

以上是关于调参侠带你入门深度学习:Lenet分类实战:模型的构建的主要内容,如果未能解决你的问题,请参考以下文章

调参侠带你入门深度学习:Lenet分类实战:模型的构建

调参侠带你入门深度学习:Lenet分类实战:训练与推理

调参侠带你入门深度学习:Lenet分类实战:训练与推理

调参侠带你入门深度学习:Lenet分类实战:训练与推理

深度学习调参侠

yellowbrick牛逼,机器学习“炼丹师”“调参侠”们有福了