卷积的概念:卷积的概念如下,两个矩形门函数的卷积是三角函数(详见信号与系统)
y
(
t
)
=
x
(
t
)
∗
y
(
t
)
=
∫
−
∞
+
∞
x
(
τ
)
y
(
t
−
τ
)
d
τ
y(t)=x(t)\ast y(t)=\int_{-\infty}^{+\infty}x(\tau)y(t-\tau)\rm d\tau
y(t)=x(t)∗y(t)=∫−∞+∞x(τ)y(t−τ)dτ
2D-卷积(离散):可以将kernel(即参数w)看为连续卷积中的
h
(
τ
)
h(\tau)
h(τ),将与kernel同维度的部分input看为连续卷积中的
x
(
τ
)
x(\tau)
x(τ),将输出的一个点看为连续卷积中的输出结果。
import tensorflow as tf
from tensorflow.keras import layers
# 其中第一个数字指卷积核个数,vaild指不做padding,same指做padding
layer = layers.Conv2D(4, kernel_size=5, strides=1, padding='vaild')
out = layer(x)print(out)
layer = layers.Conv2D(4, kernel_size=5, strides=1, padding='same')
out = layer(x)print(out)
layer = layers.Conv2D(4, kernel_size=5, strides=2, padding='same')
out = layer(x)print(out)
tf中的2D卷积操作:nn.Conv2D(需要自己管理维护w和b参数,更灵活)
w = tf.random.normal([5,5,3,4])
b = tf.zeros([4])
out = tf.nn.conv2d(x, w, strides=1, padding='VALID')
out = out + b
print(out)
out = tf.nn.conv2d(x, w, strides=2, padding='VALID')
out = out + b
print(out)
tf中卷积的梯度下降:以输入为3X3矩阵,卷积核为2X2,输出为2X2为例
O
00
=
x
00
∗
w
00
+
x
01
∗
w
01
+
x
10
∗
w
10
+
x
11
∗
w
11
+
b
O_{00}=x_{00}*w_{00}+x_{01}*w_{01}+x_{10}*w_{10}+x_{11}*w_{11}+b
O00=x00∗w00+x01∗w01+x10∗w10+x11∗w11+b
O
01
=
x
01
∗
w
00
+
x
02
∗
w
01
+
x
11
∗
w
10
+
x
12
∗
w
11
+
b
O_{01}=x_{01}*w_{00}+x_{02}*w_{01}+x_{11}*w_{10}+x_{12}*w_{11}+b
O01=x01∗w00+x02∗w01+x11∗w10+x12∗w11+b
O
10
=
x
10
∗
w
00
+
x
11
∗
w
01
+
x
20
∗
w
10
+
x
21
∗
w
11
+
b
O_{10}=x_{10}*w_{00}+x_{11}*w_{01}+x_{20}*w_{10}+x_{21}*w_{11}+b
O10=x10∗w00+x11∗w01+x20∗w10+x21∗w11+b
O
11
=
x
11
∗
w
00
+
x
12
∗
w
01
+
x
21
∗
w
10
+
x
22
∗
w
11
+
b
O_{11}=x_{11}*w_{00}+x_{12}*w_{01}+x_{21}*w_{10}+x_{22}*w_{11}+b
O11=x11∗w00+x12∗w01+x21∗w10+x22∗w11+b
∂
L
o
s
s
∂
w
00
=
∑
i
∈
00
,
01
,
10
,
11
∂
L
o
s
s
∂
O
i
∂
O
i
∂
w
i
\frac{\partial Loss}{\partial w_{00}} =\sum_{i\in 00,01,10,11}\frac{\partial Loss}{\partial O_i}\frac{\partial O_i}{\partial w_i}
∂w00∂Loss=i∈00,01,10,11∑∂Oi∂Loss∂wi∂Oi其中
∂
O
00
∂
w
00
=
x
00
\frac{\partial O_{00}}{\partial w_{00}}=x_{00}
∂w00∂O00=x00
# 第一种方法
pool = layers.MaxPool2D(2, strides=2)#其中2代表池化的kernel大小
out = pool(x)print(out)
pool = layers.MaxPool2D(3, strides=1)
out = pool(x)print(out)# 第二种方法
out = tf.nn.maxPool2d(x, strides=2, padding='VALID')
上采样:增加维度,如复制等
layer = layers.UpSampling2D(size =3)#size代表增大的倍数
out = layer(x)print(out)