【论文】 ImageNet Classification with Deep Convolutional Neural Networks(讲解)

首先给出论文地址:ImageNet Classification with Deep Convolutional Neural Networks
这篇论文的模型在当年的LSVRC取得了相当不错的成绩,也是从那时起,卷积神经网络便又火了起来,当然这也得益于硬件设备(主要是GPU)的飞速发展。
本文将按照我觉得一个合理的顺序编写。

ReLU Nonlinearity

ReLU 函数(y = max(0, x))开始真正用于CNN是从这篇论文开始的,之前的CNN用的像sigmoid、tanh 这类的激活函数。之所以用ReLU就在于它是non-saturating(不饱和的),这一点在深度学习中很重要,像其他的simoid、tanh 这样的函数就容易饱和,一旦它们的定义域的取值的绝对值过的,梯度就趋于零。所以用ReLU的激活函数能够有效的避免梯度消失这类问题。
当然,如果取值为负的,就会很麻烦,梯度一直为零,无法优化。
这三类的函数图像的对比见【Fig.1 激活函数对比】
 Fig.1 激活函数对比
Fig.1 激活函数对比

下图给出了论文中使用ReLU函数的效果【Fig.2】
Fig.2 A four-layer convolutional neural network with ReLUs (solid line) reachs a 25% training error rate on CIFAR-10 six times faster than an equivalent network with tanh neurous (dashed line)
Fig.2 A four-layer convolutional neural network with ReLUs (solid line) reachs a 25% training error rate on CIFAR-10 six times faster than an equivalent network with tanh neurous (dashed line)
返回目录

Local Response Normalization(LRN)

这一部分当时我看论文的时候还是有点懵逼的, 不知道这是在干嘛,大概清楚这是在做标准化,但是为什么要这样做,那种普通的标准化不行吗?

后来我查了下资料,有收获:
局部归一化的动机:在神经生物学有一个概念叫做 侧抑制,指的是 被激活的神经元抑制相邻的神经元。 归一化的目的就是“抑制”, 局部归一化响应就是借鉴侧抑制的思想实现局部抑制的。
好处:有利于增加泛化能力, 做了平滑处理,识别率提高1~2%。

首先给出论文中给的公式:
在这里插入图片描述公式(一)

根据论文中,这里的 a j ( x , y ) a^j(x, y) aj(x,y) 表示①经过卷积核i得到的位置(x, y)(也就是在feature maps上的第i个通道上的位置(x, y)对应的feature值), ②接着用ReLU非线性化得到的。 这里的 b i ( x , j ) b^i(x, j) bi(x,j)对应的响应标准化。其中, k, n, α,β都是超参数, n是在同一空间位置连接的kernel maps的数量, N 是这一层的整个kernel的数量。
这里我重点说下这个分母, 这里实际上是某个feature map的某个位置(x, y)的值的平方在channel方向的求和, 从 j = max(0, i - n / 2)累加到j = min(N - 1, i + n / 2).
下图可以帮助我们理解这个公式(空间上)【1】
【Fig.3 图解LRN】
在这里插入图片描述Fig.3 图解LRN

假设我们输入一个4维的张量, 需要将其转化成一维向量, 每个向量是一个三维数组。
Tensorflow官网给出了解释:

The 4-D input tensor is treated as a 3-D array of 1-D vectors (along the last dimension), and each vector is normalized independently. Within a given vector, each component is divided by the weighted, squared sum of inputs within depth_radius. In detail,

sqr_sum[a, b, c, d] =
    sum(input[a, b, c, d - depth_radius : d + depth_radius + 1] ** 2)
output = input / (bias + alpha * sqr_sum) ** beta

例如:我们输入一个张量tensor是一个4维的,范围是1-32, 需要将其resize为一个一维的向量x, 然后经过LPN得到向量y。
x = [[[[1 2 3 4]
[5 6 7 8]]
[[9 10 11 12]
[13 14 15 16]]]
[[[17 18 19 20]
[21 22 23 24]]
[[25 26 27 28]
[29 30 31 32]]]


y = [[[[0.0714 0.0666 0.1000 0.1379]
[0.0454 0.03448 0.04022 0.05369]]
[[0.0298 0.0224 0.0246 0.0328]
[0.0220 0.0165 0.0177 0.02363]]]
[[[0.0174 0.0131 0.0138 0.0184]
[0.0144 0.0108 0.0113 0.0151]]
[[0.0123 0.0092 0.0095 0.0127]
[[0.0107 0.0080 0.0083 0.0110]]]]
这里的x是对tensor进行resize的。如果我们从空间来看,或者是图片的格式:
在这里插入图片描述这里具体说明下:【Fig. 4 实例说明】
在这里插入图片描述Fig. 4 实例说明
返回目录

Overlapping Pooling

这一部分也是本片论文的一个创新点。它使用了一个sliding window滑动, 假设这个window的尺寸为2 * 2, 步长stride = 1, 这样就实现了overlap。
这种方法现在使用的也非常多。一般会有Max Pooling 等相关的操作。
返回目录

Architecture

通体架构是这样的【Fig.5 Architecture of CNN】:
在这里插入图片描述Fig.5 Architecture of CNN

这个网络总体看上去也不是很复杂, 是由5个卷积层和3个全连接层组成的。其中所有的激活函数都是用ReLU,除了最后一层的输出使用的是softmax, 有的卷积层后面加了Max Pooling。
返回目录

Reduce Overfitting

文章中主要介绍了两种方法来减少过拟合:
◑Data Augmentation (数据增强)
◑ Dropout
第一个:数据增强:
1)对训练数据进行一个transform和一个水平翻折,来增加训练集数据
2)改变GRB channels的强度

第二个:Dropout:
这个是用的很广泛,这个我会在最近的博客中详细介绍。

Reference


[1] 深度学习的局部响应归一化LRN
返回目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值