共计 1586 个字符,预计需要花费 4 分钟才能阅读完成。
为什么需要 CAE?传统降噪的瓶颈
在图像处理中,高斯滤波、中值滤波等传统方法就像用同一把梳子给所有人梳头——简单粗暴但效果有限。它们会无差别模糊整张图片,导致边缘细节丢失(比如下图右侧树叶纹理完全糊掉)。而 CAE 的智能之处在于:

- 像人类一样学习图像本质特征
- 自动区分噪声与真实内容
- 对不同类型的噪声自适应处理
解剖 CAE:比普通自编码器强在哪?
普通自编码器(AE)就像用全连接网络搭建的‘传送带’:
- 输入图像被展平成一维向量(破坏空间结构)
- 中间层像压缩包一样存储信息
- 输出层试图还原原始尺寸
而 CAE 引入了两大神器:
- 卷积层:像放大镜一样逐区域扫描,保留局部特征(如边缘、纹理)
- 池化层:逐步抽象高层语义(类似人眼从像素→边缘→物体部分的认知过程)
手把手搭建 CAE 模型
环境准备
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from torchvision.datasets import CIFAR10
Encoder 设计要点
class Encoder(nn.Module):
def __init__(self):
super().__init__()
# 卷积核 size= 3 能捕捉 8 邻域特征,stride= 2 实现下采样
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1) # 32x16x16
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1) # 64x8x8
def forward(self, x):
x = torch.relu(self.conv1(x))
x = torch.relu(self.conv2(x))
return x
Decoder 的逆操作
class Decoder(nn.Module):
def __init__(self):
super().__init__()
# 转置卷积实现上采样
self.t_conv1 = nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1)
self.t_conv2 = nn.ConvTranspose2d(32, 3, kernel_size=3, stride=2, padding=1, output_padding=1)
def forward(self, x):
x = torch.relu(self.t_conv1(x))
x = torch.sigmoid(self.t_conv2(x)) # 输出压缩到 0 - 1 范围
return x
实战中的血泪经验
数据增强的奇技淫巧
当只有少量数据时:
- 对输入图片随机旋转 5 度(防止模型死记硬背)
- 添加随机亮度扰动(模拟真实噪声场景)
- 使用 cutout 随机遮挡(增强鲁棒性)
transform = transforms.Compose([transforms.RandomRotation(5),
transforms.ColorJitter(brightness=0.1),
transforms.ToTensor(),])
显存不够怎么破?
- 把 batch_size 从 32 降到 16
- 使用梯度累积:每 4 个 batch 更新一次参数
- 尝试混合精度训练
scaler = torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): output = model(input) loss = criterion(output, target) scaler.scale(loss).backward()
进阶思考题
- 视频降噪中如何利用时间连续性?可以尝试将 CAE 与 LSTM 结合
- 能否用 CAE 做图像压缩?分析量化编码对重构质量的影响
完整代码已放在 Colab: 点击运行
正文完
