通过SketchRNN、PCA和t-SNE从Google QuickDraw数据集中显示矢量图的潜在空间

本文是作者最近发布的Google QuickDraw数据集一系列笔记中的第三部分,使用的最近发布的SketchRNN模型。下面介绍QuickDraw数据集及SketchRNN模型。

QuickDraw数据集是由世界各地1500多万人参与的“快速绘画” AI实验后收集数百万幅图画建成,要求参与者在20秒内绘制出属于某个类(例如“猫”)的图像。如下图所示,选择一个类别,可以看见数据库中该类所有的形状。

当然,如果数据集中没有和你想象一样的形状,你也可以帮助向该数据库中增添一些涂鸦,进行个人绘画表演。

SketchRNN是基于上述数据集训练的生成模型,被训练成能够生成矢量图,它巧妙地集合了机器学习中最近开发的许多最新的工具和技术,例如Variational Autoencoders、HyperLSTMs(一个用于LSTM的HyperNetwork)、自回归模型,Layer Normalization、Recurrent Dropout、Adam optimizer等。

SketchRNN系统是由谷歌探究AI能否创作艺术的新项目的一部分,类似于教AI去绘画,另外不仅仅是让人工智能学习如何画画,还要能够“用类似于人类的方式概括归纳抽象的概念”,比如去画“猪”的广义概念,而不是画特定的动物,这显然不是一件简单的事情(下图SketchRNN系统画的“猪”)。

该模型能够将你的灵魂画作对应成实际的物品,当然,如果画作太过于抽象,暂时是无法识别或者是识别错误,毕竟它还没有学会读心术(自己画的自行车,系统无法识别)。

本文代码舍弃了那些旨在解释或演示的代码块,只保留了运行实验所需的代码。“潜在空间中的主成分分析”部分的所有内容是直接从以前的博客中摘取。随意跳过该部分,因为接下来是真正有趣的分析。这里是第一篇和第二篇博客的链接,之前所讲述的一切都是一些实用功能,以便于现在的可视化分析。

本文是笔记与代码的结合,作者已经做出了风格以及其它一些细微的改变,以确保Python3能向前兼容。

1.本文有点令人误解,这是因为本文主要是探索Aaron Koblin羊市场(aaron-sheep)数据集,这是一个较小的轻量级数据集,以及一个手册,演示了在这个数据集上已经预先训练好的各种模型。由于该数据集模式与QuickDraw数据集相同,因此在此数据集上执行的实验也不失一般性。

2. Magenta目前只支持Python 2版本。

接下来都是实验的所需的python代码,其中[num]是表示该github工程文件的代码块:

在代码块[2]中:

在代码块[3]中

在代码块[5]中:

在代码块[6]中:

在代码块[5]中:

在代码块[6]中:

获得预训练的模型和数据

在代码块[7]中:

在代码块[8]中:

输出[8]:

'http://github.com/hardmaru/sketch-rnn-datasets/raw/master/aaron_sheep/'

在代码块[9]中:

输出[9]:

'http://download.magenta.tensorflow.org/models/sketch_rnn.zip'

在代码块[10]中:

接下来让我们看看aaron_sheep现在数据集训练的规范化层模型。

在代码块[11]中:

在代码块[12]中:

在代码块[13]中:

在代码块[14]中:

加载预先训练好的模型

在代码块[15]中:

在代码块[16]中:

在代码块[17]中:

在代码块[18]中:

在代码块[19]中:

用主成分分析探索潜在空间

PCA是一种降维方法,是通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

下面,我们将测试集中的所有草图编码为学习到的128维潜在空间中的表示。

在代码块[20]中:

输出[20]:

(300,128)注:128代表128维

然后,找到潜在空间中编码数据中代表最大方差方向的两个主轴。

在代码块[22]中:

在代码块[23]中:

输出[23]:

PCA(copy = True,iterated_power ='auto',n_components = 2,random_state = None,svd_solver ='auto',tol = 0.0,whiten = False)

这两个组成部分分别约占方差的2%

在代码块[24]中:

输出[24]:

接下来将数据从128维的潜在空间映射为由前两个主要分量构建的二维空间

在代码块[25]中:

输出[25]:

(300,2)注:2代表2维

在代码块[26]中:

我们想在上图中通过图中的对应点可视化出原始草图,其中每个点对应于草图降维到2维的隐藏代码。然而,由于图像太密集,在没有重叠的情况下无法适应足够大的草图。因此,我们将注意力限制在包含80%数据点的较小区域,蓝色阴影矩形突出显示感兴趣的区域。

在代码块[106]中:

在代码块[107]中:

在代码块[108]中:

在代码块[109]中:

可以在这里找到SVG图像。

备注:一个更加聪明的方法涉及到使用matplotlib变换和Collections API,具体是通过实例化带有关键参数oofets的PathCollection。

PCA投影中的线性插值

在先前定义的矩形区域生成100个均匀间隔的网格,下图网格中的点以橙色表示,覆盖在测试数据点的顶部。

在代码块[35]中:

在代码块[36]中:

在代码块[37]中:

在代码块[38]中:

接下来,通过应用PCA的逆变换来将网格上的100个点投影到原始的128维潜在空间。

在代码块[39]中:

输出[39]:

(10,10,2)

在代码块[40]中:

输出[40]:

(10,10,128)

然后,使用这些隐藏代码及译码器重建相应的草图,并观察草图如何在所关注的矩形区域范围之间转换,特别是草图从左到右、从上到下的转换,因为这些是潜在表示中最大差异的方向。首先,以较低的温度设置τ=0.1运行译码器以最小化样本的随机性。

在代码块[94]中:

可以从上图中观察到一些有趣的变换和模式。在右下角,可以看到一群类似的修剪过或者无修饰的羊;当向左上方移动时,会开始看到一些羊毛、粗糙的圆形涂鸦的羊;沿着中间部分,可以看到最逼真的羊;在左上角,可以看到一些抽象的草图。

在代码块[95]中:

特征羊分解

本文将草图学习的潜在代表主要组成部分称为特征羊。

使用译码器,可以可视化前2个特征羊的草图表示,这些特征羊是将潜在表示转换为二维子空间中的正交权重矢量。通过将它们视为隐藏代码,并将其重构建为草图,我们能够提炼出一些有意义的解释。

在代码块[48]中:

在代码块[49]中:

输出[49]:

在代码块[50]中:

输出[50]:

我们从τ=.01...1.0增加温度并绘制特征羊的重建草图,每个温度设置采集5个样品。

在代码块[58]中:

在代码块[63]中:

对于第一特征羊,在τ=0.1,主要看到一个圆形的黑色头发、有两条长的圆形腿和一些尾巴。沿着轴线方向可以看到,羊的头部和腿部结构会发生变化,这占据了草图的大部分差异。

现在看看第二特征羊,集中τ值较低时生成的样品,可以看到一些粗略潦草的圆圈代表羊的身体、3-4个松散连接的腿和一个小圆头。从上到下的观察,可以发现,与第一特征不同的是这似乎是沿着羊身体结构变化的方向。

t-SNE可视化

t分布随机相邻嵌入(t-SNE)是一种常用的非线性降维技术,通常用于可视化高维数据。它是几种嵌入方法之一,其目的是将数据点嵌入到较低维空间中,以保持原始高维空间中的点对点的距离,一般适用于二维空间的可视化。

特别地,t-SNE通常用于深度学习,以检查和可视化深层神经网络学到的内容。例如,在图像分类问题中,可以将卷积神经网络视为一系列变换,逐渐将图像转换为表示,使得类可以更容易地被线性分类器区分。因此,可以将分类器前的最后一层输出作为“代码”,然后使用t-SNE在二维中嵌入和可视化图像的代码表示。

1.关于PCA与t-SNE的详细比较可以查看笔者先前的博客。

2.Wattenberg, et al.“How to Use t-SNE Effectively”, Distill, 2016.

3.斯坦福大学CS231n:卷积神经网络视觉识别课程中关于网络的可视化课程笔记。

在这里,将每个矢量绘图的128维隐藏代码嵌入到二维中,并将其在该二维子空间中进行可视化。

在代码块[97]中:

在代码块[98]中:

在代码块[99]中:

在代码块[100]中:

输出[100]:

像以前一样,定义一个矩形区域

在代码块[101]中:

在代码块[102]中:

在代码块[103]中:

在代码块[104]中:

完整的SVG图片可以在此获得。虽然这产生了很好的结果,但作者认为如果可视化在一个具有多类的更大数据集上会更有说服力。通过这种方式,可以看到t-SNE有效地形成了对不同类的聚类图,并突出显示了每个集群中的变化。

如果是RGB光栅图,使用像t-SNE这样的技术会获得很奇特的结果(比如多个头的小狗等)。然而,相似之处往往是表面的,主要是基于色度、亮度等方面。当嵌入代码表示时,相似性变得更加抽象,并且往往是基于类和语义。此外,这也允许我们能够检测出神经网络形成了什么样的相似性概念。

在另一方面,矢量图是由连续的笔画组成,能被表示成笛卡尔平面上的偏移量序列。一般来说,任意长度序列之间的相似性度量并没有得到很好地定义。因此,不能直接在矢量图上应用降维技术。

使用变形的递归神经网络,比如SketchRNN,可以将原始图转换为潜在空间中丰富的表示,这样做可以使得我们运用强大的技术如t-SNE去组织并可视化这些表示。另外利用相似性能够提炼更多的语义和抽象的概念。

本文的工作是受到其它一些优秀的文章和工作的启发,如下所示:

1.Visualizing MNIST

2.Visualizing Representations

3.Latent space visualization

4.Analyzing 50k fonts using deep neural networks

5.Organizing the World of Fonts with AI

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180206G1DEWB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券