VGG网络架构:

VGG16网络由13层卷积层+3层全连接层构成

pytorch 计算图 backward 步骤计算_网络

1.1改进:

1.更小的卷积核,对比AlexNet,VGG网络使用的卷积核大小不超过33,这种结构相比于大卷积核有一个优点,就是两个33的卷积核堆叠对于原图提取特征的感受野(特征图一个像素融合了输入多少像素的信息决定了感受野的大小)相当于一个55的卷积核(如图),在同等感受野的条件下,两个33卷积之间加入激活函数,其非线性能力比单个5*5卷积要强。

pytorch 计算图 backward 步骤计算_pytorch_02


2.更深的网络结构,相比于AlexNet只有5层卷积层,VGG系列加深了网络的深度,更深的结构有助于网络提取图像中更复杂的语义信息。

1.2pytorch复现VGG19

#全连接层分类:
  self.classifier = nn.Sequential(
   nn.Linear(512 * 7 * 7, 4096),
   nn.ReLU(inplace = True),
   nn.Dropout(),
   nn.Linear(4096,4096),
   nn.ReLU(inplace = True),
   nn.Dropout(),
   nn.Linear(4096,num_classes),
   )

 #前向传播
 def forward(self, x):
  x = self.features(x)
  x = x.view(x.size(0), -1)
  x = self.classifier(x)
  return x

1.2.1 小Tips:
当网络的结构重复时,使用for循环构造避免代码形式冗余
将不同功能的网络各自封装到一个大的Sequential模块中,结构分明
卷积操作输出尺寸计算公式:Out=(In-Kernel+2Padding)/Stride+1 (Kernel:卷积核尺寸,Stride:步长,Padding:边界填充) 若要保证输出尺寸和原尺寸一致,Padding可以设置为:Padding = (kernel-1)/2)
池化操作输出尺寸计算公式同卷积操作一致
在实际深度学习框架实现卷积和全连接的计算中,本质都是矩阵运算:
若输入的特征图深度是N,输出特征图深度是M,则卷积核的维度是:NxMxKxK(K为卷积核大小)。因此全卷积网络对输入图像的尺寸没有要求。
全连接层的尺寸和输入的特征尺寸相关(将特征图展平成为一维向量),若输入的特征向量是1xN,输出是1xM,则全连接层的维度是:MxN。

1.2.2 打印网络信息:
使用torch.summary输出网络架构:

vgg19 = VGG19()

#print(vgg19) #输出网络的架构
summary(vgg19, input_size = [(3, 224, 224)]) #输出网络架构,每一层的输出特征尺寸,及网络参数情况

输出网络每一层的尺寸:

for param in vgg19.parameters(): # 输出每一层网络的尺寸
 print(param.size())


batch_size = 16
input = torch.randn(batch_size, 3, 224, 224) #构建一个随机数据,模拟一个batch_size
output = vgg19(input)
print(output.shape)  # torch.Size([16, 1000])