卷积的数学定义
在数学上,卷积定义为
?
(
x
)
=
∫
?
∞
+
∞
f
(
t
)
g
(
x
?
t
)
d
t
\phi(x) = \int_{-\infin}^{+\infin} f(t)g(x-t)dt
?(x)=∫?∞+∞?f(t)g(x?t)dt 怎么理解上面的式子呢?
首先,f(t)表示t时刻的输入,g(x-t)表示在t时刻的输入对当前x时刻的影响因子
可以看到g函数的输出是一个时间长度,而不是时刻,也就是说影响因子是跟时间长度相关而不是时刻相关的
所以才会以当前时刻x-t时刻这个时间间隔作为输入
假如现在有一堆石头,一个池子。(知乎上看到的例子,链接忘了)
我们每隔一刻时间往池子里的同一未知扔石头。
石头是我们的输入,即
(
f
(
0
)
,
f
(
1
)
,
f
(
3
)
,
.
.
.
,
f
(
T
)
)
(f(0),f(1),f(3),...,f(T))
(f(0),f(1),f(3),...,f(T))
每一时刻扔出的石头造成池子中的水产生波纹,且对波纹的影响具有持续性,令其为
g
(
)
g()
g()
前面的信号对后面的信号会造成影响,影响的程度由持续时间决定,例如对于
t
t
t时刻的输入
f
(
t
)
f(t)
f(t)对
x
(
x
≥
t
)
x(x\ge t)
x(x≥t)时刻的影响即为
g
(
x
?
t
)
g(x-t)
g(x?t)
我们假设当
x
?
t
≥
l
x-t\ge l
x?t≥l时
g
(
x
?
t
)
=
0
g(x-t)= 0
g(x?t)=0,也就是说持续时间超过一定长度后影响就可以忽略不记了。
这么一来
在
l
l
l时刻,最终的信号为
f
(
0
)
g
(
l
)
+
f
(
1
)
g
(
l
?
1
)
+
.
.
.
+
f
(
l
)
g
(
0
)
f(0)g(l)+f(1)g(l-1)+...+f(l)g(0)
f(0)g(l)+f(1)g(l?1)+...+f(l)g(0) 在
l
+
1
l+1
l+1时刻,信号为
f
(
1
)
g
(
l
)
+
f
(
2
)
g
(
l
?
1
)
+
.
.
.
+
f
(
l
+
1
)
g
(
0
)
f(1)g(l)+f(2)g(l-1)+...+f(l+1)g(0)
f(1)g(l)+f(2)g(l?1)+...+f(l+1)g(0) 总之,最终的表示卷积式为
?
(
t
)
=
{
f
(
t
?
l
)
g
(
l
)
+
f
(
t
+
1
)
g
(
l
?
1
)
+
.
.
.
+
f
(
t
)
g
(
0
)
?if?
t
≥
l
f
(
0
)
g
(
t
)
+
f
(
1
)
g
(
t
?
1
)
+
.
.
.
+
f
(
t
)
g
(
0
)
?otherwise?
\phi(t) = \begin{cases} f(t-l)g(l)+f(t+1)g(l-1)+...+f(t)g(0) & \text{ if } t\ge l \\ f(0)g(t)+f(1)g(t-1)+...+f(t)g(0) & \text{ otherwise } \end{cases}
?(t)={f(t?l)g(l)+f(t+1)g(l?1)+...+f(t)g(0)f(0)g(t)+f(1)g(t?1)+...+f(t)g(0)??if?t≥l?otherwise??
卷积的变种
卷积可以进行填充和设定步长,并且根据不同的填充方式和步长设定,有几类常见的卷积方式
首先,填充这个操作既可以在图片上进行,也可以在卷积核上进行。对图片或序列进行填充又分两种方式。一种是边界零填充,这种方式常常是下面三种情况
-
窄卷积(valid 卷积)
-
宽卷积(full卷积)
- 步长为1,填充
P
=
K
?
1
\boldsymbol {P = K-1}
P=K?1
-
等宽卷积(same卷积)
- 步长为1,填充
P
=
(
K
?
1
)
/
2
\boldsymbol{P = (K-1)/2}
P=(K?1)/2
转置卷积
前面三种情况中我们可以看到,宽卷积实现了维度的扩充。但我们对维度扩充通常有更加复杂的要求。
低维特征映射到高维特征的卷积操作我们都统称为转置卷积。
所以说,转置卷积不过是边界填充设得大了点,本质上只是为了扩充维度。通过设定合适的填充大小和步长,我们可以任意的扩充到指定的维度(通常小于等于M+K-1)
普通卷积常常用于从图片或序列中提取特征,而转置卷积则用于根据编码生成图片。
比如,DCGAN中的生成网络由转置卷积搭建,判别网络由普通卷积搭建
微步卷积
除边界填充之外的另一种方式是间隔填充,根据设定的间隔大小D,决定每两个像素之间插入D个0,由于通常我们没办法设定小于1的步长,所以这种方式相当于是一种步长小于1的实现方式,我们又称其为微步卷积。
我们可以重新推导一下卷积前后的维度变换公式(保留边界填充)
D
o
=
D
i
+
D
?
(
D
i
?
1
)
?
D
k
+
2
P
S
+
1
\begin{aligned} D_o &= \frac{D_i+D*(D_i-1)-D_k+2P}{S}+1 \\ \end{aligned}
Do??=SDi?+D?(Di??1)?Dk?+2P?+1? 通常微步卷积是为了扩充维度,所以假如我们要用一个大小为3的卷积核,假设边界填充P=1,步长为1,将一个3维的序列扩充到5维,那么有
5
=
3
+
2
?
D
?
3
+
2
+
1
D
=
1
\begin{aligned} &5 = 3+2*D-3+2+1 \\ &D = 1 \end{aligned}
?5=3+2?D?3+2+1D=1? 所以微步卷积也是一种特殊的(步长小于1)的转置卷积
通常在各类深度学习框架中,转置卷积的默认实现就是微步卷积
空洞卷积
除了前面提到的对图片或序列的填充之外,也可以对卷积核进行填充。显然,对卷积核进行边界填充是没有意义的,因为总有传统卷积方式可以替代。所以空洞卷积一般是对卷积核进行间隔填充,空洞卷积增大了卷积核的大小,因此增大了感受野,但是没有增加参数。
空洞卷积又名膨胀卷积,填充的间隔大小-1称为扩张率
假设扩张率为D,卷积核原始大小为K,那么经过填充的卷积核大小为
K
′
=
K
+
(
K
?
1
)
?
(
D
?
1
)
K^\prime = K+(K-1)*(D-1)
K′=K+(K?1)?(D?1) 空洞卷积可用于语义分割或目标检测等任务,代替池化层进行避免下采样操作
|