web-dev-qa-db-ja.com

Python埋め込みを視覚化するために、KerasでTensorBoardを使用する方法

私は本を​​読んでいますDeep Learning with PythonはKerasを使用しています。第7章では、TensorBoardを使用して、トレーニングフェーズの進行状況を監視する方法の例を示します。

import keras
from keras import layers
from keras.datasets import imdb
from keras.preprocessing import sequence

max_features = 2000
max_len = 500
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=max_len)
x_test = sequence.pad_sequences(x_test, maxlen=max_len)

model = keras.models.Sequential()
model.add(layers.Embedding(max_features, 128, input_length=max_len, name='embed'))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
model.summary()

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])

callbacks = [
    keras.callbacks.TensorBoard(
        log_dir='my_log_dir',
        histogram_freq=1,
        embeddings_freq=1,
    )
]
history = model.fit(x_train, y_train, epochs=20, batch_size=128, validation_split=0.2, callbacks=callbacks)

どうやら、このコードはいくつかの例外を発生させるため、Kerasライブラリはいくつかの変更を経ています。

ValueError: To visualize embeddings, embeddings_data must be provided.

これは、最初のエポックが完了し、コールバックが初めて実行された後(TensorBoardが初めて実行されたとき)です。不足しているのはTensorBoardのパラメーターembeddings_data。しかし、私はそれに何を割り当てるべきかわかりません。

誰かがこれの実用的な例を持っていますか?

私が使用しているバージョンは次のとおりです。

Python: 3.6.5
Keras: 2.2.0
Tensorflow: 1.9.0

[更新]

可能な解決策をテストするために、私はこれをテストしました:

import numpy as np

callbacks = [
    keras.callbacks.TensorBoard(
        log_dir='my_log_dir',
        histogram_freq = 1,
        embeddings_freq = 1,
        embeddings_data = np.arange(0, max_len).reshape((1, max_len)),
    )
]
history = model.fit(x_train, y_train, epochs=20, batch_size=128, validation_split=0.2, callbacks=callbacks)

これが、embeddings_dataこれはエラーにはなりません。しかし、それでもこれは役に立ちません。 TensorBoardのPROJECTORタブはまだ空です:

enter image description here

どんな助けも大歓迎です。

15
Mehran

また、Kerasを使用した「Deep Learning with Python」という本も読んでいます。この質問に対する私の解決策は次のとおりです。最初に、私はこのコードを試してください:

callbacks = [keras.callbacks.TensorBoard(
    log_dir = 'my_log_dir',
    histogram_freq = 1,
    embeddings_freq = 1,
    embeddings_data = x_train,
)]
history = model.fit(x_train, y_train, epochs=2, batch_size=128, validation_split=0.2, callbacks=callbacks)

しかし、エラーがあります: ResourceExhaustedError

「x_train」には25000個のサンプルがあるため、すべてのサンプルを古いノートブックに埋め込むことは困難です。そこで、次に「x_train」の最初の100個のサンプルを埋め込みますが、これは理にかなっています。

コードと結果をここに示します。

callbacks = [keras.callbacks.TensorBoard(
    log_dir = 'my_log_dir',
    histogram_freq = 1,
    embeddings_freq = 1,
    embeddings_data = x_train[:100],
)]
history = model.fit(x_train, y_train, epochs=2, batch_size=128, validation_split=0.2, callbacks=callbacks)

100サンプルのプロジェクター

プロジェクターでは、「Points:100」は100個のサンプルがあり、「Dimension:64000」はoneサンプルの埋め込みベクトルの長さが64000。「max_len = 500」のように、1つのサンプルに500ワードがあり、各ワードに128_dimベクトルがあるため、500 * 128 = 64000です。

3
ttigong

はい、それは正しいです。embeddings_data引数を使用して、ビジュアライゼーションに埋め込むwhatを指定する必要があります。

callbacks = [
    keras.callbacks.TensorBoard(
        log_dir='my_log_dir',
        histogram_freq=1,
        embeddings_freq=1,
        embeddings_data=np.array([3,4,2,5,2,...]),
    )
]

embeddings_data:embeddings_layer_namesで指定されたレイヤーに埋め込まれるデータ。 Numpy配列(モデルに単一の入力がある場合)またはNumpy配列のリスト(モデルに複数の入力がある場合)。

これらの引数が何であるかに関する最新情報については、 documentation をご覧ください。

1
nuric

私は自分自身に同じ質問をしました。ドキュメントからは、「embeddings_data」が何であるかが明確ではありませんでした。しかし、埋め込む単語のリスト、またはむしろそれらのインデックスであることは理にかなっています。

しかし、私はフォーマットについて少し混乱しています。 kerasトークナイザーを使用したトークン化から、最も頻繁にmaxwordsエントリが使用される語彙のすべての単語の番号を含む「Word_index」があります。トークナイザーは、0からmaxwordsまでの整数のリスト、またはワンホットエンコードされた単語のバッグを提供します。次に、これらのシーケンスをmaxlenに埋め込みます。

max_words = 1000

tokenizer = Tokenizer(num_words=max_words)
tokenizer.fit_on_texts(X_train)

X_train_sequences = tokenizer.texts_to_sequences(X_train)
X_train_one_hot_results = tokenizer.texts_to_matrix(X_train, mode='binary')

X_test_sequences = tokenizer.texts_to_sequences(X_test)
X_test_one_hot_results = tokenizer.texts_to_matrix(X_test, mode='binary')

#####

maxlen = 100
X_train_pad = pad_sequences(X_train_sequences, maxlen=maxlen)
X_test_pad = pad_sequences(X_test_sequences, maxlen=maxlen)

次に、次のような埋め込みレイヤーで始まるモデルを作成します。

embedding_dim = 300

model = Sequential()
model.add(Embedding(max_words,embedding_dim,input_length=maxlen, name='embed'))
model.add(Flatten())
...

max_wordsはボキャブラリーのサイズ、ホットエンコードされた1つのワード/テキストのサイズ、embedding_dimはレイヤーの出力のサイズ、maxlen =はシーケンスの長さ、つまり文中の単語数であり、パディングによって一定に保たれます。 Word_indexの数値は、 "embeddings_data"が何らかの方法で取得するものですか?

任意の数のWordインデックスをリストするnumpy配列を「only」と入力すると

...
tensorboard = TensorBoard(log_dir='log_dir', histogram_freq=1, embeddings_freq=1, embeddings_data=np.array([1,2,3]))
...

私はこのエラーを受け取ります:

ValueError:形状 '(?、100)'を持つTensor 'embed_input_2:0'の形状(3、1)の値をフィードできません

私の例では、100はシーケンスの長さです。それは紛らわしいです。文やテキストではなく、単一の単語を視覚化したいのですが。明らかに、コールバックはレイヤーに1つ以上のシーケンスを送りたいと考えています。

それでは、「女王」、「王」、「女」、「男」のトークンをどのようにエンコードして、意味関係を見ることができますか?またはより一般的に:個別にトレーニングされた埋め込みの全体的な傾向を見つけるために、すべての語彙要素の概要を取得する方法は?

1

は、基本的なMNIST畳み込みNN分類器に埋め込みを使用しています。 embedding_dataは、このシナリオではたまたま入力データであり、通常は、ネットワークを介してフィードフォワードされるデータであれば何でもかまいません。

リンクされたスクリプトとコメントがあります。まず、基本的なMNISTセットアップから始めます。

'''Trains a simple convnet on the MNIST dataset and embeds test data.
The test data is embedded using the weights of the final dense layer, just
before the classification head. This embedding can then be visualized using
TensorBoard's Embedding Projector.
'''

from __future__ import print_function

from os import makedirs
from os.path import exists, join

import keras
from keras.callbacks import TensorBoard
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

import numpy as np

batch_size = 128
num_classes = 10
epochs = 12
log_dir = './logs'

if not exists(log_dir):
    makedirs(log_dir)

# input image dimensions
img_rows, img_cols = 28, 28

# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

これで、テンソルボードのメタデータが作成されます。この分類タスクでは、embedding_dataはテストセットです。次に、メタデータに対応する数字ラベルを含める必要があります。

# save class labels to disk to color data points in TensorBoard accordingly
with open(join(log_dir, 'metadata.tsv'), 'w') as f:
    np.savetxt(f, y_test)

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

次に、テンソルボードコールバックを定義します。 「機能」とは、モデルの構築中に名前が付けられた対象のレイヤーの埋め込みを指すことに注意してください。 embedding_dataは、ここでのテストセットです。

tensorboard = TensorBoard(batch_size=batch_size,
                          embeddings_freq=1,
                          embeddings_layer_names=['features'],
                          embeddings_metadata='metadata.tsv',
                          embeddings_data=x_test)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())

次のレイヤーの名前は「features」です。

model.add(Dense(128, activation='relu', name='features'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

model.fit(x_train, y_train,
          batch_size=batch_size,
          callbacks=[tensorboard],
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

# You can now launch tensorboard with `tensorboard --logdir=./logs` on your
# command line and then go to http://localhost:6006/#projector to view the
# embeddings
0
zahbaz