网络结构综述: 2.AlexNet(2012)

在这里插入图片描述

class AlexNet(BasicModule):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.model_name = 'alexnet'
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )

    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), 256 * 6 * 6)
        x = self.classifier(x)
        return x

参考: https://github.com/yaya325/Classifier

主要创新点

  1. 非线性激活函数: ReLU
  2. 防止过拟合的方法: Dropout, Data augmentation
  3. 大数据训练: imageNet
  4. 高性能计算平台: GPU
  5. 重叠Pooling: kernel_size=3, stride=2
  6. 局部响应归一化(LRN, Local Response Normalization).

ZFNet: AlexNet的改进版
在这里插入图片描述
改进点:提出了可视化特征图和反卷积的概念.

  1. 第一层卷积层的卷积核大小由11x11改为7x7, stride由4x4改为2x2.
  2. 去掉了AlexNet中的group

重点概念:
1. LRN(局部响应归一化Local Response Normalization)
对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。LRN通过在相邻卷积核生成的feature map之间引入竞争,从而有些本来在feature map中显著的特征在A中更显著,而在相邻的其他feature map中被抑制,这样让不同卷积核产生的feature map之间的相关性变小.

在这里插入图片描述
a表示卷积层(包括卷积操作和池化操作)后的输出结果,batch就是批次数(每一批为一张图片),height就是图片高度,width就是图片宽度,channel就是通道数. ai(x,y)表示在这个输出结构中的一个位置[a,b,c,d],可以理解成在某一张图中的某一个通道下的某个高度和某个宽度位置的点,即第a张图的第d个通道下的高度为b宽度为c的点。论文公式中的N表示通道数(channel)。a,n/2,k,α,β分别表示函数中的input,depth_radius,bias,alpha,beta,其中n/2,k,α,β都是自定义的,特别注意一下∑叠加的方向是沿着通道方向的,即每个点值的平方和是沿着a中的第3维channel方向的,也就是一个点同方向的前面n/2个通道(最小为第0个通道)和后n/2个通道(最大为第d-1个通道)的点的平方和(共n+1个点)。而函数的英文注解中也说明了把input当成是d个3维的矩阵,说白了就是把input的通道数当作3维矩阵的个数,叠加的方向也是在通道方向。

公式看上去比较复杂,但理解起来非常简单。i表示第i个核在位置(x,y)运用激活函数ReLU后的输出,n是同一位置上临近的kernal map的数目,N是kernal的总数。参数K,n,alpha,belta都是超参数,一般设置k=2,n=5,aloha=1*e-4,beta=0.75.

在这里插入图片描述

示例:
在这里插入图片描述
假设 (k,α, β, n)=(0,1,1,3) , 则比如橙色的左上角的1经过LRN后,:
1/(1 + 1+ 2^2) = 0.166 约等于0.17.

2. BN(Batch Normalization)(在2015年的Inception V2提出)

在这里插入图片描述
BN 顾名思义, 是batch的样本间的归一化. 对于一个batch 的样本, 计算这个batch样本在每个通道上的均值和方差, 然后归一化.
在这里插入图片描述
在这里插入图片描述
3. Relu
在这里插入图片描述
参考: https://blog.csdn.net/qq_20481015/article/details/85648114?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf

sigmoid函数:
在这里插入图片描述
sigmoid 神经元在值为 0 或 1 的时候接近饱和,这些区域,梯度几乎为 0。因此在反向传播时,这个局部梯度会与整个代价函数关于该单元输出的梯度相乘,结果也会接近为 0 。这样,几乎就没有信号通过神经元传到权重再到数据了,因此这时梯度就对模型的更新没有任何贡献.
sigmoid 函数不是关于原点中心对称的 这个特性会导致后面网络层的输入也不是零中心的,进而影响梯度下降的运作。因为如果输入都是正数的话(如 x>0 中 ),那么关于 w的梯度在反向传播过程中,要么全是正数,要么全是负数(具体依据整个表达式f(x)而定),这将会导致梯度下降权重更新时出现 z 字型的下降.

tanh函数
在这里插入图片描述
tanh 函数同样存在饱和问题,但它的输出是零中心的,因此实际中 tanh 比 sigmoid 更受欢迎.

relu函数
在这里插入图片描述

ReLu激活函数的梯度为1,而且只有在x的右半轴才饱和,这样使梯度可以很好的反向传播中传递, 不但提高了网络的训练速度也避免了因为梯度消失导致的网络退化.

ReLU 的缺点是,它在训练时比较脆弱并且可能“死掉”
举例来说:一个非常大的梯度经过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这种情况发生,那么从此所有流过这个神经元的梯度将都变成 0 。这个 ReLU 单元在训练中将不可逆转的死亡,导致了数据多样化的丢失。实际中,如果学习率设置得太高,可能会发现网络中 40% 的神经元都会死掉.

relu的变种:
在这里插入图片描述
PReLU中的ai是根据数据变化的;
Leaky ReLU中的ai是固定的;
RReLU中的aji是一个在一个给定的范围内随机抽取的值,这个值在测试环节就会固定下来.
其他变种:
ELU
在这里插入图片描述
SELU
在这里插入图片描述

其实就是ELU乘了个lambda,关键在于这个lambda是大于1的。以前relu,prelu,elu这些激活函数,都是在负半轴坡度平缓,这样在activation的方差过大的时候可以让它减小,防止了梯度爆炸,但是正半轴坡度简单的设成了1。而selu的正半轴大于1,在方差过小的的时候可以让它增大,同时防止了梯度消失。这样激活函数就有一个不动点,网络深了以后每一层的输出都是均值为0方差为1.
在这里插入图片描述
Swish
f(x)=x * sigmod(b * x)
在这里插入图片描述

4. Dropout
在这里插入图片描述
集成论
每次做完dropout,相当于从原始的网络中找到一个更‘瘦’的网络, 因此,对于一个有N个节点的神经网络,使用了dropout后,可以看做是2^n个模型的集合。
噪声论
使用dropout的网络,在进行训练时,相当于做了数据增强。 因为,总可以找到一个样本,使得在原始的网络上也能达到dropout单元后的效果。
避免了特征间的相互适应

dropout的变种

dropconnect:

在这里插入图片描述DropConnect与Dropout不同的地方是在训练神经网络模型过程中,它不是随机的将隐层节点的输出变成0,而是将节点中的每个与其相连的输入权值以1-p的概率变成0。(一个是输出一个是输入).

maxout:

增加了一层隐藏层, 如果我们设置maxout的参数k=5, 相当于在每个输出神经元前面又多了一层。这一层有5个神经元,此时maxout网络的输出计算公式为:
z1=w1x+b1
z2=w2
x+b2
z3=w3x+b3
z4=w4
x+b4
z5=w5*x+b5
out=max(z1,z2,z3,z4,z5)
所以这就是为什么采用maxout的时候,参数个数成k倍增加的原因。本来我们只需要一组参数就够了,采用maxout后,就需要有k组参数.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值