本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
Inception-V2模型是Inception卷积神经网络系列的第二个版本,它主要加入了BN批归一化来加速神经网络的训练
本文讲解Inception-V2模型的特点以及模型结构、模型配置,并展示Inception-V2卷积神经网络的具体代码实现
通过本文,可以快速了解什么是Inception-V2卷积神经网络,以及如何用代码实现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-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点的修改在结构图中并无体现,可以参考下小节的模型配置表
本节讲解Inception-v2模型的详细配置
Inception-V2卷积神经网络-模型配置与运算
Inception-V2的具体配置与运算流程如下:
通过上述配置,结合上节的模型结构图,就可以非常具体地了解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