在深度学习,尤其是卷积神经网络(CNN)中,卷积、激活、池化和批量归一化是四个基本操作。它们共同作用,帮助模型高效学习和提取数据中的重要特征。

1. 卷积操作

作用
卷积操作旨在通过滑动卷积核(过滤器)在输入数据上提取局部特征,如边缘和角点。
过程

滑动卷积核:卷积核在输入特征图上移动,逐个覆盖区域。
特征计算:在每个位置,卷积核与输入特征图的对应部分进行逐元素相乘并求和,得到输出值。公式为:

h(i,j)=∑m∑nf(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)
在此公式中,fff代表输入特征图,ggg 代表卷积核,hhh 为输出特征图。输出特征图的横纵坐标由 iiijjj表示,而卷积核的横纵坐标则用 mmmnnn 表示。
输出特征图的大小需要满足以下公式:
Dout=Din−Dconv+2PS+1D_{out}=D_{in}-D_{conv}+2PS+1Dout=DinDconv+2PS+1
DoutD_{out}Dout表示输出特征图的维度(宽度或高度)。
DinD_{in}Din表示输入特征图的相应维度大小。
DconvD_{conv}Dconv表示卷积核的相应维度大小。
PPP表示边界填充的大小。
SSS表示卷积操作的步长。

优势

参数共享:通过在整个输入上共享卷积核参数,显著减少模型参数数量。
平移不变性:能够有效捕捉到不同位置的相同特征,提高了模型的鲁棒性。

2. 激活运算

作用
激活函数引入非线性特性,使得神经网络能够学习和表示复杂的模式。
过程

非线性变换:对每个输入值进行变换,常见的激活函数包括:
ReLU(Rectified Linear Unit):

ReLU(x)=max⁡(0,x)\text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)

Sigmoid:

Sigmoid(x)=11+e−x\text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=1+ex1

Tanh:

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

Softmax(用于多分类):

Softmax(zi)=ezi∑jezj \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}} Softmax(zi)=jezjezi
优势

增强表达能力:通过引入非线性,网络能够学习复杂的特征。
加快收敛:如ReLU等激活函数能有效减轻梯度消失问题,加速模型训练。

3. 池化运算

作用
池化操作用于减少特征图的维度,降低计算复杂度,同时保持关键信息。
过程

最大池化:在池化窗口中选择最大值,提取显著特征。公式为:

Pmax=max⁡{aij∣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

平均池化:计算池化窗口内所有值的平均,平滑特征。公式为:

Pavg=1mn∑i=1m∑j=1naijP{\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×22 \times 22×2) 或 (3×33 \times 33×3) 的窗口。

优势

-降低计算量:通过减少特征图的空间维度,提升训练效率。
增强不变性:使得模型对输入的轻微变形(如平移、缩放)更加鲁棒。

4.批量归一化(Batch Normalization)

作用
批量归一化主要用于解决内部协变量偏移问题,加速模型训练并提高稳定性。
过程

计算均值和方差:对每个小批量的数据计算均值和方差:

μB=1m∑j=1mxj\mu_B= \frac{1}{m}\displaystyle\sum_{j=1}^{m} x_j μB=m1j=1mxj
σB2=1m∑j=1m(xj−μ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=xj−μBσB2+ϵ \hat{x}_j = \frac{x_j - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}x^j=σB2+ϵ xjμB

缩放和偏移:通过可学习的参数 (γ\gammaγ) 和 ( β\betaβ ) 进行缩放和偏移:

yj=γ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模块,就可以开始搭建简单的神经网络结构了。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐