卷积和转置卷积
基础图像变换操作
1 空间域
-
Gamma Correction 伽马校正
v ′ = α v γ v' = \alpha v^{\gamma} v′=αvγ第一:图像像素值(v)代表着亮度(Brightness)
第二: γ > 1 \gamma>1 γ>1的时候,高亮度区域的变化大即细节增加,低亮度细节减少。 -
sober算子
边缘检测
具体可以搜索百度百科
2 频域
傅里叶变化
高频为细节,为轮廓。
低通滤波可以过滤细节。
图像特征提取
- SIFT:scale-invariant feature Transform
- 首先计算 金字塔表示(Pyramid Representation)
高斯滤波 + 下采样 - 找到图像金字塔中的特征点:
拉普拉斯滤波器
通过之前的高斯滤波和拉普拉斯整合可以成为, LoG高斯拉普拉斯滤波器。
LoG 计算代价高,用DoG近似。
- 首先计算 金字塔表示(Pyramid Representation)
卷积层
- 卷积
- 转置卷积,反卷积
【如果想了解怎么卷积?怎么反卷积?如何形成卷积矩阵和数据列向量的乘积???请看Im2Col GEMM】
我就搬运图,过程如下:
转置卷积
二维卷积下,默认的pytorch输入张量为 N,C,H,W
dilation 扩张卷积,增加感受野
transposed 控制是否进行转置卷积,也就是反卷积
归一化层(Normalization Layer)
归一化都采取以下公式:
y
=
γ
x
−
E
(
x
)
V
a
r
(
x
)
+
ϵ
+
β
\bold y = \gamma \frac{\bold x - E(\bold x)}{\sqrt{\bold{Var(x)+\epsilon}}} + \beta
y=γVar(x)+ϵx−E(x)+β
批次归一化:Batch Normalization Layer
对于全连接层:
进入神经元前的输入,进行批归一化。
因此你针对的是每个神经元!,每个神经元的输入进行多数据平均。
图中
Z
Z
Z表示的就是输入到第一个神经元的输出,
x
1
x^1
x1就是批次里第一个数据。
N
,
C
,
H
,
W
=
=
>
C
×
1
N,C,H,W==>C \times 1
N,C,H,W==>C×1
- BatchNorm1d | BatchNorm2d | BatchNorm3d |
class troch.nn.BactchNorm2d(num_features, eps=1e-5, momentum=0.1, affine =True, track_running_states = True)
-
nums_features: 输入通道数目C
-
eps: 防止分母为0
-
momentum 控制指数移动平均计算 E ( x ) 和 V a r ( x ) E(\bold x) 和 Var(\bold x) E(x)和Var(x), 如果不用,则
track_running_stats=False
,就用如下更新:
x ^ n e w = ( 1 − α ) x t − 1 + α x t ^ \hat x_{new} = (1-\alpha)x_{t-1} + \alpha \hat{x_t} x^new=(1−α)xt−1+αxt^
E ( x c ) = 1 N × H × W ∑ N , H , W x c E(\bold{x_c} )= \frac{1}{N \times H \times W}\sum_{N,H,W}\bold{x_c} E(xc)=N×H×W1N,H,W∑xc
V a r ( x ) = 1 N × H × W ∑ N , H , W ( x c − E ( x c ) ) 2 Var(x) = \frac{1}{N \times H \times W}\sum_{N,H,W}\bold{(\bold{x_c} - E(x_c))^2} Var(x)=N×H×W1N,H,W∑(xc−E(xc))2x ^ \hat{x_{}} x^ 是基于当前 E ( x ) E(\bold x) E(x)和 V a r ( x ) Var(\bold x) Var(x)计算所得,相对于批次维度的!!
-
affine: 是否应用 γ \gamma γ和 β \beta β形成仿射变换
-
缓存值:track_running_stats
- running_mean 缓存均值张量
- running_var 缓存方差张量
- num_batches_tracked 当前迷你批次的数目
-
迷你批次不能太小,不然均值和方差波动大,减少稳定性
-
批归一化层一般在激活函数前,因此卷积中的bias可以设置为false,因为会在减平均中被消去
组归一化:group normalization
组归一化,减少了对批次大小的统计依赖。
如果num_of_goups=1那就是层归一化layer norm.
class torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine= True)
- 输入张量通道数 分成 num_groups组, C g = C / n u m C_g = C/num Cg=C/num
- 每组分别归一化
- 注意由于代码没有指数移动平均,因此就没有缓存张量
E ( x c g ) = 1 C g × H × W ∑ C g , H , W x c g E(\bold{x_{c_g}} )= \frac{1}{C_g\times H \times W}\sum_{C_g,H,W}\bold{x_{c_g}} E(xcg)=Cg×H×W1Cg,H,W∑xcg
V a r ( x c g ) = 1 C g × H × W ∑ C g , H , W ( x c − E ( x c g ) ) 2 Var(x_{c_g}) = \frac{1}{C_g \times H \times W}\sum_{C_g,H,W}\bold{(\bold{x_c} - E(x_{c_g}))^2} Var(xcg)=Cg×H×W1Cg,H,W∑(xc−E(xcg))2
实例归一化: instance normalization
N
,
C
,
H
,
W
=
=
>
N
,
C
,
1
N,C,H,W==>N,C,1
N,C,H,W==>N,C,1
简易记忆:实例实例,就是具体某个例子,聚焦在图片,甚至关注到某个图片某个通道。
由于之前批次归一化都是参考了其他图片的信息,也就是一个批次中很多图片进行去均值除标准拆,而对于风格迁移或者对抗网络来说,不需要参考同一批次中的图像,所以可以用实例归一化。
class torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum = 0.1. affine =False, track_running_state = False)
E
(
x
)
=
1
H
×
W
∑
H
,
W
x
E(\bold{x} )= \frac{1}{ H \times W}\sum_{H,W}\bold{x}
E(x)=H×W1H,W∑x
V
a
r
(
x
)
=
1
H
×
W
∑
H
,
W
(
x
c
−
E
(
x
)
)
2
Var(x) = \frac{1}{ H \times W}\sum_{H,W}\bold{(\bold{x_c} - E(x))^2}
Var(x)=H×W1H,W∑(xc−E(x))2
层归一化: layer normalization
N
,
C
,
H
,
W
=
=
>
N
×
1
N,C,H,W ==>N\times1
N,C,H,W==>N×1
适用于 循环神经网络RNN
求==除了迷你批次维度(N)==以外的所有维度的平均值和方差
class torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=False)
x
t
=
(
1
−
α
)
x
t
−
1
+
α
x
t
^
x_{t} = (1-\alpha)x_{t-1} + \alpha \hat{x_t}
xt=(1−α)xt−1+αxt^
E
(
x
)
=
1
C
×
H
×
W
∑
C
,
H
,
W
x
E(\bold{x} )= \frac{1}{C \times H \times W}\sum_{C,H,W}\bold{x}
E(x)=C×H×W1C,H,W∑x
V
a
r
(
x
)
=
1
C
×
H
×
W
∑
C
,
H
,
W
(
x
−
E
(
x
)
)
2
Var(x) = \frac{1}{C \times H \times W}\sum_{C,H,W}\bold{(\bold{x} - E(x))^2}
Var(x)=C×H×W1C,H,W∑(x−E(x))2
局部响应归一化: Local Response Normalization
附录
B
a
t
c
h
=
>
C
×
1
Batch=>C\times1
Batch=>C×1
L
a
y
e
r
−
>
N
×
1
Layer->N\times1
Layer−>N×1
I
n
s
t
a
c
n
e
−
>
C
×
N
Instacne-> C\times N
Instacne−>C×N