计算机视觉所研究的问题
1、图片分类
(Image Classification)
计算机需要辨别出图像中是一只猫
2、目标检测
(Object Detection)
你需要计算出图中的物体(如车辆)以及车辆的位置
3、神经网络风格迁移
(Neural Style Transfer)
利用神经网络将两张照片融合在一起
计算机视觉面临的挑战即:数据的输入可能会非常大
对于64×64的彩色图像,输入的数据量为:64×64×3=12288,即特征向量x的维度为12288。 而对于像素的分辨率大的图像,往往维度将会非常大。
神经网络检测
神经网络结果而言,前几层检测边缘部分,后面几层可能检测到物体的部分,最后几层可能检测到完整的物体。
在网络的初始层,卷积核通常会检测一些简单的低级特征,例如边缘、纹理等。随着网络的深入,卷积核能够组合和提取更复杂的特征,例如形状、角点、纹理组合等。这些高级特征对于物体的检测和识别非常重要。
深度神经网络具有更多的参数和更高的复杂度,神经网络在越深的层次上能够检测出物体,是因为网络能够学习到更抽象、更复杂的特征表示,并具有更强大的模式识别能力和上下文理解能力。
一张图片可以分别通过垂直边缘
检测器和水平边缘
检测器输出。
对于图像卷积运算,3×3的矩阵也称为核
或者过滤器
,通过设置矩阵的参数来获取相应的过滤形式(垂直、水平),从而能够检测出图片的边缘特征。
而在深度学习中,对于过滤器的参数,我们的选择更加的灵活,可以通过神经网络反向传播算法来进行获取最佳的参数,并应用于输入的图片。
填充(Padding)
对于
n
×
n
n×n
n×n的图像,
f
×
f
f×f
f×f的过滤器做卷积,输出的维度为:
即:6×6的图像卷积3×3的过滤器,输出为4×4的图像。
提出填充的意义:
1、每次卷积操作会导致图像降维。
2、角落的像素点只被一个输出所触碰或使用,意味着会很容易丢掉图像的边缘位置。
因此,会沿着图像边缘再填充一层像素(通常为0),这样会得到8×8的输入图像,最终为6×6的输出图像。
p:代表填充的层数(数量),输出的维度变为:
Valid convolutions,即不填充,输出为
(
n
−
f
+
1
)
×
(
n
−
f
+
1
)
(n-f+1)×(n-f+1)
(n−f+1)×(n−f+1)
Same convolutions,即保证输出大小和输出大小是一样的, 那么需要
n
+
2
p
−
f
+
1
=
n
n+2p-f+1=n
n+2p−f+1=n,解得
p
=
f
−
1
2
p=\frac{f-1}{2}
p=2f−1。
过滤器通常为奇数
1、如果是偶数,在same卷积中可能造成不对称填充。
2、奇数维过滤器通常有一个中心点,便于指出过滤器的位置。
卷积步长
若考虑步长参数stride,则输出的维度为:
例如:输入图像7×7,卷积核3×3,步长stride为2,填充padding为0;输出为3×3的图像,[ ]代表取整运算。
补充
:只需要设定卷积核3×3,步长为2可以实现下采样
。一般的,假设输出图像为
n
×
n
n×n
n×n,输出应该为
n
−
3
2
+
1
=
n
/
2
−
0.5
\frac{n-3}{2}+1 = n/2-0.5
2n−3+1=n/2−0.5,由于向上取整,则输出即为即为
n
/
2
×
n
/
2
n/2×n/2
n/2×n/2。
三维卷积
对于RGB图像,如6×6×3的图像,其卷积核也应为3×3×3
。其中第一个数字6代表高度,第二个6代表宽度,3代表通道数
6×6×3的图像进行3×3×3的卷积,依次将R、G、B对应的一共27个数与卷积核数字相乘后相加,最后输出为4×4的图像
可以通过对图像进行多个卷积核运算,以此来提取更多不同方面的特征(水平、垂直等)
单层卷积网络
输入图像为
a
[
1
]
a^{[1]}
a[1],卷积核为
w
[
1
]
w^{[1]}
w[1],设置偏置为b卷积后结果为
a
[
1
]
a^{[1]}
a[1]
w
[
1
]
+
b
w^{[1]}+b
w[1]+b,引入激活函数Relu,即得到
z
[
2
]
=
a
[
1
]
z^{[2]}=a^{[1]}
z[2]=a[1]
w
[
1
]
+
b
w^{[1]}+b
w[1]+b,最后输出为
h
θ
(
x
)
=
a
[
2
]
=
g
(
z
[
2
]
)
h_{\theta}(x)=a^{[2]}=g(z^{[2]})
hθ(x)=a[2]=g(z[2])
卷积神经网络示例如下。但卷积神经网络一般分为:卷积层
(Convolution)、池化层
(Pooling)、全连接层
(Fully connected)。
池化层
分为最大池化和平均池化,最大池化取过滤器对应的区域的最大值,平均池化则同理。对应的超参数为
f
f
f(filter size)和
s
s
s(stride),通常设置为
f
f
f=2,
s
s
s=2;或者
f
f
f=3,
s
s
s=2。
最大池化只是计算神经网络某一层的静态属性,池化过程中没有需要学习的参数。
接下来是一个卷积神经网络示例:
卷积层
卷积层的主要优势是:参数共享
(使用相同的卷积核)和稀疏连接
(输出的单个元素只与其映射的9个元素相关,减少了很多没有关系的映射,如果展开全连接,就会增大计算量)。通过这两种机制来减少参数。
参数根据过滤器的大小和个数决定。例如6个5×5的过滤器需要6×(25+1)个参数,1代表偏置参数。
x
x
x代表图片,
y
y
y代表二进制标记或某个重要标记
经典神经网络
残差网络
ResNets由残差块构成
由
a
l
a^{l}
al首先进行线性激活,即:
z
[
l
+
1
]
=
W
[
l
+
1
]
a
l
+
b
l
+
1
z^{[l+1]}=W^{[l+1]}a^{l}+b^{l+1}
z[l+1]=W[l+1]al+bl+1
再通过非线性激活Relu得到
a
[
l
+
1
]
a^{[l+1]}
a[l+1],即:
a
[
l
+
1
]
=
g
(
z
[
l
+
1
]
)
a^{[l+1]}=g(z^{[l+1]})
a[l+1]=g(z[l+1])
然后再线性激活,
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]+bl+2
最后经过Relu得到,
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
)
a^{[l+2]}=g(z^{[l+2]})
a[l+2]=g(z[l+2])
而残差块是通过远跳连接将
a
l
a^{l}
al直接与第二层
线性激活函数之后,Relu函数之前连接
,由此得到的输出为:
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]+al)
ReLU 激活函数的输出为
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x)=max(0, x)
f(x)=max(0,x)
在这个函数中,输入信号
x
x
x经过变换后输出模型的输出
y
y
y。如果
x
x
x大于等于 0,那么
y
y
y等于
x
x
x,否则
y
y
y等于0。
随着网络的加深,当发生梯度消失或者梯度爆炸的情况下,
W
[
l
+
2
]
,
b
l
+
2
W^{[l+2]},b^{l+2}
W[l+2],bl+2的值为0,即下式会变为:
a
[
l
+
2
]
=
g
(
W
[
l
+
2
]
a
[
l
+
1
]
+
b
l
+
2
+
a
l
)
a^{[l+2]}=g(W^{[l+2]}a^{[l+1]}+b^{l+2}+a^{l})
a[l+2]=g(W[l+2]a[l+1]+bl+2+al)
最终得到:
a
[
l
+
2
]
=
a
l
a^{[l+2]}=a^{l}
a[l+2]=al
表明即使增加了网络的层数,在效率和简单的神经网络相差不大,很好的解决的问题,或者退回到梯度消失之前,以此来寻找合适的层数。当网络足够深的时候,开始起反作用的时候,残差模块能保证你的网络性能不发生改变。
对于普通网络来说,随着网络的深度加深,用优化算法越难训练,训练错误会越来越多,训练的效率会越来越低,而残差网络会更好的解决梯度消失或者梯度爆炸的问题。随着深度的增加,逼近函数的效果好,已经有paper证明过了,个人理解就是,神经网络训练的过程就是调整参数的过程,可以调整的参数(weights and bias)越多,意味着调整的自由度越大,从而逼近效果越好
。
网络中的网络及1×1卷积
1×1卷积操作用来压缩
或保持输入层中的信道数量
,甚至增加信道,之后可以添加非线性函数,从而让网络学习更复杂的函数。可以学习独立通道直接的相关性。
1×1卷积块可以构建瓶颈层来减少计算量
。
图一单个元素的计算量为5×5×192,总的计算量为28×28×32(过滤器个数)×(5×5×192)约为1.2亿。
图二中1×1的卷积块的计算量为28×28×16×(1×1×192),得出的28×28×16为瓶颈层,5×5的卷积块计算量为28×28×32×(5×5×16),总计约为1200w。
Inception网络模型![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f28ea2d6cb556aa76522c922146a5d1e.png#pic_center)
重复的意义:通过增加深度提高网络的复杂性,来拟合更加复杂的函数