Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Memvisualisasikan Data menggunakan Proyektor Penyematan di TensorBoard

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub

Gambaran

Dengan menggunakan Proyektor Embedding TensorBoard , Anda dapat merepresentasikan embeddings berdimensi tinggi secara grafis. Ini dapat membantu dalam memvisualisasikan, memeriksa, dan memahami lapisan embedding Anda.

Tangkapan layar proyektor penyematan

Dalam tutorial ini, Anda akan mempelajari cara memvisualisasikan jenis lapisan terlatih ini.

Mendirikan

Untuk tutorial ini, kita akan menggunakan TensorBoard untuk memvisualisasikan lapisan embedding yang dihasilkan untuk mengklasifikasikan data ulasan film.

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

Data IMDB

Kami akan menggunakan kumpulan data 25.000 ulasan film dari IMDB, diberi label oleh sentimen (positif / negatif). Tinjauan telah diproses sebelumnya, dan setiap tinjauan dikodekan sebagai urutan indeks kata (bilangan bulat). Untuk kenyamanan, kata-kata diindeks berdasarkan frekuensi keseluruhan dalam kumpulan data, sehingga misalnya bilangan bulat "3" mengkodekan kata ke-3 yang paling sering dalam data. Hal ini memungkinkan operasi pemfilteran cepat seperti: "hanya pertimbangkan 10.000 kata paling umum, tetapi hilangkan 20 kata paling umum".

Sebagai konvensi, "0" tidak berarti kata tertentu, tetapi digunakan untuk menyandikan kata yang tidak dikenal. Nanti di tutorial, kami akan menghapus baris ini dari visualisasi.

(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))

Lapisan Keras Embedding

Lapisan Keras Embedding dapat digunakan untuk melatih embedding untuk setiap kata dalam kosakata Anda. Setiap kata (atau sub-kata dalam kasus ini) akan dikaitkan dengan vektor 16 dimensi (atau penyematan) yang akan dilatih oleh model.

Lihat tutorial ini untuk mempelajari lebih lanjut tentang embeddings kata.

# 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

Menyimpan data untuk TensorBoard

TensorBoard membaca tensor dan metadata dari proyek tensorflow Anda dari log di direktori log_dir ditentukan. Untuk tutorial ini, kami akan menggunakan /logs/imdb-example/ .

Untuk memvisualisasikan data ini, kami akan menyimpan checkpoint ke direktori tersebut, bersama dengan metadata untuk memahami lapisan mana yang akan divisualisasikan.

# 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/

Analisis

Proyektor TensorBoard adalah alat yang hebat untuk menganalisis data Anda dan melihat nilai embedding relatif satu sama lain. Dasbor memungkinkan pencarian istilah tertentu, dan menyoroti kata-kata yang ada di sekitar di ruang embedding. Dari contoh ini kita dapat melihat bahwa Wes Anderson dan Alfred Hitchcock adalah istilah yang agak netral, tetapi dirujuk dalam konteks yang berbeda.

Hitchcock lebih dekat dikaitkan dengan kata-kata seperti nightmare , yang kemungkinan besar terkait dengan karyanya dalam film horor. Sementara Anderson lebih dekat dengan kata heart , mencerminkan gayanya yang menghangatkan hati.