5.4 图像生成与风格迁移:反着走流水线


5.4 图像生成与风格迁移:反着走流水线

本节摘要:生成任务把卷积流水线的方向整个反过来:从一段噪声或一张内容图出发,用转置卷积逐级放大回像素世界。生成对抗网络让"造假者"与"鉴伪者"互搏着进步;风格迁移则拆开特征里的内容与风格两个成分,把名画的笔触搬到照片上。本节给出转置卷积的尺寸账与风格损失的 Gram 矩阵实现。

反方向的车道

前三节的流水线都是单行道:像素进、语义出。生成任务把车道倒过来——输入是一段随机噪声(或一张草图),输出是与真实照片难以分辨的图像。车道一倒,卷积也要换方向:正着的卷积把图缩小、把通道变厚;反着的转置卷积把特征图放大、把通道变薄,2.2 节的尺寸公式反过来用。这条反向车道是检测、分割之外的第三类出口,也是如今图像大模型的技术祖先。

学习目标

阅读完本节,你应当能够:

  1. 用转置卷积的尺寸公式从噪声张量推算到目标图像的形状路径;
  2. 画出生成对抗网络的双环结构,解释博弈为何逼着生成器进步;
  3. 写出 Gram 矩阵与风格损失的实现,说清内容项与风格项各约束什么;
  4. 区分优化式风格迁移与前馈式风格迁移两代做法。

一、转置卷积:把特征图放大回去

转置卷积(常被叫作反卷积)做的事是"上采样加学习":不用固定的插值规则,而是让放大本身有可学习的权重。尺寸公式是普通卷积的逆:输出 = (输入−1)×步幅 − 2×填充 + 核尺寸。生成图像的常规路径由此可预算:从 1×1 的噪声向量出发,若干次"翻倍"直达目标分辨率。

import torch import torch.nn as nn z = torch.randn(1, 128, 1, 1) # 起点:128 维噪声,空间尺寸 1×1 up1 = nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1) # 1 变 2 up2 = nn.ConvTranspose2d(64, 32, kernel_size=4, stride=2, padding=1) # 2 变 4 x = up2(up1(z)) print(tuple(x.shape)) # (1, 32, 4, 4):噪声"发芽"成小图 # 公式核对:(1−1)×2 − 2×1 + 4 = 2;(2−1)×2 − 2 + 4 = 4

纯转置卷积的放大容易带来棋盘状的网格伪影(不均匀重叠所致),工程上常用"最近邻插值加普通卷积"替代一半的放大工序——伪影与自由度之间的取舍,是生成网络的经典工程题。

二、生成对抗:造假者与鉴伪者的军备竞赛

没有现成的"正确答案"可对,图像怎么监督?生成对抗网络(GAN)的答案是造一个对手:生成器从噪声造图,判别器(本质上就是本书练的分类器)给图打真伪分。两者同场训练:判别器越练越毒,生成器被迫越造越真——零和博弈把"像不像"变成了可优化的目标。

训练的跷跷板要拿捏:判别器太强,生成器的梯度消失、学不动;太弱,生成器失去进步压力。实践中两边轮流更新、控制强度配比,训练曲线以"振荡"为常态——GAN 的调参名声在外,根源就在这场双方都要活着的博弈。应用端的名场面还包括条件生成(按文字或类别出图)与图像翻译(草图变照片、白天变黑夜)。

三、风格迁移:拆开内容与风格

风格迁移回答另一个问题:保留照片的内容,换上名画的笔触。理论根据藏在卷积特征里——深层特征编码"是什么"(内容),特征通道之间的相关性编码"怎么画"(风格)。风格用 Gram 矩阵度量:把某层特征图的每个通道摊平成向量,两两做内积,得到一个通道数乘通道数的矩阵;两图在某层的风格差,就是两个 Gram 矩阵的均方差。总损失 = 内容项(深层特征的对齐)加风格项(多层 Gram 的对齐),对输入像素做梯度下降,几百步迭代就能"画"出一张迁移图。

import torch def gram(feat): n, c, h, w = feat.shape f = feat.reshape(n, c, h * w) return f @ f.transpose(1, 2) / (c * h * w) # 通道两两内积 torch.manual_seed(0) f_photo = torch.randn(1, 8, 16, 16) # 假想某层照片特征 f_painting = torch.randn(1, 8, 16, 16) # 假想同层名画特征 style_diff = (gram(f_photo) - gram(f_painting)).pow(2).mean() self_diff = (gram(f_photo) - gram(f_photo)).pow(2).mean() print("风格矩阵形状:", tuple(gram(f_photo).shape)) # (1, 8, 8) print("不同图风格差:", round(style_diff.item(), 4), ";自身为", round(self_diff.item(), 4))

第一代风格迁移(优化式)就这么逐图迭代,慢但通用;第二代把"内容图进、风格化图出"训练成前馈网络(生成器),一次前向即出图,代价是每换一种风格要重训一个生成器。手机滤镜的实时风格化,走的全是前馈路线。

巡检记录

  • 反向车道:转置卷积把特征放大回去,尺寸公式是普通卷积的逆,路径可预算;
  • GAN 结构:生成器造假、判别器鉴伪,博弈让"像不像"变成可优化目标,训练以振荡为常态;
  • 内容与风格:深层特征管内容,通道相关性(Gram 矩阵)管风格,两者分开对齐即风格迁移;
  • 两代做法:优化式逐图迭代灵活但慢,前馈式一次出图快但要按风格重训。

💡 关键直觉:判别器就是本书练了八章的分类器——GAN 的全部巧思,是给"不存在正确标签"的生成任务造出了一个可学习的评审。很多看似无解的任务,缺的也是一个能打的对手。

第五章的任务谱系到此走完。第六章做最后一段巡检:工具、风险、数据与趋势——把这门手艺安全地交付出去。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U