卷积、激活、池化与批量归一化:深度学习中的关键操作

在深度学习,尤其是卷积神经网络(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)=mnf(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=DinDconv+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+ex1

Tanh:

Tanh ( x ) = 2 1 + e − 2 x − 1 \text{Tanh}(x) = \frac{2}{1 + e^{-2x}} - 1 Tanh(x)=1+e2x21

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{aij1im,1jn}
最大池化的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=1mj=1naij
平均池化的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=1mxj
σ 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=1m(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模块,就可以开始搭建简单的神经网络结构了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值