一些经典CNN模型的笔记

一、关于AlexNet的一些记录

池化疑问

在AlexNet的第5层卷积之后,池化层是采用了3*3大小的窗口,将13*13的特征图池化为6*6的的特征图。但在我的印象中池化层的stride应该等于窗口大小,但这里如果采用stride=3来计算(按公式1-1计算)得到的结果将是4*4的特征图不可能是6*6,这点可以通过以下实验证明。
o u t p u t S i z e = N w + 2 p − F S + 1 (1-1) outputSize = \cfrac{N_w+2p-F}{S} +1 \tag{1-1} outputSize=SNw+2pF+1(1-1)

import torch
import torch.nn.functional as F

x = torch.rand(1,13,13)
print(x.size())
x = F.max_pool2d(x,(3,3))
print(x.size())
torch.Size([1, 13, 13])
torch.Size([1, 4, 4])

那么为什么AlexNet的结果为6*6呢?

经过查阅资料,我发现池化层也是可以使用stride的,这里AlexNet就是将stride定为2,代码演示如下:

import torch
import torch.nn.functional as F
x = torch.rand(1,13,13)
print(x.size())
x = F.max_pool2d(x,(3,3),stride=2)
print(x.size())
torch.Size([1, 13, 13])
torch.Size([1, 6, 6])

将stride指定为2后输出就变成了6*6的特征图

二、VGGNet

VGGNet中提到,使用多个小核可以替代一个大核,且可以使得参数更少,我们来探究探究。


例子:VGG使用了多个3*3的卷积代替AlexNet中11*11和5*5的卷积。
使用第一章的公式计算在stride=1,无padding的情况下5*5的特征图经过3*3的卷积核处理得到3*3的特征图,再通过一层3*3的卷积处理得到一个1*1的特征图结果的形状上是与直接进行5*5的卷积核处理一致的,但实际情况如何呢?下面用实验探究。

import torch

x = torch.rand(1,1,5,5)
print(x)
# 两个3*3卷积
conv1 = torch.nn.Conv2d(1,1,(3,3),stride=1)
conv2 = torch.nn.Conv2d(1,1,(3,3),stride=1)
# 一个5*5的卷积
conv3 = torch.nn.Conv2d(1,1,(5,5),stride=1)
# 经两层3*3卷积处理后结果
x1=conv2(conv1(x))
print("两层3*3处理的结果",x1)
x2=conv3(x)
print("一层5*5处理的结果",x2)
tensor([[[[0.0183, 0.8878, 0.6303, 0.8723, 0.9259],
          [0.8087, 0.9912, 0.6360, 0.2854, 0.5054],
          [0.1413, 0.4761, 0.8507, 0.9144, 0.0427],
          [0.5313, 0.1154, 0.9414, 0.8478, 0.6868],
          [0.4613, 0.1215, 0.7516, 0.3255, 0.5985]]]])
两层3*3处理的结果 tensor([[[[-0.5261]]]], grad_fn=<ConvolutionBackward0>)
一层5*5处理的结果 tensor([[[[0.3986]]]], grad_fn=<ConvolutionBackward0>)

虽然这种实验方法很不严谨,因为卷积核中的每个参数都是以正态分布随机生成的所以两种处理方式的结果可能会想差很大,但可以猜想的是,在无padding的情况下,两个3*3卷积核对特征图中央元素的计算次数一定大于5*5的卷积核处理方式。在模型训练过程中随着卷积核中参数的调整两个3*3卷积核应该也能达到5*5卷积核的效果,而两个3*3的卷积核的参数个数为通道数*9*2,若输入为三通道则需要54个参数,若为5*5的卷积核则需要25*3=75个参数,这样看来,小核替代大核确实是减少了模型的参数个数。

三、ResNet

为了解决较深神经网络训练不动的问题,ResNet提出在两层以及两层以上的结点添加一条shortcut使得原本的输出 f ( g ( x ) ) f(g(x)) f(g(x))变为 f ( g ( x ) ) + g ( x ) f(g(x))+g(x) f(g(x))+g(x),在求梯度时变为 ∂ f ( g ( x ) ) ∂ g ( x ) ⋅ ∂ g ( x ) ∂ x + ∂ g ( x ) ∂ x \cfrac{\partial f(g(x))}{\partial g(x)}\cdot\cfrac{\partial g(x)}{\partial x}+\cfrac{\partial g(x)}{\partial x} g(x)f(g(x))xg(x)+xg(x),使得在网络更深的情况下梯度不会消失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值