跳到主要内容

一个造假一个鉴定 — 没有标准答案时,让另一个网络来当裁判

这一章讲三件事: 没有标准答案的时候,训练信号从哪儿来; 一个网络怎么反着走、从几个随机数长出一张图; 以及为什么这一章的模型你没法用损失曲线判断它训得好不好它在全书链条里的位置: 上一章造图靠的是「压回去再还原」, 而「还原得像不像」这把尺子,是拿原图当参照量出来的。 这一章要凭空造,没有原图可比——所以第一件要解决的事是:裁判从哪儿来。

1. 先看这一章和上一章的分岔

两章都在造图,但判断质量的方式完全不同,书自己点破了这一条1:

上一章(VAE)这一章(GAN,生成式对抗网络——名字的来历第 2 节讲)
怎么知道生成的图好不好拿输出和输入比,算均方误差另养一个网络来判,书管它叫判别器
前提必须有一张原图当参照不需要原图

这个差别不是风格问题,是能力边界的差别: 「还原得像」和「造得像」是两件事,而只有后者才叫凭空生成。

先看它能做到什么程度

书给的例子很有说服力:某个模型生成的人脸图像,人眼几乎难以分辨真假—— 只是脸上个别部位有小缺陷,背景看起来不那么自然2

书还列了一串别的用法:低分辨率图变高分辨率、补上图像里缺掉的部分、 给黑白照片上色、换一个人的姿势、生成音乐, 以及一个很实际的用途:在真实样例难拿到的场合造训练数据(比如给自动驾驶造街景)2

2. 承重节:让另一个网络来当裁判

这一节是本章的地基。整个机制只有两个角色。

两个角色

书用的比喻是造假者和鉴定专家3:

造假者(**生成器**):目标是造出以假乱真的画
鉴定专家(**判别器**):职责是分辨眼前这幅是真是假

造假者为了骗过鉴定专家,不断把赝品做得更逼真;
鉴定专家为了不被骗,不断提升自己的眼力。

**这两个部分是对立的 —— 「对抗」这个名字就是从这儿来的。**

图说:妙处在于,**正是因为互相为敌,两边的本事都被逼着涨了。**

这套「两个网络互相为敌」的结构,全名叫生成式对抗网络,缩写 GAN2—— 这个缩写你出门一定会撞见,所以留着它。

⚠ 比喻到此为止,后面一律用正式名字:生成器、判别器。

一开始为什么转得起来

书讲了开局那一步,这一步很关键4:

一开始生成器的权重是随机的,造出来的东西一塌糊涂。
→ **所以判别器很快就能学会分辨真假。**

然后是整个流程的关键:**每次生成器交上一件赝品,
判别器都会给出充分的反馈 —— 哪儿不像、该往哪个方向改。**

生成器照着改,下次就更像一点。

图说:**这就是训练信号的来源。**
没有人贴标签,**训练信号是另一个网络给的。**

训判别器:两批图,一次二分类

这一步最好懂,它就是第 05 章那种二分类5:

① 生成器吃一批随机向量,吐出一批假图
(随机向量就是上一章那个本征向量,形状 [批尺寸, 本征维数])
② 从真实数据里抽同样多的真图
③ 两批拼成一个批次 → 形状 [2 × 批尺寸, 28, 28, 1]
④ 判别器吐出每张图「是真图」的概率
⑤ 我们知道哪些真哪些假 → 用二元交叉熵算损失 → 反向传播,更新判别器

⚠ 这一步里 **生成器只负责供图,它一个权重都不改。**

图说:这一步之后,判别器的眼力更好了。

训生成器:全书最反直觉的一步

这一步书自己叫停让读者想一想,所以我们也慢一点6:

① 生成器再造一批假图
② **不要真图了** —— 这一步一张真图都不需要
③ **把这批假图全部贴上「真」的标签** ← 明知是假的,标签写真
④ 送进判别器
⑤ 判别器(正确地)判定它们是真的概率很低
→ **因为标签写的是「真」,损失会非常大**
⑥ 反向传播 —— **但这一次把判别器整个冻住,只更新生成器**

图说:第 ③ 步和第 ⑥ 步是这一章仅有的两个技巧,而它们都很硬。

为什么这么干能起作用?把因果补全:

发生了什么
标签写「真」,而判别器说「假」损失很大,梯度很强
梯度回传,想让损失变小也就是想让判别器的真实度输出变高
但判别器被冻住,改不了那就只能改生成器——让它造出的图更能骗过判别器
结果生成器朝着「更逼真」的方向被推了一步

为什么必须冻住判别器? 书说得很明白:不冻的话, 「让真实度输出变高」这个目标会顺手把判别器的辨别力也压下去6那等于让裁判放水,整个机制就废了。

冻住某个模型不更新它的权重,这个动作第 07 章讲过(那一章冻的是借来的基模型)。 书自己在这里点明了是同一个手法6

两步互相咬住

书对这个关系的形容值得记住:这两个训练步骤之间有一种微妙的阴阳调和关系7:

能这么训生成器的前提,是**判别器已经有不错的辨别力**。
判别器的辨别力从哪儿来?**从上一步来。**

→ 两步交替:训判别器 → 训生成器 → 训判别器 → ……

图说:**两个部分互相对立,又互相补益。**
训练结束之后,**判别器就被扔掉了,只留生成器**[^4]。

3. 生成器:一个反着走的卷积网络

这一节回答:从 100 个随机数怎么长出一张 28×28 的图。

方向和第 06 章相反

第 06 章的卷积是越走越小:28×28 → 26×26 → 池化到 13×13…… 生成器要越走越大。用的是卷积的逆运算8:

第 06 章的卷积这一章的逆运算
输出的高和宽一般比输入小比输入大
它在干什么收缩扩张
书里的别名——也叫反卷积

具体这条链

100 个随机数(本征向量)
↓ 密集层,3 × 3 × 384 = 3456 个单元
↓ 变形成 [3, 3, 384] ← 到这儿它已经「像一张图」了
↓ 卷积的逆运算,192 个核 → [7, 7, 192]
↓ 卷积的逆运算,96 个核 → [14, 14, 96]
↓ 卷积的逆运算,1 个核 → [28, 28, 1] ← 和真图形状完全一致
输出用 tanh

图说:密集层那个单元数(3×3×384)不是随手写的 ——
**它是倒推出来的,为的是让最后一层的输出正好等于真图的形状**[^9]。

最后那个 tanh 是什么,先说清楚。 它和第 04 章那些弯折函数是同一族的东西: 给它任何一个数,它都吐回一个落在 −1 到 1 之间的数——0 进去还是 0 出来, 正数越大越贴近 1,负数越小越贴近 −1,永远越不过这两条线 (补充(不在书里,来自通用知识);书里管它叫双曲正切)。

为什么图像生成偏偏用它收尾:因为真图喂进来之前也被缩放到了 −1 到 1 这个区间。 生成器的输出必须和真图落在同一把尺子上,判别器才比得了 (补充(不在书里,来自通用知识))。

但这条理由不是书给的。 书自己只说了一句 「tanh 在其他模型类型中不是很常见」,为什么用它,一个字没给9 ——第 5 节那张技巧表里,这一条是唯一一条连理由都没有的。

判别器:一个正着走的卷积网络

判别器就是第 06 章那种网络,没有新东西10:

[28, 28, 1]
↓ 四个卷积层(32 / 64 / 128 / 256 个核,都是 3×3)
每层后面跟一个 leakyReLU 和一个 dropout(丢弃率 0.3)
↓ 扁平化
↓ 密集层 1 单元 + sigmoid → **这张图是真的概率**
↓ 密集层 10 单元 + softmax → **这张图是哪个数字** ← 下一节讲

图说:**它有两个输出,不是一个。**
能这么接是因为用了函数式模型(第 14 章那种,可以分岔)。

这里的 leakyReLU 也要当场说清。 第 04 章那个 ReLU 的规矩是: 正数原样放行,负数一律压成 0。leakyReLU 只改了后半句—— 负数不再压成 0,而是保留一个很小的负值(书用的斜率参数是 0.2)11

差别就这一处,后果却很实在:它的输出里零少得多。 记住这一条——第 5 节那张技巧表里「普通 ReLU 会造出稀疏梯度」那句,靠它才读得通。

4. 让它按你说的生成:多一个输入,多一个输出

上面那套只能生成「某个手写数字」,想要哪个数字全凭运气。加两样东西就能指定。

书用的这个变种叫 ACGAN12多的东西只有两处:

加在哪加了什么干什么用
判别器第二个输出:10 个类别的概率它不但判真假,还要判这是哪个数字
生成器第二个输入:一个类别编号你说要 8,它就生成 8

类别编号怎么进得去

这一步是第 13 章那个手法的第三次出现13:

你要生成数字 8 → 输入一个整数 8
↓ 查一张可训练的表(**嵌入**),变成一串数,长度和本征向量一样
↓ **和本征向量逐元素相乘**,融成一个新向量
↓ 送进上一节那条反着走的链子

图说:书自己点破了这条线 —— 这和第 13 章拿词编号查表、
第 14 章拿字符编号查表**在数学上是一样的**[^12]。
区别只在用途:那两次是为了喂给后面的层,这次是为了**和本征向量融合**。

类别怎么被训对

判别器的第二个输出用的是分类交叉熵那一路的损失。它进了两笔账14:

训判别器时: 真假那笔损失 + 类别那笔损失,**两笔的梯度相加**再更新权重

训生成器时: 除了「真实度不够」那笔账,还多一笔 ——
**你让它生成 8,判别器却说这是 9 → 类别那笔损失也很大**
→ 于是生成器同时被推着「造得更真」和「造得更像 8」

图说:这就是「按你说的生成」是怎么被训出来的。

5. 代价:损失曲线读不了

第 04 章那条记账习惯在这一章要用,而这一章的账单是全书最贵的。

现象

书印了训练过程的损失曲线,并且专门指出了它的特征15:

这些损失曲线不像其他类型神经网络那样呈单调下降趋势。 训练到最后,判别器和生成器的损失都没有趋近于零,只是停止了变化

第 11 章教的那套诊断法在这里**整个失效**:
两条线都高 → 欠拟合? **不成立**
训练低验证升 → 过拟合? **不成立**

因为损失在这里量的不是「离答案多远」,是「这一轮谁占了上风」——
**生成器变强,判别器的损失就涨;判别器变强,生成器的损失就涨。**

图说:**你手上没有一个数字能告诉你「训得够不够好」。**
书的做法是训数小时,然后**看生成的图**。

能训起来靠的是一串经验规矩

书对这件事的坦白很值得抄下来9:

GAN 的训练和调参非常困难。这份训练脚本是研究者大量试错的结晶。 就和深度学习领域的绝大部分事情一样,它们更接近艺术,而不是科学: 这些技巧属于经验法则,而不是系统理论。

书列出来的几条9:

技巧书给的理由
生成器最后一层用 tanh书只说「在其他模型类型中不是很常见」,没有给理由
判别器里插 dropout引入随机性——训练可能进入一种僵住的平衡状态,随机能帮它避开
真实度标签用 0.95,不用 1同上,也是为了引入随机性
降采样用带步长的卷积,不用最大池化最大池化会造出稀疏的梯度(很多零),而稀疏梯度会阻碍 GAN 训练
激活用 leakyReLU,不用普通的 ReLU同上——普通 ReLU 也会造出稀疏梯度

⚠ 这里有一条和前面各章相反的结论,必须点明: 在别的模型里,梯度稀疏往往是好事;在 GAN 里不是9这是全书唯一一处「同一个性质,在两种模型上结论相反」。

6. 主走查:生成一个数字 8

这一章每个承重机制在这条走查上各占一步。形状和数字全部来自书里,标注除外。

发生了什么具体的数 / 状态
1准备两个输入:一个本征向量 + 一个类别编号本征向量形状 [本征维数];类别编号就是整数 8
2类别编号查一张可训练的表变成一串数,长度和本征向量一样——第 13 章那个手法的第三次出现
3两者逐元素相乘,融成一个向量这就是「让它生成 8」这个要求进入模型的方式
4密集层 → 变形3 × 3 × 384 = 3456 个单元 → [3, 3, 384]
5卷积的逆运算,第一次放大[7, 7, 192]
6第二次放大[14, 14, 96]
7第三次放大,输出用 tanh[28, 28, 1]——和真图形状完全一致
8训判别器:这批假图 + 同样多的真图拼一起形状 [2 × 批尺寸, 28, 28, 1]
9判别器吐两个输出① 是真图的概率(1 个数)② 是哪个数字(10 个数)
10算两笔损失,梯度相加,更新判别器真假那笔用二元交叉熵,类别那笔用分类交叉熵
11这一步生成器一个权重都不动它只负责供图
12训生成器:再造一批假图,不要真图一张真图都不需要
13把假图全部贴上「真」的标签书里用的不是 1,是 0.95——故意留一点随机
14送进判别器,并把判别器整个冻住第 07 章那个层固化的手法
15判别器说「像是假的」→ 损失很大因为标签写的是真
16梯度回传,判别器改不了,只能改生成器→ 生成器朝「更逼真」被推一步
17同时,类别那笔账也在推它你要 8,判别器说是 9 → 推它造得更像 8
18两步交替,训数小时用 Node 训;有显卡快得多
19想看训得怎么样?看不了损失两条曲线都不单调,最后也不趋近于零,只是不再变
20训完判别器扔掉,只存生成器
21浏览器里用它喂 10 个本征向量 + 标签 [0,1,2,…,9]吐出一排 0 到 9
22收账拿到了「凭空造 + 按要求造」;代价是彻底失去了用损失判断好坏的能力

7. 作者的判断与证据

书里给了证据的:

  • 模型的每一步形状。 [3,3,384][7,7,192][14,14,96][28,28,1], 代码里的注释逐层标了升采样目标16
  • 损失曲线不单调、最后不趋近于零。 书印了实际的曲线图并做了说明15
  • 训练要花数小时。 书直接说了,并给了用 TensorBoard 看曲线的办法17
  • 生成的图和真图并排给了。 顶上一排是生成的 0~9,底下是真实数据里抽的18

属于作者判断、书里没给证据的:

  • 那五条训练技巧,书自己声明是经验法则而不是系统理论9其中「tanh」那一条连理由都没有给。
  • 「随机性有助于稳健」。 书给了做法(dropout、0.95 的标签), 没有给对照实验证明去掉它们就训不起来9
  • 「稀疏梯度会阻碍 GAN 训练」。 同样是经验,书没有给机制解释9

书自己坦白的:

  • GAN 的训练和调参非常困难,这份脚本是大量试错的结晶9

判断(我们的,不是书里的): 这一章最该带走的不是 GAN 这个结构, 是**「裁判可以是学出来的」这个想法本身。** 前十六章每一次判断好坏,靠的都是一把人写死的尺子——均方误差、交叉熵、准确率。 这一章第一次说:尺子本身也可以是一个模型,而且可以边训边变强。 代价也随之而来:尺子会动,你就没法拿它的读数当进度条。 如果错,会错在: 如果你的任务能找到一把不动的好尺子(比如上一章那种「还原得像不像」), 那就不该用这一章的东西——你会白白付掉「训练过程不可观测」这个代价。

8. 边界与局限

  • 训练稳定性没有理论,只有技巧。 书自己把这一节命名为「各种训练技巧的组合拳」, 并声明这些是经验法则9
  • 没有讲怎么判断「训好了」。 损失读不了,书的做法是训数小时然后看图, 没有给任何量化的停止判据。
  • 「动态平衡」这个卡死的状态只提了名字。 怎么识别、卡住了怎么办,书没讲9
  • 只做了一种 GAN。 开头列的那一串用途(超分辨率、修补、上色、换姿势、生成音乐) 一个都没有展开2
  • 批标准化又一次只出现在代码里。 生成器的两层之间插了它, 全书仍然没有讲它在算什么——这是第 01 章欠到现在的债。
  • leakyReLU 书只说清了「差在哪」,没说清「凭什么」。 「负数不压成 0,留一点点」这句原文给了, 但它内部怎么算、那个 0.2 的斜率凭什么定这么大,书一个字没讲11
  • tanh 那一条连「差在哪」都没给。 书只说它「在其他模型类型中不是很常见」, 为什么图像生成偏偏用它收尾,原文没有交代——第 3 节那条理由是我们补的,已当场标明。
  • 判别器为什么不会「赢死」生成器,书没有讨论。 这是 GAN 最著名的失败模式之一, 整章不涉及。

9. 可带走的

  1. 上一章判断质量靠「和原图比」,这一章没有原图可比——所以裁判必须是学出来的;
  2. 两个角色:生成器造假,判别器鉴定。「对抗」这个名字就是从两者对立来的;
  3. 训判别器很朴素: 真图假图各一批拼起来,告诉它谁真谁假,做一次二分类; 这一步生成器一个权重都不动;
  4. 训生成器是全章最反直觉的一步: 造一批假图,贴上「真」的标签, 把判别器整个冻住,然后反向传播;
  5. 它为什么管用: 标签写真而判别器说假 → 损失很大 → 想让损失变小就得让判别器的真实度输出变高 → 判别器改不了,只能改生成器;
  6. 冻住判别器是必须的,不冻的话「让真实度输出变高」会顺手把判别器的辨别力压下去;
  7. 两步交替,互相咬住: 能这么训生成器的前提是判别器已经够强, 而判别器的强来自上一步;
  8. 生成器是一个反着走的卷积网络: 100 个随机数 → [3,3,384][7,7,192][14,14,96][28,28,1],用的是卷积的逆运算;
  9. 想指定生成什么,加两样东西: 判别器多一个「这是哪个类别」的输出, 生成器多一个类别输入(查表变成一串数,和本征向量逐元素相乘);
  10. 最贵的代价:损失曲线不单调、最后也不趋近于零。 第 11 章那套诊断法在这里整个失效,你没有任何数字能告诉你训得够不够好;
  11. 能训起来靠的是一串经验规矩: tanh 收尾、判别器里插 dropout、 真实度标签用 0.95 不用 1、用带步长的卷积代替最大池化、用 leakyReLU;
  12. 记住那条反向的结论: 别的模型里梯度稀疏往往是好事,在 GAN 里不是;
  13. 训完之后判别器就扔了,只留生成器。

10. 原文地图

主题原书章原文位置
GAN 的出处(2014);人脸几乎难辨真假第 10 章text/22-ch10.txt:452(搜「无法分辨真假」) · text/22-ch10.txt:454(搜「Generative Adversarial Nets」)
GAN 的一串用途;造训练数据第 10 章text/22-ch10.txt:460(搜「图像超分辨率重构」)
和 VAE 的分岔:靠判别器保证质量第 10 章text/22-ch10.txt:466(搜「通过判别器」)
造假者与鉴定专家;「对抗」的由来第 10 章text/22-ch10.txt:474(搜「造假者」)
开局怎么转起来;训完只用生成器第 10 章text/22-ch10.txt:476(搜「随机初始化的」)
训判别器:两批拼一起、二元交叉熵第 10 章text/22-ch10.txt:478(搜「随机向量作为输入」) · text/22-ch10.txt:482(搜「二元交叉熵」)
训生成器:假图贴真标签、冻住判别器第 10 章text/22-ch10.txt:486(搜「假装生成的图像是真实的」)
阴阳调和;两步互为前提第 10 章text/22-ch10.txt:488(搜「阴阳调和」)
判别器结构:四个卷积层、双输出第 10 章text/22-ch10.txt:494(搜「单输入-双输出」) · text/22-ch10.txt:531(搜「真实度二元分类」)
生成器结构:两个输入;类别嵌入相乘第 10 章text/22-ch10.txt:541(搜「imageClass」) · text/22-ch10.txt:543(搜「逐元素相乘」)
卷积的逆运算;和卷积方向相反第 10 章text/22-ch10.txt:545(搜「反卷积」)
升采样的三级形状第 10 章text/22-ch10.txt:553(搜「3 * 3 * 384」) · text/22-ch10.txt:559(搜「升采样至」)
两笔损失的梯度相加第 10 章text/22-ch10.txt:616(搜「sparseCategoricalCrossentropy」) · text/22-ch10.txt:618(搜「两个损失的梯度会被相加」)
训练技巧清单;经验法则而非理论第 10 章text/22-ch10.txt:628(搜「更接近艺术」) · text/22-ch10.txt:634(搜「0.95」) · text/22-ch10.txt:636(搜「稀疏梯度」)
训练要数小时;用 TensorBoard 看曲线第 10 章text/22-ch10.txt:648(搜「数个小时」)
损失曲线不单调;收敛但不趋近于零第 10 章text/22-ch10.txt:656(搜「dLoss」) · text/22-ch10.txt:658(搜「只是停止了变化」)
浏览器里生成一排 0~9;100 个滑块第 10 章text/22-ch10.txt:669(搜「[10, 1]」) · text/22-ch10.txt:674(搜「100个滑块」)

Footnotes

  1. 出处:「第 10 章 生成式深度学习」第 466 段(text/22-ch10.txt:466,搜「通过判别器」)。原文:「VAE通过衡量原输入和解码器输出的MSE损失来确保生成结果的质量。而GAN则通过判别器(discriminator)确保输出的质量。」

  2. 出处:「第 10 章」第 452 与 460 段(text/22-ch10.txt:452,搜「无法分辨真假」;text/22-ch10.txt:460,搜「图像超分辨率重构」)。GAN 的原始出处见第 454 段脚注:Goodfellow 等人 2014 年的「Generative Adversarial Nets」。 2 3 4

  3. 出处:「第 10 章」第 474 段(text/22-ch10.txt:474,搜「造假者」)。原文:「这两个部分的对立,正是GAN模型的名字中『对抗』(adversarial)部分的由来。」

  4. 出处:「第 10 章」第 476 段(text/22-ch10.txt:476,搜「随机初始化的」)。原文末句说明训练完成后「我们只会用到生成器部分」。

  5. 出处:「第 10 章」第 478~482 段(text/22-ch10.txt:478,搜「随机向量作为输入」;text/22-ch10.txt:482,搜「二元交叉熵」)。原文明说这一步「生成器……只是简单地提供生成的图像,它并不会参与到反向传播中」。

  6. 出处:「第 10 章」第 486 段(text/22-ch10.txt:486,搜「假装生成的图像是真实的」)。原文自己叫读者停下来想一想,并称这是「GAN训练中最重要的一个技巧」;冻住判别器那一条,原文说「此处使用的技巧和第5章中介绍迁移学习时使用的相同」——那正是我们第 07 章讲的层固化。 2 3

  7. 出处:「第 10 章」第 488 段(text/22-ch10.txt:488,搜「阴阳调和」)。

  8. 出处:「第 10 章」第 545 段(text/22-ch10.txt:545,搜「反卷积」)。原文:「conv2d一般会收缩输入的维度,而conv2dTranspose则会扩张它们。」

  9. 出处:「第 10 章」第 626~636 段(text/22-ch10.txt:628,搜「更接近艺术」;text/22-ch10.txt:634,搜「0.95」;text/22-ch10.txt:636,搜「稀疏梯度」)。原文:「在别的深度学习模型类型中,稀疏往往是好事,在GAN模型中却不尽然。」「动态平衡」这个卡死状态见第 634 段。 2 3 4 5 6 7 8 9 10

  10. 出处:「第 10 章」代码清单 10-9 与第 494 段(text/22-ch10.txt:494,搜「单输入-双输出」;text/22-ch10.txt:531,搜「真实度二元分类」)。四个卷积层的核数分别是 32、64、128、256,每层后面跟 leakyReLU 与丢弃率 0.3 的 dropout。

  11. 出处:「第 10 章」第 636 段(text/22-ch10.txt:636,搜「负数部分允许较小的负值」)与代码清单 10-9(text/22-ch10.txt:508,搜「alpha: 0.2」)。原文:「与其使用一般的ReLU激活函数,不如使用leakyReLU激活函数,它的负数部分允许较小的负值,而不是必须为零。」书给了这个差别,但没有讲它内部怎么算、那个斜率该怎么定。 2

  12. 出处:「第 10 章」第 468 段与第 470 段脚注(text/22-ch10.txt:468,搜「辅助分类器」)。原文给的出处是 Odena、Olah、Shlens 的「Conditional Image Synthesis with Auxiliary Classifier GANs」。

  13. 出处:「第 10 章」第 541~543 段(text/22-ch10.txt:541,搜「imageClass」;text/22-ch10.txt:543,搜「逐元素相乘」)。原文自己把这一步和第 9 章的情感分析、日期格式转换并列,说「在数学上很相似」——那正是我们第 13、14 章讲的查表。

  14. 出处:「第 10 章」第 616~618 与 624 段(text/22-ch10.txt:616,搜「sparseCategoricalCrossentropy」;text/22-ch10.txt:618,搜「两个损失的梯度会被相加」)。第 624 段给了生成器那一侧的例子:指定生成 8 而判别器判成 9 时,类别那笔损失会起作用。

  15. 出处:「第 10 章」第 654~658 段(text/22-ch10.txt:656,搜「dLoss」;text/22-ch10.txt:658,搜「只是停止了变化」)。原文:「在训练的尾声,判别器和生成器的损失都没有趋近于零,只是停止了变化(即收敛了)。」 2

  16. 出处:「第 10 章」代码清单 10-10,第 553 与 559 段(text/22-ch10.txt:553,搜「3 * 3 * 384」;text/22-ch10.txt:559,搜「升采样至」)。原文注释写明这个单元数是为了让最终输出的形状和真图完全匹配。

  17. 出处:「第 10 章」第 648~653 段(text/22-ch10.txt:648,搜「数个小时」)。原文说明可以用 --logDir 选项记录日志,再用 TensorBoard 在浏览器里看曲线。

  18. 出处:「第 10 章」第 667674 段(text/22-ch10.txt:669,搜「[10, 1]」;text/22-ch10.txt:674,搜「100个滑块」)。原文说明网页顶部那一排是生成的 09,底下 10×10 的网格是真实数据里随机抽的,作为参照;页面上还有 100 个滑块可以逐维改动本征向量。