이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

TensorBoard에서 임베딩 프로젝터를 사용하여 데이터 시각화

TensorFlow.org에서보기 Google Colab에서 실행 GitHub에서 소스보기

개요

TensorBoard Embedding Projector를 사용하여 고차원 임베딩 을 그래픽으로 표현할 수 있습니다. 임베딩 레이어를 시각화, 검사 및 이해하는 데 도움이됩니다.

내장 프로젝터 스크린 샷

이 튜토리얼에서는 이러한 유형의 훈련 된 레이어를 시각화하는 방법을 배웁니다.

설정

이 튜토리얼에서는 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"은 데이터에서 세 번째로 자주 나오는 단어를 인코딩합니다. 이를 통해 다음과 같은 빠른 필터링 작업을 수행 할 수 있습니다. "가장 일반적인 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 Embedding Layer 를 사용하여 어휘의 각 단어에 대한 임베딩을 학습 할 수 있습니다. 각 단어 (이 경우 하위 단어)는 모델에서 학습 할 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 Projector는 데이터를 분석하고 서로 관련되는 값을 볼 수있는 훌륭한 도구입니다. 대시 보드를 사용하면 특정 용어를 검색 할 수 있으며 임베드 공간 근처에있는 단어를 강조 표시합니다. 이 예에서 Wes Anderson 과 Alfred Hitchcock 은 둘 다 중립적 인 용어이지만 서로 다른 상황에서 참조됨을 알 수 있습니다.

히치콕은 nightmarenightmare 단어와 더 관련이 있으며, 이는 공포 영화에서의 그의 작품과 관련이 있습니다. Anderson은 heart 라는 단어에 더 가까우면서도 따뜻한 스타일을 반영합니다.