卷积、卷积矩阵(Convolution matrix)与核(Kernel)

本文介绍了卷积矩阵在图像处理中的应用,包括锐化、模糊、边缘增强等功能,并通过MATLAB示例验证了卷积操作与卷积矩阵的等价性。
  • 在图像处理领域,Kernel = convolution matrix = mask,它们一般都为一个较小的矩阵;
  • 用于:Sharpen,Blur, Edge enhance,Edge detect,Emboss(使凸出;在……上作浮雕图案;装饰)

1. 卷积操作与卷积矩阵的等价性

  • (1)创建一维信号

    N = 100;
    s = zeros(N, 1);
    k = [20, 45, 70];
    a = [2, -1, 1];
    s(k) = a;
  • (2)创建卷积核

    L = 4;
    h = ones(L, 1)/L;
  • (3)使用 matlab 创建 convolution matrix

    首先考虑,卷积矩阵的 size,卷积操作conv(h, s) 返回的响应其长度为 L+N-1, 因此:

    M = N+L-1;
    H = sparse(M, N);
    e = ones(N, 1)
    for i = 0:L-1,
        H = H + spdiags(e*h(i+1), -i, M, N);
    end
  • (4)验证二者操作的等价性:

    err = H*s - conv(h, s);
    max_err = max(abs(err));

2. spy:可视化稀疏矩阵的形式

而不是简单地将稀疏矩阵以一个矩阵的形式显示,显然是因为其规模十分之大,且较为稀疏,不易直观观察。

Kernel (image processing)
8.2. Convolution Matrix

转载于:https://www.cnblogs.com/mtcnn/p/9422730.html

卷积神经网络(CNN)中,矩阵乘法是实现卷积操作的心机制之一。卷积本质上是一种局部加权求和的过程,而通过将卷积操作转化为矩阵乘法,可以更高效地利用现代计算硬件(如GPU)进行加速。 ### 卷积操作的矩阵乘法实现 卷积运算可以通过一种称为“im2col”(image to column)的技术转换为矩阵乘法。具体来说,输入特征图中的每个局部感受野区域被展开成一列向量,这些列向量组合在一起形成一个大的输入矩阵此同时,卷积(滤波器)也被展平为一行向量,并堆叠成权重矩阵。最终的输出可以通过对这两个矩阵执行标准的矩阵乘法得到。 例如,假设输入特征图大小为 $H \times W \times C_{in}$,卷积大小为 $K \times K$,数量为 $C_{out}$,步长为 $S$,那么通过 im2col 转换后,输入矩阵的形状将是 $(K^2 \cdot C_{in}) \times (H' \cdot W')$,其中 $H'$ 和 $W'$ 是输出特征图的高度和宽度;而权重矩阵的形状则是 $C_{out} \times (K^2 \cdot C_{in})$。两者相乘后的结果矩阵形状为 $C_{out} \times (H' \cdot W')$,再将其重塑为 $H' \times W' \times C_{out}$ 的张量即为卷积后的输出 [^1]。 ### 矩阵乘法的优势 使用矩阵乘法来实现卷积具有以下优势: - **计算效率高**:现代深度学习框架通常优化了矩阵乘法操作,因此将卷积转换为矩阵乘法可以显著提高计算效率。 - **易于并行化**:矩阵乘法非常适合在并行计算设备上执行,如GPU或TPU,从而加速训练和推理过程。 - **内存访问模式友好**:im2col 方法虽然会增加一定的内存占用,但其数据排列方式有助于提升缓存命中率,减少内存带宽瓶颈。 ### 应用场景 除了基本的卷积层之外,矩阵乘法还广泛应用于其他卷积相关的操作中,例如: - **转置卷积(Deconvolution)**:用于图像上采样任务,也可以通过类似的矩阵操作实现。 - **分组卷积(Grouped Convolution)**:将输入通道分成若干组,每组独立进行卷积计算,常用于减少参数量和计算复杂度。 - **深度可分离卷积(Depthwise Separable Convolution)**:先对每个输入通道单独做卷积,然后再进行逐点卷积,进一步降低计算成本。 综上所述,矩阵乘法不仅简化了卷积操作的实现,也为后续的各种优化提供了基础。这种转换方法已经成为大多数深度学习框架的标准实践之一。 ```python import numpy as np def im2col(input_data, kernel_h, kernel_w, stride=1, padding=0): """ Convert input image to column matrix for convolution via matrix multiplication. Args: input_data: Input tensor of shape (batch_size, channels, height, width) kernel_h: Kernel height kernel_w: Kernel width stride: Stride value padding: Padding size Returns: col: Column matrix representation of the input data """ N, C, H, W = input_data.shape out_h = (H + 2 * padding - kernel_h) // stride + 1 out_w = (W + 2 * padding - kernel_w) // stride + 1 # Pad input with zeros along spatial dimensions padded_input = np.pad(input_data, ((0, 0), (0, 0), (padding, padding), (padding, padding)), mode='constant') # Initialize output array col = np.zeros((N, C, kernel_h, kernel_w, out_h, out_w)) for y in range(kernel_h): y_max = y + stride * out_h for x in range(kernel_w): x_max = x + stride * out_w col[:, :, y, x, :, :] = padded_input[:, :, y:y_max:stride, x:x_max:stride] # Reshape to column matrix format col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N * out_h * out_w, C * kernel_h * kernel_w) return col ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值