通过SketchRNN、PCA和t-SNE从Google QuickDraw数据集中显示矢量图的潜在空间|附源码
本文是作者最近发布的Google QuickDraw数据集一系列笔记中的第三部分,使用的最近发布的SketchRNN模型。下面介绍QuickDraw数据集及SketchRNN模型。
QuickDraw数据集是由世界各地1500多万人参与的“快速绘画” AI实验后收集数百万幅图画建成,参与者要在20秒内绘制出属于某个类(例如“猫”)的图像。


本文是笔记与代码的结合,作者已经做出了风格以及其它一些细微的改变,以确保Python3能向前兼容。
- 1. 本文有点令人误解,这是因为本文主要是探索Aaron Koblin羊市场 (aaron-sheep)数据集,这是一个较小的轻量级数据集,以及一个手册,演示了在这个数据集上已经预先训练好的各种模型。由于该数据集模式与QuickDraw数据集相同,因此在此数据集上执行的实验也不失一般性。
- 2. Magenta目前只支持Python 2版本。

接下来都是实验的所需的python代码:
在[2]中:
在[3]中
在[6]中:
获得预训练的模型和数据
在[7]中:
在[8]中:
输出[8]:
'https://github.com/hardmaru/sketch-rnn-datasets/raw/master/aaron_sheep/'
在[9]中:
输出[9]:'https://download.magenta.tensorflow.org/models/sketch_rnn.zip'
在[10]中:
INFO:tensorflow:Downloading pretrained models from https://download.magenta.tensorflow.org/models/sketch_rnn.zip...
INFO:tensorflow:Download complete.
INFO:tensorflow:Unzipping /tmp/sketch_rnn/models/sketch_rnn.zip...
INFO:tensorflow:Unzipping complete.
接下来让我们看看aaron_sheep现在数据集训练的规范化层模型。
在[11]中:
在[12]中:
在[13]中:
在[14]中:
加载预先训练的模型
在[15]中:
INFO:tensorflow:Model using gpu.
INFO:tensorflow:Input dropout mode = False.
INFO:tensorflow:Output dropout mode = False.
INFO:tensorflow:Recurrent dropout mode = True.
INFO:tensorflow:Model using gpu.
INFO:tensorflow:Input dropout mode = False.
INFO:tensorflow:Output dropout mode = False.
INFO:tensorflow:Recurrent dropout mode = False.
INFO:tensorflow:Model using gpu.
INFO:tensorflow:Input dropout mode = False.
INFO:tensorflow:Output dropout mode = False.
INFO:tensorflow:Recurrent dropout mode = False.
在[16]中:
在[17]中:
INFO:tensorflow:Loading model /tmp/sketch_rnn/models/aaron_sheep/layer_norm/vector.
INFO:tensorflow:Restoring parameters from /tmp/sketch_rnn/models/aaron_sheep/layer_norm/vector
在[18]中:
在[19]中:
用主成分分析探索潜在空间
下面,我们将测试集中的所有草图编码为学习到的128维潜在空间中的表示。
在[20]中:
输出[20]:
(300,128)
然后,找到潜在空间中编码数据中代表最大方差方向的两个主轴。
在[22]中:
在[23]中:
输出[23]:
这两个组成部分分别约占方差的2%
在[24]中:
输出[24]:
数组([0.02140247,0.02067117])
接下来将数据从128维的潜在空间映射为由前两个主要分量构建的二维空间
在[25]中:
输出[25]:
(300,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]中:
可以从上图中观察到一些有趣的变换和模式。在右下角,可以看到一群类似的修剪过或者无修饰的羊;当向左上方移动时,会开始看到一些羊毛、粗糙的圆形涂鸦的羊;沿着中间部分,可以看到最逼真的羊;在左上角,可以看到一些抽象的草图。
运行温度为τ=0.6时不能产生更多的洞察力。
在[95]中:
特征羊分解
本文将草图学习的潜在代表主要组成部分称为特征羊。
使用译码器,可以可视化前2个特征羊的草图表示,这些特征羊是将潜在表示转换为二维子空间中的正交权重矢量。通过将它们视为隐藏代码,并将其重构建为草图,我们能够提炼出一些有意义的解释。
在[48]中:
在[49]中:
输出[49]:
数组([0.02140247,0.02067117])
在[50]中:
输出[50]:
阵列([2.51394317,2.42804484])
我们从τ=.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]:
2.2818214893341064
像以前一样,定义一个矩形区域
在[101]中:
在[102]中:
在[103]中:
图片
在[104]中:
完整的SVG图片可以在此获得。虽然这产生了很好的结果,但作者认为如果可视化在一个具有多类的更大数据集上会更有说服力。通过这种方式,可以看到t-SNE有效地形成了对不同类的聚类图,并突出显示了每个集群中的变化。
2. Visualizing Representations
3. Latent space visualization
4. Analyzing 50k fonts using deep neural networks
5. Organizing the World of Fonts with AI
作者信息
Louis Tiao:计算机科学和数学的研究者,研究领域集中于算法设计与分析、计算机科学理论、人工智能和机器学习。
Linkedin:https://www.linkedin.com/in/ltiao/?ppe=1
Github:https://github.com/scikit-learn/scikit-learn
本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。
文章原标题《Visualizing the Latent Space of Vector Drawings from the Google QuickDraw Dataset with SketchRNN, PCA and t-SNE》,作者:Louis Tiao,译者:海棠,审阅:
文章为简译,更为详细的内容,请查看原文
最后更新:2017-06-10 00:01:51