阅读42 返回首页    go 阿里云 go 技术社区[云栖]


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

https://yq.aliyun.com/cloud

79b373d51eb109fd75ac6dd612fe1d96b9107ad9

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

QuickDraw数据集是由世界各地1500多万人参与的“快速绘画” AI实验后收集数百万幅图画建成,参与者要在20秒内绘制属于某个类(例如“猫”)的图像

2fe2089ec0ed5b84a527913712fa475ca9591aea
         SketchRNN是一个令人吃惊的生成模型,被训练使用上述数据集生成矢量它巧妙地集合了机器学习中最近开发的许多最新的工具和技术,例如Variational AutoencodersHyperLSTMs(一个用于LSTM的HyperNetwork)自回归模型 ,Layer NormalizationRecurrent DropoutAdam optimizerSketchRNN系统是由谷歌探究AI能否创作艺术的新项目的一部分,类似于教AI去绘画,另外不仅仅是让人工智能学习如何画画,还要能够“用类似于人类的方式概括归纳抽象的概念”,比如去画“猪”的广义概念,而不是画特定的动物,这显然不是一件简单的事情。

70a2d2c1d429e95023c9ba0b0674aa0373548164
         本文的代码丢弃了那些旨在解释或演示代码块,只保留运行实验所需的代码。“潜在空间中的主成分分析 ”部分的所有内容直接从以前的博客摘取。随意跳过该部分,因为接下来是真正有趣的分析。这里是第一第二博客的链接之前所讲述的一切都是一些实用功能,以便于现在的可视化分析
         本文是笔记代码的结合,作者已经做出了风格以及其它一些细微的改变,以确保Python3向前兼容

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

260a4122bad0cd267dd1ecc681f4616f03269718

接下来都是实验的所需的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.021402470.02067117] 

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

在[25]中:




[25]

300,2 

在[26]中:




10074f8ae3f998247196cc8b710294b002a94514

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

在[106]中:




在[107]中:




在[108]中:




501b3b92fec57aa1697920cf662a9eedb199614a

在[109]中:




0bb5ce7f30aadc771cb1f9cb68fcb559424ff2cd

你可以在这里找到SVG图像。

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

PCA投影中的线性插值

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

在[35]中:




在[36]中:




在[37]中:




在[38]中:




ca59cf88c62e628fdbae5b1724e3a83aee2322d8

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

在[39]中:




输出[39]

10102 

在[40]中:



输出[40]

1010128 

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

在[94]中:




fd1df68981c9dbc48f39d82545322415f64ef174

可以从上图中观察一些有趣的变换和模式。右下角可以看到一群类似的修剪过或者无修饰的当向左上方移动时,开始看到一些羊毛粗糙的圆形涂鸦的羊;沿着中间部分可以看到最逼真的羊在左上角,可以看到一些抽象的草图
运行温度τ=0.6时不能产生更多的洞察力。 

在[95]中:




3460dfd54dfbfb4243327af44b3460796f9dc624

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

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

在[48]中:




在[49]中:




输出[49]

数组([0.021402470.02067117] 

在[50]中:




输出[50]

阵列([2.513943172.42804484] 

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

在[58]中:




a74dcd0ce663c22315214a172fc0d4ce2fa8a595

在[63]中:




2da9d11183046ef318eb401fc5507fe5095484f2

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

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

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

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

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

在[97]中:




在[98]中:




在[99]中:




36da666fa84c604b892bab2a677a61dc24e1cb21

在[100]中:




输出[100]

2.2818214893341064 

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

在[101]中:




在[102]中:




在[103]中:




图片

在[104]中:




f3e240d59e9d21aa95b8ce2ee27d63d13b22c369

完整的SVG图片可以在此获得。虽然这产生了很好的结果,但作者认为如果可视化在一个具有多类的更大数据集上会更有说服力。通过这种方式,可以看到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

作者信息

Louis Tiao计算机科学和数学的研究者,研究领域集中于算法设计与分析、计算机科学理论、人工智能和机器学习

Linkedin:https://www.linkedin.com/in/ltiao/?ppe=1

Githubhttps://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

  上一篇:go  基于飞天专有云敏捷版构建应用DevOps实践操作
  下一篇:go  一次Eclipse插件修改经历