Skip to content

卷积 (Convolution)

一句话定义:卷积是一种数学运算,通过滑动窗口(卷积核)在输入上提取局部特征。在 CNN 中,卷积核的参数通过训练学习,能自动发现边缘、纹理、形状等特征。

核心概念:

  • 卷积核 (Kernel/Filter): 一个小矩阵(如 3×3),包含可学习的权重。
  • 步幅 (Stride): 卷积核每次移动的距离。
  • 填充 (Padding): 在输入边缘补零,控制输出尺寸。
  • 特征图 (Feature Map): 卷积操作的输出。

🎨 交互演示:卷积过程 (Interactive)

Section titled “🎨 交互演示:卷积过程 (Interactive)”

选择不同的卷积核,观察它如何在图像上滑动并提取特征。

🔲卷积可视化

检测水平边缘 (Sobel Y)
输入 (5×5)
100
100
100
100
100
100
200
200
200
100
100
200
255
200
100
100
200
200
200
100
100
100
100
100
100
*
卷积核 (3×3)
-1
-1
-1
0
0
0
1
1
1
=
输出 (3×3)
255
255
255
0
0
0
0
0
0
📐 输出尺寸公式:
O = floor((I - K + 2P) / S) + 1
本例: I=5, K=3, P=0, S=1 → O = (5-3+0)/1 + 1 = 3

💡 将鼠标悬停在输入矩阵左上角 3×3 区域内查看卷积计算过程


想象你用一个小放大镜逐格查看一张大图片:

  • 放大镜 = 卷积核(决定你关注什么特征)
  • 移动放大镜 = 卷积操作(逐像素滑动)
  • 记录看到的内容 = 输出特征图

不同的”放大镜”(卷积核)能发现不同的东西:

  • 边缘检测核:找到图片中的轮廓
  • 模糊核:让图片变模糊
  • 锐化核:增强细节


2D 卷积
(IK)[i,j]=mnI[i+m,j+n]K[m,n](I * K)[i,j] = \sum_{m}\sum_{n} I[i+m, j+n] \cdot K[m, n]
  • II: 输入图像
  • KK: 卷积核 (如 3×3)
  • *: 卷积运算符
  • 输出每个位置是输入局部区域与核的加权和
输出尺寸公式
O=IK+2PS+1O = \frac{I - K + 2P}{S} + 1
  • II: 输入尺寸
  • KK: 卷积核尺寸
  • PP: 填充 (Padding)
  • SS: 步幅 (Stride)
  • 例: 输入 32×32, 核 3×3, P=1, S=1 → 输出 32×32
名称核矩阵作用
边缘检测 (Sobel X)[[-1,0,1],[-2,0,2],[-1,0,1]]检测垂直边缘
边缘检测 (Sobel Y)[[-1,-2,-1],[0,0,0],[1,2,1]]检测水平边缘
高斯模糊[[1,2,1],[2,4,2],[1,2,1]]/16平滑图像
锐化[[0,-1,0],[-1,5,-1],[0,-1,0]]增强边缘

import torch
import torch.nn as nn
# 定义卷积层
conv = nn.Conv2d(
in_channels=3, # 输入通道 (RGB=3)
out_channels=64, # 输出通道 (64个卷积核)
kernel_size=3, # 卷积核大小 3×3
stride=1, # 步幅
padding=1 # 填充 (保持尺寸不变)
)
# 输入: [Batch, Channel, Height, Width]
x = torch.randn(1, 3, 224, 224)
output = conv(x)
print(output.shape) # [1, 64, 224, 224]
# 查看卷积核权重
print(conv.weight.shape) # [64, 3, 3, 3]
# 64个输出通道,每个通道有3个3×3的核(对应RGB)



CNN Explainer

交互式 CNN 可视化

访问

CS231n CNN

斯坦福 CNN 课程笔记

阅读