调参侠带你入门深度学习: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分类实战:模型的构建的主要内容,如果未能解决你的问题,请参考以下文章