tensorflow1.1/embedding可视化

环境:tensorflow1.1,python3,matplotlib2.02,tensorboard1.1

通常图像或音频系统处理的是由图片中所有单个原始像素点强度值或者音频中功率谱密度的强度值,把它们编码成丰富、高纬度的向量数据集。对于物体或语音识别这一类的任务,我们所需的全部信息已经都存储在原始数据中。然后,自然语言处理系统通常将词汇作为离散的单一符号,例如 “cat” 一词或可表示为 Id537 ,而 “dog” 一词或可表示为 Id143。这些符号编码毫无规律,无法提供不同词汇之间可能存在的关联信息。

我们可以把学习向量映射到2维中以便我们观察,其中用到的技术可以参考 t-SNE 降纬技术。当我们用可视化的方式来观察这些向量,就可以很明显的获取单词之间语义信息的关系,这实际上是非常有用的。

本实验是人脸数据集中,图像经过embedding后在空间可视化

#codding:utf-8
from tensorflow.contrib.tensorboard.plugins import projector
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import os
import pickle

#读取数据集
with open('facedataset.pickle','rb') as f:
    (train_data,train_labels),(test_data,test_labels) = pickle.load(f)

#定义一个next_batch函数
def next_batch(a,batch_size):
    a = np.random.permutation(a)
    b = []
    for i in range(batch_size):
        b.append(a[i])
    return np.array(b)

log_dir = 'facesample'
name_to_visualise_variable = 'faceembedding'

batch_size = 320
#os.path.join路径拼接
path_for_face_png = os.path.join(log_dir,'newface.png')
path_for_face_data = os.path.join(log_dir,'newface.tsv')

batch_xs = next_batch(train_data,batch_size)
batch_ys = next_batch(train_labels,batch_size)

#建立embedding
embedding_var = tf.Variable(batch_xs,name = name_to_visualise_variable)
summary_writer = tf.summary.FileWriter(log_dir)

config = projector.ProjectorConfig()
#加入embedding层
embedding = config.embeddings.add()
embedding.tensor_name = embedding_var.name
embedding.metadata_path = path_for_face_data
embedding.sprite.image_path = path_for_face_png
embedding.sprite.single_image_dim.extend([57,47])

#embedding可视化
projector.visualize_embeddings(summary_writer,config)

sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
saver = tf.train.Saver()
saver.save(sess,os.path.join(log_dir,'model.ckpt'),1)

#将图片拼成一张大图
def create_sprite_image(images):
    if isinstance(images, list):
        images = np.array(images)
    img_h = images.shape[1]
    img_w = images.shape[2]
    n_plots = int(np.ceil(np.sqrt(images.shape[0])))


    spriteimage = np.ones((img_h * n_plots ,img_w * n_plots ))

    for i in range(n_plots):
        for j in range(n_plots):
            this_filter = i * n_plots + j
            if this_filter < images.shape[0]:
                this_img = images[this_filter]
                spriteimage[i * img_h:(i + 1) * img_h,
                  j * img_w:(j + 1) * img_w] = this_img

    return spriteimage

#将矩阵转为图片
def vector_to_matrix_face(face_digits):
    """Reshapes normal face digit (batch,28*28) to matrix (batch,28,28)"""
    return np.reshape(face_digits,(-1,57,47))

#将黑白转换
def invert_grayscale(face_digits):
    """ Makes black white, and white black """
    return 1-face_digits

to_visualise = batch_xs
to_visualise = vector_to_matrix_face(to_visualise)
to_visualise = invert_grayscale(to_visualise)

sprite_image = create_sprite_image(to_visualise)

plt.imsave(path_for_face_png,sprite_image,cmap='gray')
plt.imshow(sprite_image,cmap='gray')

with open(path_for_face_data,'w') as f:
    f.write("Index\tLabel\n")
    for index,label in enumerate(batch_ys):
        f.write("%d\t%d\n" % (index,label))

运行:

python3usr/lib/python3.4/site-packages/tensorflow/tensorboard/tensorboard.py –logdir=’facesample/’

结果:

数据集打乱情况下可视化:
PCA: 40种标签的人脸图片在空间中无序
这里写图片描述

t-SNE: 40种标签的人脸图片在空间中无序
这里写图片描述

数据集在没有打乱情况下可视化:
PCA: 40种标签的人脸图片在空间中分布明显
这里写图片描述

t-SNE: 40种标签的人脸图片在空间中分布明显
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值