此页面由 Cloud Translation API 翻译。
Switch to English

使用TensorBoard中的嵌入式投影仪可视化数据

在TensorFlow.org上查看 在Google Colab中运行 在GitHub上查看源代码

总览

使用TensorBoard嵌入投影仪 ,您可以图形化地表示高维嵌入。这有助于可视化,检查和理解嵌入层。

嵌入式投影仪的屏幕截图

在本教程中,您将学习如何可视化这种经过训练的图层。

建立

在本教程中,我们将使用TensorBoard可视化为对电影评论数据进行分类而生成的嵌入层。

 try:
  # %tensorflow_version only exists in Colab.
  %tensorflow_version 2.x
except Exception:
  pass

%load_ext tensorboard
 
 import os
import tensorflow as tf
import tensorflow_datasets as tfds
from tensorboard.plugins import projector

 

IMDB数据

我们将使用来自IMDB的25,000条电影评论的数据集,并以情感(正/负)标记。评论已经过预处理,并且每个评论都被编码为单词索引(整数)序列。为了方便起见,单词以数据集中的整体频率进行索引,因此,例如整数“ 3”将编码数据中第3个最频繁出现的单词。这样可以进行快速过滤操作,例如:“仅考虑前10,000个最常用的词,而排除前20个最常用的词”。

按照惯例,“ 0”不代表特定单词,而是用于编码任何未知单词。在本教程的后面,我们将从可视化中删除此行。

 (train_data, test_data), info = tfds.load(
    "imdb_reviews/subwords8k",
    split=(tfds.Split.TRAIN, tfds.Split.TEST),
    with_info=True,
    as_supervised=True,
)
encoder = info.features["text"].encoder

# shuffle and pad the data.
train_batches = train_data.shuffle(1000).padded_batch(
    10, padded_shapes=((None,), ())
)
test_batches = test_data.shuffle(1000).padded_batch(
    10, padded_shapes=((None,), ())
)
train_batch, train_labels = next(iter(train_batches))

 

Keras嵌入层

Keras嵌入层可用于训练词汇表中每个单词的嵌入。每个单词(或这种情况下的子单词)将与模型将训练的16维向量(或嵌入)相关联。

请参阅本教程以了解有关单词嵌入的更多信息。

 # Create an embedding layer
embedding_dim = 16
embedding = tf.keras.layers.Embedding(encoder.vocab_size, embedding_dim)
# Train this embedding as part of a keras model
model = tf.keras.Sequential(
    [
        embedding, # The embedding layer should be the first layer in a model.
        tf.keras.layers.GlobalAveragePooling1D(),
        tf.keras.layers.Dense(16, activation="relu"),
        tf.keras.layers.Dense(1),
    ]
)

# Compile model
model.compile(
    optimizer="adam",
    loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
    metrics=["accuracy"],
)

# Train model
history = model.fit(
    train_batches, epochs=1, validation_data=test_batches, validation_steps=20
)
 
2500/2500 [==============================] - 13s 5ms/step - loss: 0.5330 - accuracy: 0.6769 - val_loss: 0.4043 - val_accuracy: 0.7800

为TensorBoard保存数据

TensorBoard从指定的log_dir目录中的日志中读取tensorflow项目中的张量和元数据。在本教程中,我们将使用/logs/imdb-example/

为了使这些数据可视化,我们将把检查点以及元数据保存到该目录中,以了解要可视化的层。

 # Set up a logs directory, so Tensorboard knows where to look for files
log_dir='/logs/imdb-example/'
if not os.path.exists(log_dir):
    os.makedirs(log_dir)

# Save Labels separately on a line-by-line manner.
with open(os.path.join(log_dir, 'metadata.tsv'), "w") as f:
  for subwords in encoder.subwords:
    f.write("{}\n".format(subwords))
  # Fill in the rest of the labels with "unknown"
  for unknown in range(1, encoder.vocab_size - len(encoder.subwords)):
    f.write("unknown #{}\n".format(unknown))


# Save the weights we want to analyse as a variable. Note that the first
# value represents any unknown word, which is not in the metadata, so
# we will remove that value.
weights = tf.Variable(model.layers[0].get_weights()[0][1:])
# Create a checkpoint from embedding, the filename and key are
# name of the tensor.
checkpoint = tf.train.Checkpoint(embedding=weights)
checkpoint.save(os.path.join(log_dir, "embedding.ckpt"))

# Set up config
config = projector.ProjectorConfig()
embedding = config.embeddings.add()
# The name of the tensor will be suffixed by `/.ATTRIBUTES/VARIABLE_VALUE`
embedding.tensor_name = "embedding/.ATTRIBUTES/VARIABLE_VALUE"
embedding.metadata_path = 'metadata.tsv'
projector.visualize_embeddings(log_dir, config)
 
 %tensorboard --logdir /logs/imdb-example/
 

分析

TensorBoard投影仪是一个很好的工具,可用于分析数据并查看彼此之间的嵌入值。仪表板允许搜索特定术语,并突出显示嵌入空间中附近的单词。从这个例子中我们可以看到,韦斯·安德森和阿尔弗雷德· 希区柯克都是比较中性的术语,但是它们在不同的上下文中被引用。

希区柯克(Hitchcock)与nightmare night(Nightmare)等词联系更紧密,这可能与他在恐怖电影中的作品有关。而安德森(Anderson)更贴近“ heart一词,反映了他的温馨风格。