一些经典的图像处理网络结构
2022/3/18 23:31:46
本文主要是介绍一些经典的图像处理网络结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
classic networks
普遍规律:
- 从输入往后,channel越来越多,可以以2的倍数上升
- 从输入往后,height和width越来越小,
- height和width缩小的操作在pooling时更常见,conv时height和width缩小几乎只在刚输入时出现且次数很少
1. LeNet-5
2. AlexNet
与LeNet-5的区别
- similar architecture as LeNet-5, much bigger, 60million parameters
- ReLU
- Local Response Normalization(不重要)
3. VGG-16
特点:
- conv时 filter 大小都是3×3,stride=1,same convolution,区别是channel不同,channel从64开始,每次都翻倍,直到512,(连续的conv层channel相同)
- pooling时filter大小都是2×2,stride=1
- conv层总是连续出现至少2层
- 层数很深,VGG-16中的16表示一共有16个有参数的层
- 参数很多138million parameters
ResNet
Residual Block
a [ l ] a^{[l]} a[l]是 l l l层的输出, a [ l ] a^{[l]} a[l]除了正常输入 l + 1 l+1 l+1层以外,还输入 l + 2 l+2 l+2层,输入的位置是线性操作之后激活函数之前,即 a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) a^{[l+2]}=g(z^{[l+2]}+a^{[l]}) a[l+2]=g(z[l+2]+a[l]),其中 z [ l + 2 ] z^{[l+2]} z[l+2]是第 l + 2 l+2 l+2层中线性操作的结果, a [ l + 2 ] a^{[l+2]} a[l+2]是 l + 2 l+2 l+2层的输出。这个特殊的 l + 1 l+1 l+1层和 l + 2 l+2 l+2层的两层的block叫做Residual Block。
将网络中相邻的两层变为Residual Block,则该网络就是ResNet
Residual Block有什么用?
理论上网络越深效果会越好,train error会随着训练的迭代越来越小,
但是事实上不使用Residual Block的深层网络(plain network)时,train error会随着训练的进行先下降再上升
而ResNet会让train error随着训练的迭代持续变小,这允许使用更深的网络,也有助于解决梯度的消失和爆炸问题,有助于解决train error陷入平台期优化慢的问题
为什么Residual Block有用?
当在一个plain network中加入一个Residual Block,假设block输入是
a
[
l
]
a^{[l]}
a[l],block输出是
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
+
a
[
l
]
)
a^{[l+2]}=g(z^{[l+2]}+a^{[l]})
a[l+2]=g(z[l+2]+a[l]),
z
[
l
+
2
]
=
w
[
l
+
2
]
a
[
l
+
1
]
+
b
[
l
+
2
]
z^{[l+2]}=w^{[l+2]}a^{[l+1]} + b^{[l+2]}
z[l+2]=w[l+2]a[l+1]+b[l+2];
在加了L2正则后,
w
[
l
+
2
]
w^{[l+2]}
w[l+2]和
b
[
l
+
2
]
b^{[l+2]}
b[l+2]都会减小,极端情况下会等于0,若
w
[
l
+
2
]
=
0
w^{[l+2]}=0
w[l+2]=0且
b
[
l
+
2
]
=
0
b^{[l+2]}=0
b[l+2]=0,则
a
[
l
+
2
]
=
g
(
0
+
a
[
l
]
)
=
g
(
a
[
l
]
)
a^{[l+2]}=g(0+a^{[l]})=g(a^{[l]})
a[l+2]=g(0+a[l])=g(a[l]);
再假设网络里的激活函数都是ReLU(大于0时取原值,小于0则为0),则
a
[
l
]
≥
0
a^{[l]}\geq 0
a[l]≥0,
a
[
l
+
2
]
=
g
(
a
[
l
]
)
=
a
[
l
]
a^{[l+2]}=g(a^{[l]})=a^{[l]}
a[l+2]=g(a[l])=a[l];
也就是说极端情况下,加了Residual Block相当于没有加任何内容。
所以在使用Residual Block的情况下,网络层数变深并不会带来plain network中深度网络存在的问题,而且如果幸运的话Residual Block还可能带来深层网络的好处。
z [ l + 2 ] + a [ l ] z^{[l+2]}+a^{[l]} z[l+2]+a[l]的shape
矩阵加法要求两个矩阵shape相同,所以
- 无论Residual Block中的网络是CNN还是FC,使 z [ l + 2 ] z^{[l+2]} z[l+2]和 a [ l ] a^{[l]} a[l]shape相同
- 若 z [ l + 2 ] z^{[l+2]} z[l+2]和 a [ l ] a^{[l]} a[l]shape不相同相同,可以再加一个参数矩阵 w s w_s ws,然后将 a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) a^{[l+2]}=g(z^{[l+2]}+a^{[l]}) a[l+2]=g(z[l+2]+a[l])替换为 a [ l + 2 ] = g ( z [ l + 2 ] + w s × a [ l ] ) a^{[l+2]}=g(z^{[l+2]}+w_s\times a^{[l]}) a[l+2]=g(z[l+2]+ws×a[l]),使 w s × a [ l ] w_s\times a^{[l]} ws×a[l]和 z [ l + 2 ] z^{[l+2]} z[l+2]shape相同
1×1 convolution(network in network)
当filter的channel=1时,1×1 convolution只是把全部输入乘以特定的数字然后经过了激活函数,没有起到提取特征的作用
当filter的channel>1时,1×1 convolution相当于在同一个点的所有channel上提取了特征
当filter有多个时,相当于对某一个点的所有channel的提取了多个特征
假设输入的shape是 ( n h , n w , n c ) (n_h, n_w, n_c) (nh,nw,nc),filter的shape是 ( 1 , 1 , n c ) (1, 1, n_c) (1,1,nc),filter数量为f,那么 1×1 convolution可以看做是对输入 ( n h , n w ) (n_h, n_w) (nh,nw)中的每个点,其所有channel分别和数量为f,shape为 ( n c , ) (n_c,) (nc,)的向量做点乘,最终输出的shape为 ( n h , n w , f ) (n_h, n_w, f) (nh,nw,f)。这样的计算类似全连接层的计算。
作用
shrink the number of channels
Inception
理念:
- 与其纠结应该用什么样的结构,不如全部算一遍,然后将结果stack到一起(保证height和width相同),让参数自己去做选择
- 每个都算的话计算量会很大,所以可以在计算量大的操作之前先做一个1×1conv,先将参数减少再做计算量大的操作,这样可以大大减少总体计算量
inception module
其中不同的conv得到的结果height和width相同,channel不同,在channel的维度stack在一起
inception network
很多inception module在一起就是inception network
个人理解
- 当用1×1conv将参数减少时,减少了数据包含的信息量,随着训练的迭代,将参数减少的操作输出的结果中包含的关键信息越来越多,所以参数减少是一个特征选择的操作
- 参数减少后再增加参数起到的作用可能是将提取出来的关键信息再放大,然后再从放大过的信息中提取关键信息,最终得到越来越重要的信息;
- 换一个词来说:参数减少将信息抽象化,然后将抽象出来的信息放大后再继续抽象,随着训练的迭代,信息的抽象会越来越准确
- 深度模型有用的原因是,随着层数增加,数据抽象程度越来越高,直到最终的输出层,将输入抽象成了类别标签的概率
- 参数最少的层的信息量必须大于等于理论上模型应该包含的信息量,要不然就不能准确拟合模型,bias就会始终很高。但是如果数据抽象的层次很高,不需要太多参数就足以表示模型。所以参数少的层如果在前半段可能会使信息缺失,但是在模型后半段可能性很小。
问题
- 为什么幸运时Residual Block有好处?当 w [ l + 2 ] ≠ 0 w^{[l+2]}\neq 0 w[l+2]=0且 b [ l + 2 ] ≠ 0 b^{[l+2]}\neq 0 b[l+2]=0时不是会带来普通深度网络的问题吗?
这篇关于一些经典的图像处理网络结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15JavaMailSender是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-15JWT 用户校验学习:从入门到实践
- 2024-11-15Nest学习:新手入门全面指南
- 2024-11-15RestfulAPI学习:新手入门指南
- 2024-11-15Server Component学习:入门教程与实践指南
- 2024-11-15动态路由入门:新手必读指南
- 2024-11-15JWT 用户校验入门:轻松掌握JWT认证基础
- 2024-11-15Nest后端开发入门指南
- 2024-11-15Nest后端开发入门教程
- 2024-11-15RestfulAPI入门:新手快速上手指南