CNN Explainer
交互式 CNN 可视化
一句话定义:卷积是一种数学运算,通过滑动窗口(卷积核)在输入上提取局部特征。在 CNN 中,卷积核的参数通过训练学习,能自动发现边缘、纹理、形状等特征。
核心概念:
选择不同的卷积核,观察它如何在图像上滑动并提取特征。
💡 将鼠标悬停在输入矩阵左上角 3×3 区域内查看卷积计算过程
想象你用一个小放大镜逐格查看一张大图片:
不同的”放大镜”(卷积核)能发现不同的东西:
| 名称 | 核矩阵 | 作用 |
|---|---|---|
| 边缘检测 (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 torchimport 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)import numpy as npfrom scipy.signal import convolve2d
# 输入图像 (灰度)image = np.random.rand(8, 8)
# Sobel 边缘检测核sobel_x = np.array([ [-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
# 执行卷积edges = convolve2d(image, sobel_x, mode='same')print(f"输入: {image.shape}, 输出: {edges.shape}")
# 手动实现 2D 卷积def conv2d_manual(image, kernel, stride=1, padding=0): # 添加填充 if padding > 0: image = np.pad(image, padding, mode='constant')
h, w = image.shape kh, kw = kernel.shape oh = (h - kh) // stride + 1 ow = (w - kw) // stride + 1
output = np.zeros((oh, ow)) for i in range(oh): for j in range(ow): region = image[i*stride:i*stride+kh, j*stride:j*stride+kw] output[i, j] = np.sum(region * kernel)
return output