怎么在Pytorch中实现一个GoogLeNet方法

  介绍

今天就跟大家聊聊有关怎么在Pytorch中实现一个GoogLeNet方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Pytorch的优点

1. Pytorch是相当简洁且高效快速的框架;2。设计追求最少的封装;3。设计符合人类思维,它让用户尽可能地专注于实现自己的想法;4。与谷歌的Tensorflow类似,公平的支持足以确保Pytorch获得持续的开发更新;5。PyTorch作者亲自维护的论坛供用户交流和求教问题6。入门简单

GoogLeNet也叫InceptionNet,在2014年被提出,如今已到V4版本.GoogleNet比VGGNet具有更深的网络结构,一共有22层,但是参数比AlexNet要少12倍,但是计算量是AlexNet的4倍,原因就是它采用很有效的初始模块,并且没有全连接层。

最重要的创新点就在于使用初始模块,通过使用不同维度的卷积提取不同尺度的特征图。左图是最初的《盗梦空间》模块,右图是使用的1×1得卷积对左图的改进,降低了输入的特征图维度,同时降低了网络的参数量和计算复杂度,称《盗梦空间》为V1。

怎么在Pytorch中实现一个GoogLeNet方法

GoogLeNet在架构设计上为保持低层为传统卷积方式不变,只在较高的层开始用初始模块。

怎么在Pytorch中实现一个GoogLeNet方法

怎么在Pytorch中实现一个GoogLeNet方法

《盗梦空间》V2中将5 x5的卷积改为2个3 x3的卷积,扩大了感受野,原来是5 x5,现在是6 x6.pytorch实现GoogLeNet(《盗梦空间》V2):

& # 39; & # 39; & # 39; GoogLeNet  with  Pytorch强生# 39;& # 39;& # 39;   import 火炬   import  torch.nn  as 神经网络   import  torch.nn.functional  as  F      #,编写卷积+ bn + relu模块   class  BasicConv2d (nn.Module):   def 才能;__init__ (in_channels,自我,还以为,out_channals, * * kwargs):   ,,,超级(BasicConv2d,,自我). __init__ ()   ,,,self.conv =, nn.Conv2d (in_channels, out_channals,, * * kwargs)   ,,,self.bn =, nn.BatchNorm2d (out_channals)      def 才能向前(自我,,x):   ,,,x =, self.conv (x)   ,,,x =, self.bn (x)   ,,,return  F.relu (x)      #,编写《盗梦空间》模块   class 《盗梦空间》(nn.Module):   def 才能;__init__ (in_planes,自我,   ,,,,,,,,,,n1x1 n3x3red,, n3x3,, n5x5red,, n5x5,, pool_planes):   ,,,超级(《盗梦空间》,,自我). __init__ ()   ,,,# 1 x1  conv 分支   ,,,self.b1 =, BasicConv2d (in_planes, n1x1,, kernel_size=1)      ,,,#,1 x1  conv →3 x3  conv 分支   ,,,self.b2_1x1_a =, BasicConv2d (in_planes, n3x3red,,   ,,,,,,,,,,,,,,,,,kernel_size=1)   ,,,self.b2_3x3_b =, BasicConv2d (n3x3red, n3x3,,   ,,,,,,,,,,,,,,,,,kernel_size=3,,填充=1)      ,,,#,1 x1  conv →, 3 x3  conv →3 x3  conv 分支   ,,,self.b3_1x1_a =, BasicConv2d (in_planes, n5x5red,,   ,,,,,,,,,,,,,,,,,kernel_size=1)   ,,,self.b3_3x3_b =, BasicConv2d (n5x5red, n5x5,,   ,,,,,,,,,,,,,,,,,kernel_size=3,,填充=1)   ,,,self.b3_3x3_c =, BasicConv2d (n5x5, n5x5,,   ,,,,,,,,,,,,,,,,,kernel_size=3,,填充=1)      ,,,#,3 x3  pool →1 x1  conv 分支   ,,,self.b4_pool =, nn.MaxPool2d(3,跨步=1,填充=1)   ,,,self.b4_1x1 =, BasicConv2d (in_planes, pool_planes,,   ,,,,,,,,,,,,,,,,kernel_size=1)      def 才能向前(自我,,x):   ,,,y1 =, self.b1 (x)   ,,,y2 =, self.b2_3x3_b (self.b2_1x1_a (x))   ,,,y3 =, self.b3_3x3_c (self.b3_3x3_b (self.b3_1x1_a (x)))   ,,,y4 =, self.b4_1x1 (self.b4_pool (x))   ,,,#,y的维度为(out_channels, batch_size,还以为,C_out L_out]   ,,,#,合并不同卷积下的特征图   ,,,return  torch.cat ([y1, y2,祝福,y3, y4),, 1)         class  GoogLeNet (nn.Module):   def 才能__init__(自我):   ,,,超级(GoogLeNet,,自我). __init__ ()   ,,,self.pre_layers =, BasicConv2d (3, 192,,   ,,,,,,,,,,,,,,,,,,kernel_size=3,,填充=1)      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在Pytorch中实现一个GoogLeNet方法