深度学习-一篇入门

【模型】一篇入门之-Inception-V2卷积神经网络

作者 : 老饼 发表日期 : 2024-03-04 19:15:00 更新日期 : 2024-11-01 22:18:09
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



Inception-V2模型是Inception卷积神经网络系列的第二个版本,它主要加入了BN批归一化来加速神经网络的训练

本文讲解Inception-V2模型的特点以及模型结构、模型配置,并展示Inception-V2卷积神经网络的具体代码实现

通过本文,可以快速了解什么是Inception-V2卷积神经网络,以及如何用代码实现Inception-V2模型





     01. Inception-V2模型是什么     





本节介绍Inception-V2模型的背景和核心内容等等





       Inception-V2卷积神经网络是什么   


Inception-V2模型是继Inception-V1之后,2015年Sergey Ioffe和Christian Szegedy提出的Inception卷积神经网络
 Inception-V2原文:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Inception-V2模型原文的核心是提出BN(Batch Normalization)批归一化层来加速深度学习中神经网络的训练
 BN批归一化的原理是通过解决训练中协变量偏移问题,从而加速多层神经网络的训练,详见《BN批归一化》
原文在Inception-V1中加入了BN层,并进行相关修改,从而演变出Inception-V2模型
Inception-V2卷积神经网络的模型结构具体如下:

 Inception-V2卷积神经网络的模型结构  
 Inception-V2模型由Inception-V1修改得到,InceptionV2相对V1网络结构的修改如下:
  一、模块修改                                                                                                               
  1.Inception模块的修改:使用了Inception-V2模块(用两个3×3替代V1的5×5)
2.归一化模块的修改:用BN模块替代了LRN                                                  
  二、结构与配置修改                                                                                                     
 
1.所有非线性函数之前加入了BN层(并去除了C1、C2层的LRN)                        
2.C2层去掉了1×1的降维卷积                                                                       
3.C3层增加了一个inception                                                                        
4.Inception内部有部分使用了avg-pool(v1中全用max-pool)                       
5.修改了各个Inception的输出通道配置                                                        
                    备注:4、5点的修改在结构图中并无体现,可以参考下小节的模型配置表                  









     02. Inception-V2模型-详细配置     





本节讲解Inception-v2模型的详细配置





      Inception-V2卷积神经网络-模型配置与运算     


Inception-V2的具体配置与运算流程如下:
 
Inception-V2模型的具体配置 
通过上述配置,结合上节的模型结构图,就可以非常具体地了解Inception-v2模型的具体细节








     03. Inception-V2-代码实现     




本节展示Inception-V2模型的代码实现




    Inception-V2-代码实现     


要实现Inception-V2模型,只需要定义好Inception模块,然后再按模型的主流程进行各层的配置就可以了
 具体代码如下:
# 本代码用于实现Inception-V2模型
# 转载请说明来自 《老饼讲解-深度学习》 www.bbbdata.com
from   torch import nn
import torch
# 定义带BN和ReLu的卷积
class CovWithBNReLu(nn.Module):
    def __init__(self,in_channels,out_channels,k,s,p):
        super(CovWithBNReLu, self).__init__()
        self.stack = nn.Sequential(
        nn.Conv2d(in_channels ,out_channels, kernel_size=k,stride=s,padding=p),
        nn.BatchNorm2d(out_channels),
        nn.ReLU(inplace=True)
        )
    def forward(self, x):
        return self.stack(x)   
        
# InceptionV2模块
class Inception2(nn.Module):
    def __init__(self,C,C1,C2,C3,C4,pool='max'):
        # C:输入通道数,C1,C2,C3,C4分别是四条路线的输出通道数
        super(Inception2, self).__init__()
        
        # 1*1卷积部分(支持0输出通道)
        self.R1 = CovWithBNReLu(C,C1,k=1,s=1,p=0) if(C1>0)  else None
        # 3*3卷积部分
        self.R2 = nn.Sequential(CovWithBNReLu(C ,C2[0],k=1,s=1,p=0),
                                CovWithBNReLu(C2[0],C2[1],k=3,s=1,p=1))
        # 双层3*3卷积部分
        self.R3 = nn.Sequential(CovWithBNReLu(C ,C3[0],k=1,s=1,p=0),
                                CovWithBNReLu(C3[0],C3[1],k=3,s=1,p=1),
                                CovWithBNReLu(C3[1],C3[2],k=3,s=1,p=1))    
        # 池化部分(支持屏蔽降维卷积)
        if(pool=='max'):
            P = nn.MaxPool2d(kernel_size=3,stride=1,padding=1)
        else:
            P = nn.AvgPool2d(kernel_size=3,stride=1,padding=1)
        self.R4 = P if(C4==None) else nn.Sequential(P, CovWithBNReLu(C,C4, k=1,s=1,p=0))

    def forward(self, x):
        y1 =self.R1(x) if self.R1!=None else None
        y2 =self.R2(x)
        y3 =self.R3(x)
        y4 =self.R4(x)
        if (y1 !=None):
            y  = torch.cat((y1,y2, y3, y4), dim=1)
        else :
            y  = torch.cat((y2, y3, y4), dim=1)
        return y
 # InceptionV2卷积神经网络的结构
class InceptionNet2(nn.Module):
    def __init__(self,in_channel,num_classes):
        super(InceptionNet2, self).__init__()
        self.nn_stack=nn.Sequential(
            #--------------C1层-------------------
            nn.Conv2d(in_channel,64, kernel_size=7,stride=2,padding=3),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),  
            nn.MaxPool2d(kernel_size=3,stride=2),
            # 输出56*56*64
            #--------------C2层-------------------
            nn.Conv2d(64,192, kernel_size=3,stride=1,padding=1),
            nn.BatchNorm2d(192),
            nn.ReLU(inplace=True),  
            nn.MaxPool2d(kernel_size=3,stride=2,padding=1),
            # 输出28*28*192
            #--------------C3层-------------------
            Inception2(C=192,C1=64,C2=[64,64],C3=[64,96,96],C4=32,pool='avg'),
            Inception2(C=256,C1=64,C2=[64,96],C3=[64,96,96],C4=64,pool='avg'),
            Inception2(C=320,C1=0,C2=[128,160],C3=[64,96,96],C4=None,pool='max'),
            nn.MaxPool2d(kernel_size=3,stride=2,padding=1),
            # 输出14*14*576
            #--------------C4层-------------------
            Inception2(C=576,C1=224,C2=[64,96],C3=[96,128,128],C4=128,pool='avg'),
            Inception2(C=576,C1=192,C2=[96,128],C3=[96,128,128],C4=128,pool='avg'),
            Inception2(C=576,C1=128,C2=[128,160],C3=[128,160,160],C4=128,pool='avg'),
            Inception2(C=576,C1=64,C2=[128,192],C3=[160,192,192],C4=128,pool='avg'),
            Inception2(C=576,C1=0,C2=[128,192],C3=[192,256,256],C4=None,pool='max'),
            nn.MaxPool2d(kernel_size=3,stride=2,padding=1),
            # 输出7*7*1024
            #--------------C5层-------------------
            Inception2(C=1024,C1=352,C2=[192,320],C3=[160,224,224],C4=128,pool='avg'),
            Inception2(C=1024,C1=352,C2=[192,320],C3=[192,224,224],C4=128,pool='max'),
            nn.AvgPool2d(kernel_size=7,stride=1),
            # 输出1*1024*1*1
            #--------------全连接层F6----------
            nn.Flatten(),       
            nn.Linear(1024, num_classes)
            )
    def forward(self, x):
        p = self.nn_stack(x)
        return p
# ------测试模型---------
x = torch.rand(1,3,224,224)
model = InceptionNet2(in_channel =3,num_classes=10)
y= model(x)
这里只展示Inception-v2模型的代码实现,具体训练可借鉴Inception-v1模型







以上就是Inception-V2模块的全部内容了~








 End 




联系老饼