《TensorFlow技术解析与实战》——3.3 可视化的例子

3.3 可视化的例子

词嵌入(word embedding)在机器学习中非常常见,可以应用在自然语言处理、推荐系统等其他程序中。下面我们就以Word2vec为例来看看词嵌入投影仪的可视化。

TensorFlow的Word2Vec有basic、optimised这两个版本,我们重点来看这两个版本的可视化表示。

3.3.1 降维分析
本节将以GitHub上的一段代码[3]为例,讲述可视化的思路。

Word2vec采用text8[4]作为文本的训练数据集。这个文本中只包含a~z字符和空格,共27种字符。我们重点讲述产生的结果可视化的样子以及构建可视化的过程。这里我们采用的是Skip-gram模型,即根据目标词汇预测上下文。也就是说,给定n个词围绕着词w,用w来预测一个句子中其中一个缺漏的词c,以概率p(c|w)来表示。最后生成的用t-SNE降维呈现词汇接近程度的关系如图3-21所示。

图3-21

在word2vec_basic.py中,从获得数据到最终得到可视化的结果的过程分为5步。

(1)下载文件并读取数据。主要是read_data函数,它读取输入的数据,输出一个list,里面的每一项就是一个词。

def read_data (filename) :
  with zipfile.ZipFile (filename) as f:
    data = tf.compat.as_str ( f.read(f.namelist()[0])).split()
  return data

这里的data就类似于['fawn', 'homomorphism', 'nordisk', 'nunnery']。

(2)建立一个词汇字典。这里首先建立了一个词汇字典,字典里是对应的词和这个词的编码。

vocabulary_size = 50000

def build_dataset(words):
  count = [['UNK', -1]]
  count.extend(collections.Counter(words).most_common(vocabulary_size - 1))
  dictionary = dict()
  for word, _ in count:
    dictionary[word] = len(dictionary)
  data = list()
  unk_count = 0
  for word in words:
    if word in dictionary:
      index = dictionary[word]
    else:
      index = 0  # dictionary['UNK']
      unk_count += 1
    data.append(index)
  count[0][1] = unk_count
  reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys()))
  return data, count, dictionary, reverse_dictionary

data, count, dictionary, reverse_dictionary = build_dataset(words)

dictionary里存储的就是词与这个词的编码;reverse_dictionary是反过来的dictionary,对应的是词的编码与这个词;data里存储的是词的list对应的词的编码,也就是第一步中得到的词的list,转化为词的编码表示;count中存储的是词汇和词频,其中重复数量少于49 999个词,用'UNK'来代表稀有词。具体示例如下:

data [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156]
count [['UNK', 418391], ('the', 1061396), ('of', 593677), ('and', 416629),
       ('one', 411764), ('in', 372201), ('a', 325873), ('to', 316376), ('zero', 264975),
           ('nine', 250430)]
dictionary {'fawn': 0, 'homomorphism': 1, 'nordisk': 2, 'nunnery': 3, 'chthonic':
             4, 'sowell': 5, 'sonja': 6, 'showa': 7, 'woods': 8, 'hsv': 9}
reverse_dictionary {0: 'fawn', 1: 'homomorphism', 2: 'nordisk', 3: 'nunnery', 4:
                     'chthonic', 5: 'sowell', 6: 'sonja', 7: 'showa', 8: 'woods', 9: 'hsv'}

(3)产生一个批次(batch)的训练数据。这里定义generate_batch函数,输入batch_size、num_skips和skip_window,其中batch_size是每个batch的大小,num_skips代表样本的源端要考虑几次,skip_windows代表左右各考虑多少个词,其中skip_windows*2=num_skips。最后返回的是batch和label,batch的形状是[batch_size],label的形状是[batch_size, 1],也就是用一个中心词来预测一个周边词。

举个例子。假设我们的句子是“我在写一首歌”,我们将每一个字用dictionary中的编码代替,就变成了[123, 3084, 12, 6, 195, 90],假设这里的window_size是3,也就是只预测上文一个词,下文一个词,假设我们的generate_batch函数从3084出发,源端重复2次,那么batch就是[3084 3084 12 12 6 6 195 195],3084的上文是123,下文是12;12的上文是3084,下文是6;6的上文是12,下文是195;195的上文是6,下文是90。因此,对应输出的label就是:

[[ 123]
 [12]
 [3084]
 [    6]
 [  12]
 [ 195]
 [   6]
 [   90]]

(4)构建和训练模型。这里我们构建一个Skip-gram模型,具体模型搭建可以参考Skip-gram的相关论文。执行结果如下:

Found and verified text8.zip
Data size 17005207 # 共有17005207个单词数
Most common words (+UNK) [['UNK', 418391], ('the', 1061396), ('of', 593677),
                            ('and', 416629), ('one', 411764)]
Sample data [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156] ['anarchism', 'originated',
           'as', 'a', 'term', 'of', 'abuse', 'first', 'used', 'against']
3084 originated -> 5239 anarchism
3084 originated -> 12 as
12 as -> 3084 originated
12 as -> 6 a
6 a -> 195 term
6 a -> 12 as
195 term -> 6 a
195 term -> 2 of
Initialized
Average loss at step  0 :  263.743347168
Nearest to a: following, infantile, professor, airplane, retreat, implicated,
ideological, epstein,
Nearest to will: apokryphen, intercity, casta, nsc, commissioners, conjuring,
stockholders, bureaucrats,
Nearest to this: option, analgesia, quelled, maeshowe, comers, inevitably, kazan, burglary,
Nearest to in: embittered, specified, deicide, pontiff, omitted, edifice, levitt, cordell,
Nearest to world: intelligible, unguarded, pretext, cinematic, druidic, agm, embarks,
cingular,
Nearest to use: hab, tabula, estates, laminated, battle, loyola, arcadia, discography,
Nearest to from: normans, zawahiri, harrowing, fein, rada, incorrect, spandau, insolvency,
Nearest to people: diligent, tum, cour, komondor, lecter, sadly, barnard, ebony,
Nearest to it: fulfilled, referencing, paullus, inhibited, myra, glu, perpetuation,
theologiae,
Nearest to united: frowned, turkey, profusion, personifications, michelangelo,
sisters, okeh, claypool,
Nearest to new: infanta, fen, mizrahi, service, monrovia, mosley, taxonomy, year,
Nearest to seven: tilsit, prefect, phyla, varied, reformists, bc, berthe, acceptance,
Nearest to also: pri, navarrese, abandonware, env, plantinga, radiosity, oops, manna,
Nearest to about: lorica, nchen, closing, interpret, smuggler, viceroyalty, barsoom, caving,
Nearest to his: introduction, mania, rotates, switzer, elvis, warped, chilli,
etymological,
Nearest to and: robson, fun, paused, scent, clouds, insulation, boyfriend, agreeable,
Average loss at step  2000 :  113.878970229
Average loss at step  4000 :  53.0354625027
Average loss at step  6000 :  33.5644974816
Average loss at step  8000 :  23.246792558
Average loss at step  10000 :  17.7630081813

(5)用t-SNE降维呈现。这里我们将上一步训练的结果做了一个t-SNE降维处理,最终用Matplotlib绘制出图形,图形见图3-19。代码如下:

def plot_with_labels(low_dim_embs, labels, filename='tsne.png'):
  assert low_dim_embs.shape[0] >= len(labels), "More labels than embeddings"
  plt.figure(figsize=(18, 18))  # in inches
  for i, label in enumerate(labels):
    x, y = low_dim_embs[i, :]
    plt.scatter(x, y)
    plt.annotate(label,
                 xy=(x, y),
                 xytext=(5, 2),
                 textcoords='offset points',
                 ha='right',
                 va='bottom')

  plt.savefig(filename)

try:
  from sklearn.manifold import TSNE
  import matplotlib.pyplot as plt

  tsne = TSNE(perplexity=30, n_components=2, init='pca', n_iter=5000)
  plot_only = 500
  low_dim_embs = tsne.fit_transform(final_embeddings[:plot_only, :])
  labels = [reverse_dictionary[i] for i in xrange(plot_only)]
  plot_with_labels(low_dim_embs, labels)

except ImportError:
  print("Please install sklearn, matplotlib, and scipy to visualize embeddings.")

 

小知识 
t-SNE是流形学习(manifold Learning)方法的一种。它假设数据是均匀采样于一个高维空间的低维流形,流形学习就是找到高维空间中的低维流形,并求出相应的嵌入映射,以实现维数约简或者数据可视化。流形学习方法分为线性的和非线性的两种。线性的流形学习方法如主成份分析(PCA),非线性的流形学习方法如等距特征映射(Isomap)、拉普拉斯特征映射(Laplacian eigenmaps,LE)、局部线性嵌入(Locally-linear embedding,LLE)等。
3.3.2 嵌入投影仪
在3.2节中我们说到,在TensorBorad的面板中还有一个EMBEDDINGS面板,用于交互式可视化和分析高维数据。对于上面的word2vec_basic.py文件,我们只是做了一个降维分析,下面我们就来看看TensorBorad在词嵌入中的投影。这里采用官方GitHub开源实现上的例子[5]进行讲解。

这里我们自定义了两个操作(operator,OP):SkipgramWord2vec和NegTrainWord2vec。为什么需要自定义操作以及如何定义一个操作将在4.10节介绍。操作需要先编译,然后执行。这里采用Mac OS系统,在g++命令后加上-undefined dynamic_lookup参数:

TF_INC=$(python -c 'import tensorflow as tf;
print(tf.sysconfig.get_include())')
g++ -std=c++11 -shared word2vec_ops.cc word2vec_kernels.cc -o word2vec_ops.so -fPIC -I $TF_INC -O2 -D_GLIBCXX_USE_CXX11_ABI=0

在当前目录下生成word2vec_ops.so文件,然后执行word2vec_optimized.py,生成的模型和日志文件位于/tmp/,我们执行:

tensorboard --logdir=/tmp/
访问http://192.168.0.101:6006/,得到的EMBEDDINGS面板如图3-22所示。

图3-22

在EMBEDDINGS面板左侧的工具栏中,可以选择降维的方式,有T-SNE、PCA和CUSTOM的降维方式,并且可以做二维/三维的图像切换。例如,切换到t-SNE降维工具,可以手动调整Dimension(困惑度)、Learning rate(学习率)等参数,最终生成10 000个点的分布,如图3-23所示。

图3-23

在EMBEDDINGS面板的右侧,可以采用正则表达式匹配出某些词,直观地看到词之间的余弦距离或欧式距离的关系,如图3-24所示。

图3-24

任意选择一个点,如8129,选择“isolate 101 points”按钮,将会展示出100个在空间上最接近被选择点的词,也可以调整展示的词的数量,如图3-25所示。

图3-25

时间: 2024-09-15 05:25:32

《TensorFlow技术解析与实战》——3.3 可视化的例子的相关文章

《TensorFlow技术解析与实战》——第3章 可视化TensorFlow

第3章 可视化TensorFlow TensorFlow技术解析与实战可视化是认识程序的最直观方式.在做数据分析时,可视化一般是数据分析最后一步的结果呈现.把可视化放到"基础篇",是为了让读者在安装完成后,就能先看一下TensorFlow到底有哪些功能,直观感受一下深度学习的学习成果,让学习目标一目了然.

《TensorFlow技术解析与实战》——第1章 人工智能概述 1.1什么是人工智能

第一篇 基础篇 著名历史学家斯塔夫里阿诺斯在<全球通史>中,曾以15世纪的航海在"物理上"连通"各大洲"作为标志将人类历史划分为两个阶段.在我正在写作的<互联网通史>中,我把互联网这个"信息上"连通"人类个体"的物件作为划分人类历史的标志.而随着人工智能最近的崛起,我们又该思考重新划分了,因为人工智能将会在"信息上"连通"各个物体".到那时各个物体都有"

《TensorFlow技术解析与实战》——1.2 什么是深度学习

本节书摘来自异步社区<TensorFlow技术解析与实战>一书中的第1章,第1.2节,作者李嘉璇,更多章节内容可以访问"异步社区"公众号查看 1.2 什么是深度学习 深度学习,顾名思义,需要从"深度"和"学习"两方面来谈. 1.深度 深度学习的前身是人工神经网络(artificial neural network,ANN),它的基本特点就是试图模仿人脑的神经元之间传递和处理信息的模式.神经网络这个词本身可以指生物神经网络和人工神经网络

《TensorFlow技术解析与实战》——第2章 TensorFlow环境的准备

第2章 TensorFlow环境的准备 TensorFlow技术解析与实战本章的主要任务就是准备TensorFlow环境.与安装其他软件(如Caffe)相比,TensorFlow极容易安装,环境部署极为轻松. 接下来我们先介绍下载TensorFlow代码仓库,然后介绍基于pip的安装方式.基于Java的安装方式以及使用Bazel的源代码编译安装方式.

《TensorFlow技术解析与实战》——第1章 人工智能概述

第1章 人工智能概述 TensorFlow技术解析与实战有人说,人工智能在世界范围的流行,是因为那盘围棋.2016年3月,谷歌公司的AlphaGo向韩国棋院围棋九段大师李世石发起挑战,而这棋局走法的可能性有361!种,最终AlphaGo战胜了这场"棋局数比可见宇宙中的原子数还多"的智力游戏.2015年11月9日(在距这场比赛前4个月),谷歌公司开源了它的第二代深度学习系统TensorFlow,也就是AlphaGo的基础程序.

《TensorFlow技术解析与实战》——第一篇 基础篇

第一篇 基础篇 TensorFlow技术解析与实战著名历史学家斯塔夫里阿诺斯在<全球通史>中,曾以15世纪的航海在"物理上"连通"各大洲"作为标志将人类历史划分为两个阶段.在我正在写作的<互联网通史>中,我把互联网这个"信息上"连通"人类个体"的物件作为划分人类历史的标志.而随着人工智能最近的崛起,我们又该思考重新划分了,因为人工智能将会在"信息上"连通"各个物体"

《TensorFlow技术解析与实战》——导读

前言 缘起 2017年2月,TensorFlow的首届开发者峰会(2017 TensorFlow Dev Summit)在美国的加利福尼亚州举行.在会上,谷歌公司宣布正式发布TensorFlow 1.0版本.本书就是基于最新的1.1.0版本来介绍TensorFlow的技术解析和实战. 人工智能大潮来了.2016年,AlphaGo击败围棋大师李世石后,人工智能的应用仿佛一夜之间遍地开花.在科技潮流的大环境中,现在硅谷的用人单位越来越倾向于雇用既懂理论(思考者)又懂编程(执行者)的工程师.思考者的日

《TensorFlow技术解析与实战》——3.3 可视化的例子

3.3 可视化的例子 词嵌入(word embedding)在机器学习中非常常见,可以应用在自然语言处理.推荐系统等其他程序中.下面我们就以Word2vec为例来看看词嵌入投影仪的可视化. TensorFlow的Word2Vec有basic.optimised这两个版本,我们重点来看这两个版本的可视化表示. 3.3.1 降维分析 本节将以GitHub上的一段代码[3]为例,讲述可视化的思路. Word2vec采用text8[4]作为文本的训练数据集.这个文本中只包含a-z字符和空格,共27种字符

《TensorFlow技术解析与实战》——3.2 TensorBoard

3.2 TensorBoard TensorBoard是TensorFlow自带的一个强大的可视化工具,也是一个Web应用程序套件.TensorBoard目前支持7种可视化,即SCALARS.IMAGES.AUDIO.GRAPHS.DISTRIBUTIONS.HISTOGRAMS和EMBEDDINGS.这7种可视化的主要功能如下. SCALARS:展示训练过程中的准确率.损失值.权重/偏置的变化情况.IMAGES:展示训练过程中记录的图像.AUDIO:展示训练过程中记录的音频.GRAPHS:展示