AI不能写一手好代码的工程师不是好数据科学家

AI不能写一手好代码的工程师不是好数据科学家

参与:罗赛南、Geek AI

写不出好的代码的工程师不是好的数据科学家! 本文作者Nolan Kent曾是一名恶意软件分析师,拥有很强的工程能力。 在这篇文章中,他编写了一个可视化工具,用于观察StyleGAN模型中的特征图,这对于理解模型起到了巨大的作用。

图1:修改单个位置的空间特征图生成动漫人物

“写在前面”

该技术博客介绍了一个使用生成对抗网络完成的项目。 由于这是一个个人项目,我使用了专业领域通常不使用的动漫角色数据集“DANBOORU2018”。

以下是该数据集的链接以及使用该数据集的模型的详细介绍:

作者表示,所做的大部分工作纯粹是为了学习目的,但最终的结果是一个更有趣的结果:为矩形肖像的嘴巴制作动画。

图 2:快速/平滑的嘴巴动画。由于缺乏数据,男性肖像的质量通常较低

该项目的一部分是一个可以更轻松地与 GAN 交互并从中学习的工具,但目前该工具还不太用户友好。

如果该项目继续下去,一个非常重要的目标是发布该工具的新版本unity卡通模型 带动作,让任何人都可以立即开始并创建一个动漫角色,如图 2 所示。但目前,它主要是一个研究工具:

图 3:该工具界面的部分屏幕截图。 用户界面肯定需要改进,但目前这仍然只是一个原型,我会不时添加和删除功能。

我发现将实验代码合并到这样的工具中比使用 jupyter 笔记本更容易在不同的设置中重复实验。 有些想法只有通过重复实验才会变得更加清晰,所以如果没有这个工具,我觉得我可能会错过博客中提到的一些见解。 如果您只对示例动画图像感兴趣而不是技术细节,可以直接跳至本文的“实验结果:动画角色”章节。

许多个人项目的主要问题之一是它们仅包含单一视角。 我写这篇博客的目的是了解其他人对这个主题的看法,详细描述我在这个项目上的工作经验,并接受建设性的批评和指正。

结果介绍及总结

多年来,我养成了定期复制生成模型论文的习惯,因此在 StyleGAN 论文发表前后,我陆续开始了这个项目。 我的工作主要包括三个部分:

1. 复刻StyleGAN并做了一些调整

2.根据我的实现训练模型

3.实现了模型可视化和交互的工具

首先,我抱着学习和实践的心态复现了StyleGAN。 这也是因为当时官方代码()还没有开源。 StyleGAN 的结果比我使用过的其他模型要好得多,所以我想更深入地研究。

令我兴奋的生成模型的一项应用是自动生成视频游戏资产的能力。 对我来说,StyleGAN 是我复制的第一个在视频游戏上产生可接受结果的模型,因此我最初的尝试是让“Unity”等游戏引擎加载该模型。

为此,我创建了一个“.NET”动态链接库(DLL),它可以与模型交互,理论上可以导入到“Unity”中。 为了测试这个动态链接库,我创建了一个与其交互的工具。 最终,我向该工具添加了越来越多的功能,直到它成为该项目最大的组件之一。

以下是该项目的总体结构:

图 4:从 TensorFlow python 实现到使用工具生成图像的工作流程

我喜欢使用工具来可视化“不透明”的数字对象(例如恶意软件和深度学习模型)并与之交互,因此我添加的功能之一是特征图的可视化和修改(见图 5)。

观察不同图像上每层特征图最活跃的部分有助于我了解模型正在做什么,并使某些面部特征的自动定位变得简单。 在对图像进行修改时,我注意到在特征图的特定区域添加或减去值会产生一些有意义的变化,例如张开和闭上嘴(见图 2)。 与自动面部特征检测相结合,这可以用于对所有生成的图像应用一致且有意义的修改,而无需标签。 (见图 9 和 10)。

图 5:特征图可用于识别有意义的区域(顶行图像:眼睛,底行图像:面部)。 红色方块代表负激活值,绿色方块代表正激活值,白色方块代表接近0的激活值。

总结:以上就是利用特征图修改面部特征的功能。 以下是本博客其余部分的组织结构。

应用

总的来说,我对生成模型的以下几个方面感兴趣:

更好地以编程方式生成游戏资源

我对生成模型将程序生成提升到新水平的潜力感到兴奋。 据我所知,当今基于规则的程序生成技术无法根据高度复杂的分布随机创建样本。 例如,程序生成的关卡的一个部分可能独立于关卡的其余部分,并且仍然可以被玩家接受。

随机生成类似肖像的图像更加困难,因为好看的人物图像往往反映现实世界,而现实世界有如此多的相互依赖性,以至于每个像素都需要在每个其他像素的背景下考虑。 为了使图像看起来不错,即使是非真实感图像也需要一致的光照、解剖结构、纹理、透视、风格等。

这种依赖性也适用于音频、对话、动画和故事情节的自动生成。 我认为生成模型是目前从如此复杂的分布中可靠地生成样本的最佳方法。

让艺术创作更简单、更快捷

当使用生成模型时,交互式工具使外行人能够创建原本需要经验丰富的艺术家的图像,或者允许艺术家更快地完成工作中更多的常规部分。

我认为生成模型不会很快消除对创意艺术家的需求,因为生成模型(以及大多数机器学习模型)专注于对特定分布进行建模。 这使得生成与训练分布中的任何样本不同的高质量图像(即创意图像)变得非常困难。

然而,像本博客中使用的工具使人们能够添加自定义更改,以帮助生成更独特的图像(特别是如果模型已经学习了一些基本图形概念(例如照明和透视))。

无监督学习与生成因素解耦相结合的基本潜力

由于无标签数据量远远超过有标签数据,而深度学习又是数据极其密集的,我相信无监督/半监督学习未来有潜力逐步取代监督方法。 特别是,我们提出了一些深度生成模型的方法来解耦数据集中的变化因素:图 7 和 8 显示了 StyleGAN 如何做到这一点(至少部分如此)。

事实上,“脱钩”并没有一致的正式定义。 我的理解是,只有有限的实验证据表明它对下游任务有用。 然而,使用 GAN 进行“解耦”让我乐观地认为它是有用的。 尽管生成器无法为其未生成的图像生成内部表示,但还有其他几种类型的生成模型可以在视觉质量上与 GAN 竞争,并且可能更适合下游任务。

实验结果:动漫人物

我在一个名为“Danbooru2018”的动漫数据集上训练了我最好的模型()。 我将在数据部分讨论它的优缺点,主要缺点之一是缺乏多样性:很难生成男性图像。

下面的所有示例都是使用此工具生成的。

我最初在 jupyter 笔记本中生成这些图像,但随后使用专用工具显着加快了图像生成速度,并让我对模型的工作原理有了不同的看法。 下面的图片按照生成的复杂度大致排序:在不使用该工具的情况下,图7/8生成起来比图6更麻烦,而图9/10比图7/8生成起来更困难。

图 6 是几个图像的中间潜在变量之间插值的示例。 通过使用 GAN,我们可以获得一个很酷的结果:确保插值图像与最终图像具有相似的质量。

图 6:随机潜在向量之间的插值

图 7 是通过在中间潜在空间中定位具有特定含义(在本例中为头发或眼睛颜色)的向量并将其朝该方向移动来修改图像的示例。 例如,您可以计算许多黑发人脸图像的平均潜在变量值,并减去所有其他图像的平均潜在变量值,以获得黑发的向量。 我将在“训练/后处理”部分进一步讨论这一点。

图 7:朝有意义的方向改变潜在变量

图 8 显示了将生成图 7 的想法应用到“张嘴”属性的效果。 这在一定程度上有效,但属性并没有完全解耦:图像的每个部分都可以看到一些变化,除了嘴部,它会发生变化。 常识告诉我们,一个人可以只移动嘴巴,而不会显着改变身体的其他部分。 一个简单的技巧是将动漫角色的嘴粘贴到另一个静态图像上,但是当改变“张嘴”矢量也会改变肤色或图像风格时,这不起作用。

图 8:改变嘴部矢量也会改变其他属性

图 9 显示了修改靠近角色嘴部的空间位置处的特定特征图以产生说话(或咀嚼)动画而不引起全局变化的示例。 通过少量的手动工作,就可以找到可以修改的特征图以产生这种变化,而不需要两个以上的标记数据样本。 这一切都可以通过这个工具来完成。

这个过程受到DCGAN()论文的启发,通过修改特征图来删除图中的窗口。 这些修改是对特定特征图的局部区域的简单加法或减法操作。 我将在以后的博客中展示如何使用此工具来执行此操作。

图 9:通过局部修改空间生成的语音动画。 一旦找到与有意义的变化相对应的特征图,它们就可以应用于大多数图像,无论其质量或风格如何。

图 10 显示了与图 9 相同的内容,只是有或没有头带。 该技术可以应用于许多不同的属性。

图 10:使用局部修改添加/删除发带

实验结果:代码

考虑到我的空闲时间有限并且我的主要目标是学习,我忽略了对大多数项目来说很重要的几个方面:

我的 github 链接如下,它们仍在积极开发中,因此某些提交中可能存在一些错误:

StyleGAN 的再现:

我制作的工具:

复制细节

在本节中,我将介绍重现 StyleGAN 和训练模型的技术细节。

再现风格GAN

在《A Style-Based Generator Architecture for Generative Adversarial Networks》论文发布后不久,大概是官方代码发布前几个月,我开始复现StyleGAN。

在这里我将讨论我遇到的一些挑战以及我采取的应对方法(假设你熟悉 StyleGAN 和 TensorFlow)。

StyleGAN是基于PGGAN()(我已经转载了)。 这些模型使用“渐进增强”训练方法,其中鉴别器和生成器在训练期间不断添加卷积层以处理越来越高的分辨率。

扩展模型的情况相对较少——我复制的所有其他模型在训练期间都不需要改变它们的结构。 幸运的是,Tensorflow 有一些方便的功能,例如仅加载模型的一部分保存的权重并随机初始化其余部分。 这种方法也用于迁移学习。

我真的很喜欢 TensorFlow 2.0 的风格,它将模型创建为继承自“tf.keras.Model”的类。 我以这种方式创建了大部分层、生成器、鉴别器和映射网络。 我还尝试能够在动态图形执行(热切执行)和传统的基于图形的执行之间切换。 动态图执行使调试变得更加容易,我将其视为更好地理解程序的一种方法(也是恶意软件分析中常用的技术)。

不幸的是,动态图机现在的执行速度比在图模式下运行慢得多,因此我最终停止更新该功能。 使用“tf.keras.Model”的好处之一是它可以在动态图和传统图模式下工作,因此理论上,切换到动态图执行不会太困难。 与此同时,我刚刚使用了“tfdebug”命令行界面和“TensorBoard”,目前我对此非常满意。

StyleGAN 和 PGGAN 之间存在一些重要的区别。 当使用“自适应实例标准化”操作时,有一种方法可以将特定图像的潜在数据作为样式(非空间属性)提供给特征图。 理论上,根据论文中描述的细节,这很容易实现,但我选择使用“tf.nn.moments”来计算均值和方差,这没有官方实现那么高效(官方使用较低的级别操作来计算这些值)。

我想这是由于数字问题造成的,当时我不想调试它,所以我没有进一步研究它。 通常情况下,我很乐意深入研究这样的问题,因为研究它们显然让我有机会了解更多,但由于这个项目只是我的一个爱好,所以我必须优先考虑充分利用我的时间。

StyleGAN还使用了中间潜在空间,假设通过增加灵活性和对潜在变量值范围的依赖来促进解耦(论文中有一些经验证据)。 例如,如果我们假设人口中没有一个男性有长发,那么当与性别对应的潜在向量出现在“男性”区域时,与头发长度对应的潜在向量永远不会出现在“长发”区域中区域。 中间。 如果潜在向量是独立的(当没有映射网络时会发生这种情况),我们最终会一起采样“长发”和“男性”,并且生成器将生成非男性或​​短发来欺骗鉴别器。

这意味着,即使头发长度的潜在向量位于“长发”区域,当其他潜在变量值在正常范围内时,我们最终可能会生成短发图像。 值得注意的是,一些解耦的定义需要“轴对齐”(修改单个潜在变量值将带来有意义的变化)。 我的理解是StyleGAN的映射网络促进中间潜在空间成为旋转轴对齐解耦。 旋转后的形式(修改潜在变量会产生有意义的变化)

在我看来,使用中间潜在变量值与通过样式将信息合并到网络中一样有趣。 它也很容易实现。 除非另有说明,本博客系列中提到的潜在变量值均指中间潜在变量值。

如果最初看起来像是论文中的一个小细节实际上是最难重现的部分,那可能会非常烦人。 StyleGAN 遇到了这种情况——StyleGAN 和 PGGAN 的一个区别是使用双线性上采样(和下采样)和 R1 正则化()(判别器上的梯度惩罚)。

这两种方法单独实现都很容易,但是当我尝试将它们结合起来时,我发现TensorFlow无法计算“tf.nn.depthwise_conv2d”操作的二阶导数。

深度卷积用于将卷积核分别应用于每个通道。 这在卷积神经网络中通常是不必要的,因为(除了一些用于移动设备的 CNN)每个卷积核都连接到前一层的所有通道。 模糊卷积通常用于实现双线性插值,一次只能处理一张特征图,因此需要深度卷积。 如果不实现二阶导数,我无法计算 R1 惩罚,这需要使用梯度的梯度。

当时我对自动微分了解还不够,无法自己轻松实现二阶导数。 我花了一些时间试图更好地理解自动微分,那时我已经完成了除了这部分之外的所有内容硬件设备,不久之后就发布了官方代码。 NVIDIA 团队在模糊卷积中使用两个“tf.custom_gradient”函数很好地解决了这个问题。

我对 StyleGAN 进行了几次实验性调整,并取得了不同程度的成功。

1.我测试了一个矩形图像,将初始分辨率更改为8x4,然后增加分辨率。

2.我尝试使用带有投影鉴别器的ACGAN和cGan来实现“Conditional StyleGAN”。

第一个实验在矩形图像上表现非常好,但使用 ACGAN 和 cGan 实现的“条件 StyleGAN”表现不佳。 这可能是由于我的超参数选择不佳,但通常结果比无条件训练要差,以找到与潜在空间中有意义的特征相对应的向量(这将在本文讨论的“训练/后处理”部分中讨论) 。

数据

与 StyleGAN 论文一起发布的 FFHQ 数据集包含 70,000 张高分辨率图像。 为了更接近生成完整任务的目标unity卡通模型 带动作,我尝试修改NVIDIA提供的数据提取脚本,以8:4(高:宽)的比例提取图像。

除了提取人脸之外,还从人脸下方提取等量的数据。 将高度和宽度加倍需要将原始输入大小增加 4 倍,而仅将高度加倍就需要将大小增加 2 倍。 人脸下方的数据也应该比背景数据有更小的变异(差异主要来自于衣服的不同),而没有得到背景数据意味着网络不需要为不属于该人的数据分配容量。

不幸的是,FFHQ 数据集中的 70,000 张图像中只有 20,000 张在脸部下方区域有足够的数据来创建预期宽高比的图像。 如图 11 所示,我无法使用这个小数据集获得特别高质量的结果,但仍然可能有方法来提高质量(例如增加包含图像的标准)。

图 11:矩形 FFHQ 图像的质量往往较低

我对GAN的绘画风格化能力也很感兴趣,我看到最近发布了“Danbooru2018”()。 该数据集拥有大量高分辨率图像3D道具,标签数据非常丰富。

它确实存在一些潜在的缺点,例如男性图像的数量过少,这大大降低了该类别的质量(图 12)。 图 12 中的男性图像是从生成的大约 1,000 张图像中选择的最高质量图像。 我确实认为这里还有很大的改进空间,特别是在平均男性图像上使用截断技巧。

图 12:由于数据集的限制,大多数男性肖像(上图)质量较低。 即使是随机的,女性肖像(下图)也往往具有更高的质量。 上述图像均未使用截断技术来获得更高质量的图像。

该数据还包含很大一部分不适合在工作时间观看的图像(可耻的肮脏图像),尽管我认为生成模型的一个潜在用途是自动修改媒体内容,使其更适合不同的受众。

我可以使用元数据(例如保存图像的人数、图像分辨率、标签、创建日期等)来选择要包含的候选图像。 为了减少差异并提高图像质量,我排除了小集合的图像和六年多前创建的图像。 我还只保留最小分辨率为 512x256(高 x 宽)的图像。 512x256 是模型的目标分辨率。 最后,我过滤掉了一些带有可能增加肖像风格差异的标签的图像,例如“躺着”和“侧身”,或者带有性暗示的图像。

为了生成数据,我结合使用了以下两个工具并修改了相应部分以提取所需宽高比的图像。

这些工具并不总是能正确提取图像,因此我使用“illustration2vec”( ) 来过滤结果,因为无法检测到人物的图像可能很糟糕。

我还创建了一个显示大网格图像的工具,以便我可以快速手动删除不良图像,但这对于包含超过 30,000 张图像的数据集来说太耗时。 我最终得到的是几个不同的数据集,其中包含各种质量和标签的图像,图像数量从 40,000 到 160,000 张图像不等。 完成所有这些工作后,我们最终得到了一个比我构建的 20,000 张图像 FFHQ 数据集要好得多的模型。

文章来源:https://www.toutiao.com/a6779830446449492492/