LeNet(代码),AlexNet简单介绍,适合新手

写在前面:老兵一个,转行弄深度学习了。我的学习习惯不太好,先上船,后补票。哈哈,用Unet做了一个语义分割的工作试验,感觉效果还不错。就返回头来开始给自己补充深度学习的相关知识吧。看到FCN(应该是语义分割开山之作吧),然后发现需要补充下一些其他知识。就对传统的网络做一个总结吧。小白总结,如有错误,大神帮忙指出,谢谢!!。

 

1.LeNet

直接在书本上盗图,加了点自己的注释。实现语句用pytorch

说明:

a.第一次卷积过程:nn.Conv2d(1, 6,5,0)#就是输入通道1,输出通道6,卷积核大小5*5,不做边界填充。其他类似对应看。具体Conv2d查查就好,网上一堆介绍。

b.第一次池化:Maxpool2d(2,2)   #就是选2*2中最大的值呗

c.后面的卷积池化与上面缩写类似。

d.全连接层。就是将16*5*5 = 400个数乘权重再加上偏置项再累加然后投放到1*120这个数组里去,后面的全连接类似。

注意1:第二次池化过程中14*14*6这么大的图去做卷积 卷积核大小是5*5*6,最终结果是10*10*16 。 这个16 是说用了16个大小为5*5*6的卷积核对原图(14*14*6)做了16次卷积。 每次卷积结果是10*10*6 然后将各通道对应位置值相加,得到个10*10*1的图。这样的图有16个,所以最终输出是16*10*10。希望别被我绕模糊了.....

注意2:卷积核的大小以及深度是我们人为设定的,是输入参数,卷积核中的具体内容 例如5*5*1这个卷积核 这25个具体值是多少,这个是需要网络去学习的。

简单总结就是:原图->卷积->池化->卷积->池化->全连接>全连接->全连接

Lenet代码:运行 pytorch lenet.py 即可。可以清晰看到数据的维度变化情况

import torch
from torch import nn, optim
from torch.autograd import Variable
from torch.utils.data import DataLoader


class Lenet(nn.Module):
    def __init__(self):                            
        super(Lenet, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(1, 6, 5, stride=1, padding=0),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(6, 16, 5, stride=1, padding=0),
            nn.MaxPool2d(2, 2)
        )
        self.fc = nn.Sequential(                 
            nn.Linear(400, 120),
            nn.Linear(120, 84),
            nn.Linear(84, 10)
        )
        
    def forward(self, x):
        out = self.conv(x)
        print("conv shape = ", out.shape)			
        out = out.view(out.size(0), -1)
        print("view shape = ", out.shape)
        out = self.fc(out)
        print("out shape = ", out.shape)					
        return out


if __name__ == "__main__":
    x = torch.randn(1, 1, 32, 32)

    net = Lenet()
    print("x shape = ", x.shape)
    
    out = net(x)
    

挂个连接 主要说参数量计算问题的LeNet论文阅读:LeNet结构以及参数个数计算_silent56_th的博客-CSDN博客

2.AlexNet

网络包含8个带权重的层;前5层是卷积层,剩下的3层是全连接层。最后一层全连接层的输出是1000维softmax的输入,softmax会产生1000类标签的分布网络包含8个带权重的层;前5层是卷积层,剩下的3层是全连接层。最后一层全连接层的输出是1000维softmax的输入,softmax会产生1000类标签的分布.

  • 卷积层C1

  • 该层的处理流程是: 卷积-->ReLU-->池化-->归一化。

    • 卷积,输入是227×227,使用96个11×11×3的卷积核,得到的FeatureMap为55×55×96。
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中。
    • 池化,使用3×33×3步长为2的池化单元(重叠池化,步长小于池化单元的宽度),输出为27×27×96((55−3)/2+1=27)
    • 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为27×27×96,输出分为两组,每组的大小为27×27×48
  • 卷积层C2
    该层的处理流程是:卷积-->ReLU-->池化-->归一化

    • 卷积,输入是2组27×27×48。使用2组,每组128个尺寸为5×5×48的卷积核,并作了边缘填充padding=2,卷积的步长为1. 则输出的FeatureMap为2组,每组的大小为27×27 times128
    • . ((27+2∗2−5)/1+1=27)
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
    • 池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为(27−3)/2+1=13,输出为13×13×256
    • 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为13×13×256,输出分为2组,每组的大小为13×13×128
  • 卷积层C3
    该层的处理流程是: 卷积-->ReLU

    • 卷积,输入是13×13×256,使用2组共384尺寸为3×3×256的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13 times384
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
  • 卷积层C4
    该层的处理流程是: 卷积-->ReLU
    该层和C3类似。

    • 卷积,输入是13×13×384,分为两组,每组为13×13×192.使用2组,每组192个尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13 times384,分为两组,每组为13×13×192
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
  • 卷积层C5
    该层处理流程为:卷积-->ReLU-->池化

    • 卷积,输入为13×13×384,分为两组,每组为13×13×192。使用2组,每组为128尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13×256
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
    • 池化,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为 (13−3)/2+1=6,即池化后的输出为6×6×256
  • 全连接层FC6
    该层的流程为:(卷积)全连接 -->ReLU -->Dropout

    • 卷积->全连接: 输入为6×6×256,该层有4096个卷积核,每个卷积核的大小为6×6×256。由于卷积核的尺寸刚好与待处理特征图(输入)的尺寸相同,即卷积核中的每个系数只与特征图(输入)尺寸的一个像素值相乘,一一对应,因此,该层被称为全连接层。由于卷积核与特征图的尺寸相同,卷积运算后只有一个值,因此,卷积后的像素层尺寸为4096×1×1,即有4096个神经元。
    • ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
    • Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
  • 全连接层FC7
    流程为:全连接-->ReLU-->Dropout

    • 全连接,输入为4096的向量
    • ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
    • Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
  • 输出层
    第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出1000个float型的值,这就是预测结果。

  • 3.VGGNet

  • 缺个图 晚上去盗图然后贴上来

  • 可见 就是卷积 卷积 池化  卷积  卷积 池化 这种方式吧

  • VGG16包含16层,VGG19包含19层。一系列的VGG在最后三层的全连接层上完全一样,整体结构上都包含5组卷积层,卷积层之后跟一个MaxPool。所不同的是5组卷积层中包含的级联的卷积层越来越多。

    AlexNet中每层卷积层中只包含一个卷积,卷积核的大小是7*7,。在VGGNet中每层卷积层中包含2~4个卷积操作,卷积核的大小是3*3,卷积步长是1,池化核是2*2,步长为2,。VGGNet最明显的改进就是降低了卷积核的尺寸,增加了卷积的层数。


    使用多个较小卷积核的卷积层代替一个卷积核较大的卷积层,一方面可以减少参数,另一方面作者认为相当于进行了更多的非线性映射,增加了网络的拟合表达能力。 
     

这个链接对数据具体怎么卷的 说的更清晰 

【模型解读】从LeNet到VGG,看卷积+池化串联的网络结构

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeNetAlexNet和VGG都是经典的卷积神经网络模型,但是它们在模型结构和参数数量等方面有很大的区别。 1. 模型结构上的区别: LeNet是一个比较浅的神经网络模型,主要由两个卷积层和三个全连接层组成,适用于较小的图像分类任务。AlexNet是一个比较深的神经网络模型,主要由多个卷积层和全连接层组成,网络结构更加复杂,适用于较大的图像分类任务。VGG也是一个比较深的神经网络模型,其网络层数更多,网络结构更加复杂,同时也适用于较大的图像分类任务。 2. 参数数量上的区别: 由于AlexNet和VGG模型结构更加复杂,所以其参数数量也更多。以VGG16为例,它包含了16个卷积层和3个全连接层,总共有约1.38亿个参数;而LeNet只有几百万个参数。 3. 卷积核大小和数量上的区别: LeNet模型中的卷积核大小较小,主要采用5x5的卷积核;AlexNet和VGG模型中的卷积核大小较大,主要采用3x3的卷积核。此外,VGG模型中卷积核的数量也更多,多达几十个,以提高模型的特征提取能力。 4. 使用场景上的区别: 由于模型结构和参数数量等方面的差异,LeNet适用于小规模的图像分类任务;AlexNet适用于大规模的图像分类任务;VGG适用于更大规模的图像分类任务,并且在多个计算机视觉任务中都取得了很好的效果。 总的来说,这三个经典的卷积神经网络模型都有其独特的特点和优势,需要根据具体的应用场景来选择合适的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值