在深度学习,尤其是卷积神经网络(CNN)中,卷积、激活、池化和批量归一化是四个基本操作。它们共同作用,帮助模型高效学习和提取数据中的重要特征。
1. 卷积操作
作用
卷积操作旨在通过滑动卷积核(过滤器)在输入数据上提取局部特征,如边缘和角点。
过程
滑动卷积核:卷积核在输入特征图上移动,逐个覆盖区域。
特征计算:在每个位置,卷积核与输入特征图的对应部分进行逐元素相乘并求和,得到输出值。公式为:
h
(
i
,
j
)
=
∑
m
∑
n
f
(
i
+
m
,
j
+
n
)
⋅
g
(
m
,
n
)
h(i,j) = \sum_{m} \sum_{n} f(i+m, j+n) \cdot g(m,n)
h(i,j)=m∑n∑f(i+m,j+n)⋅g(m,n)
在此公式中,
f
f
f代表输入特征图,
g
g
g 代表卷积核,
h
h
h 为输出特征图。输出特征图的横纵坐标由
i
i
i 和
j
j
j表示,而卷积核的横纵坐标则用
m
m
m 和
n
n
n 表示。
输出特征图的大小需要满足以下公式:
D
o
u
t
=
D
i
n
−
D
c
o
n
v
+
2
P
S
+
1
D_{out}=D_{in}-D_{conv}+2PS+1
Dout=Din−Dconv+2PS+1
D
o
u
t
D_{out}
Dout表示输出特征图的维度(宽度或高度)。
D
i
n
D_{in}
Din表示输入特征图的相应维度大小。
D
c
o
n
v
D_{conv}
Dconv表示卷积核的相应维度大小。
P
P
P表示边界填充的大小。
S
S
S表示卷积操作的步长。
优势
参数共享:通过在整个输入上共享卷积核参数,显著减少模型参数数量。
平移不变性:能够有效捕捉到不同位置的相同特征,提高了模型的鲁棒性。
2. 激活运算
作用
激活函数引入非线性特性,使得神经网络能够学习和表示复杂的模式。
过程
非线性变换:对每个输入值进行变换,常见的激活函数包括:
ReLU(Rectified Linear Unit):
ReLU ( x ) = max ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
Sigmoid:
Sigmoid ( x ) = 1 1 + e − x \text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=1+e−x1
Tanh:
Tanh ( x ) = 2 1 + e − 2 x − 1 \text{Tanh}(x) = \frac{2}{1 + e^{-2x}} - 1 Tanh(x)=1+e−2x2−1
Softmax(用于多分类):
Softmax
(
z
i
)
=
e
z
i
∑
j
e
z
j
\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}}
Softmax(zi)=∑jezjezi
优势
增强表达能力:通过引入非线性,网络能够学习复杂的特征。
加快收敛:如ReLU等激活函数能有效减轻梯度消失问题,加速模型训练。
3. 池化运算
作用
池化操作用于减少特征图的维度,降低计算复杂度,同时保持关键信息。
过程
最大池化:在池化窗口中选择最大值,提取显著特征。公式为:
P
max
=
max
{
a
i
j
∣
1
≤
i
≤
m
,
1
≤
j
≤
n
}
P{\text{max}} = \max \{a{_{ij}} \mid 1 \leq i \leq m, 1 \leq j \leq n\}
Pmax=max{aij∣1≤i≤m,1≤j≤n}
最大池化的matlab实现:
function output = maxPooling(input, poolSize, stride)
% 输入检查
assert(ndims(input) == 3, '输入必须是三维数组 (高度 x 宽度 x 通道)');
assert(all(size(poolSize) == 2), '池化大小必须是2维 [h, w]');
[height, width, channels] = size(input);
% 计算输出的高度和宽度
outHeight = floor((height - poolSize(1)) / stride) + 1;
outWidth = floor((width - poolSize(2)) / stride) + 1;
% 初始化输出矩阵
output = zeros(outHeight, outWidth, channels);
% 最大值池化操作
for c = 1:channels % 遍历每个通道
for i = 1:outHeight
for j = 1:outWidth
% 计算池化窗口
hStart = (i - 1) * stride + 1;
hEnd = hStart + poolSize(1) - 1;
wStart = (j - 1) * stride + 1;
wEnd = wStart + poolSize(2) - 1;
% 取出池化窗口,并计算最大值
window = input(hStart:hEnd, wStart:wEnd, c);
output(i, j, c) = max(window(:)); % 获取窗口内的最大值
end
end
end
end
平均池化:计算池化窗口内所有值的平均,平滑特征。公式为:
P
avg
=
1
m
n
∑
i
=
1
m
∑
j
=
1
n
a
i
j
P{\text{avg}} = \frac{1}{mn} \displaystyle\sum_{i=1}^{m} \sum_{j=1}^{n} a{_{ij}}
Pavg=mn1i=1∑mj=1∑naij
平均池化的matlab实现:
function output = averagePooling(input, poolSize, stride)
% 输入检查
assert(ndims(input) == 3, '输入必须是三维数组 (高度 x 宽度 x 通道)');
assert(all(size(poolSize) == 2), '池化大小必须是2维 [h, w]');
[height, width, channels] = size(input);
% 计算输出的高度和宽度
outHeight = floor((height - poolSize(1)) / stride) + 1;
outWidth = floor((width - poolSize(2)) / stride) + 1;
% 初始化输出矩阵
output = zeros(outHeight, outWidth, channels);
% 平均池化操作
for c = 1:channels % 遍历每个通道
for i = 1:outHeight
for j = 1:outWidth
% 计算池化窗口
hStart = (i - 1) * stride + 1;
hEnd = hStart + poolSize(1) - 1;
wStart = (j - 1) * stride + 1;
wEnd = wStart + poolSize(2) - 1;
% 取出池化窗口,并计算平均值
window = input(hStart:hEnd, wStart:wEnd, c);
output(i, j, c) = mean(window(:)); % 计算窗口内所有元素的平均值
end
end
end
end
滑动窗口:通过滑动池化窗口来提取特征,通常使用 ( 2 × 2 2 \times 2 2×2) 或 ( 3 × 3 3 \times 3 3×3) 的窗口。
优势
-降低计算量:通过减少特征图的空间维度,提升训练效率。
增强不变性:使得模型对输入的轻微变形(如平移、缩放)更加鲁棒。
4.批量归一化(Batch Normalization)
作用
批量归一化主要用于解决内部协变量偏移问题,加速模型训练并提高稳定性。
过程
计算均值和方差:对每个小批量的数据计算均值和方差:
μ
B
=
1
m
∑
j
=
1
m
x
j
\mu_B= \frac{1}{m}\displaystyle\sum_{j=1}^{m} x_j
μB=m1j=1∑mxj
σ
B
2
=
1
m
∑
j
=
1
m
(
x
j
−
μ
B
)
2
\sigma_B^2 = \frac{1}{m} \displaystyle\sum_{j=1}^{m} (x_j - \mu_B)^2
σB2=m1j=1∑m(xj−μB)2
标准化:使用均值和方差对输入进行标准化处理:
x ^ j = x j − μ B σ B 2 + ϵ \hat{x}_j = \frac{x_j - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} x^j=σB2+ϵ xj−μB
缩放和偏移:通过可学习的参数 ( γ \gamma γ) 和 ( β \beta β ) 进行缩放和偏移:
y
j
=
γ
x
^
j
+
β
y_j = \gamma \hat{x}_j + \beta
yj=γx^j+β
优势
加速训练:标准化层输入,减少层间的协变量偏移,加快模型收敛。
提高稳定性:缓解梯度消失,增强训练过程的稳定性。
减少过拟合:引入随机性,使模型对训练数据的依赖性降低,有助于正则化。
BN2d的matlab实现:
function result = BN2d(input, mean, var, weight, bias)
% 输入检查
assert(ndims(input) == 4, '输入必须是四维数组');
assert(size(mean, 2) == size(var, 2) && size(var, 2) == size(weight, 2) && size(weight, 2) == size(bias, 2), ...
'均值、方差、权重和偏置必须具有相同的通道数');
channels = size(mean, 2); % 通道数
std_dev = sqrt(var + eps); % 计算标准差
result = (input - mean) ./ std_dev .* weight + bias; % 向量化计算
end
总结
通过卷积、激活、池化和批量归一化这四个操作,卷积神经网络能够高效地处理图像数据,提取多层次的特征。这些操作的有效结合不仅提升了模型的学习能力和表现,还加速了训练过程,增强了模型的鲁棒性。并且根据上述卷积,池化,激活,bn模块,就可以开始搭建简单的神经网络结构了。
标签:卷积,poolSize,stride,池化,归一化,input,size From: https://blog.csdn.net/qq_45041298/article/details/142604268