簡體   English   中英

如何在Python中使用TensorBoard和Keras來可視化嵌入

[英]How to use TensorBoard with Keras in Python for visualizing embeddings

我正在閱讀使用Keras的Deep Learning with Python一書。 在第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

[UPDATE]

為了測試任何可能的解決方案,我測試了這個:

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的唯一方法,它不會導致錯誤。 但即便如此,這也無濟於事。 仍是PROJECTOR的TensorBoard的選項卡為空:

在此輸入圖像描述

任何幫助表示贊賞。

我也在閱讀使用Keras的“深度學習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個樣本

請注意,在投影儀中,“點數:100”表示有100個樣本,“維度:64000”表示一個樣本的嵌入向量長度為​​64000.一個樣本中有500個單詞,“max_len = 500”,並且每個單詞都有一個128_dim向量,因此500 * 128 = 64000。

是的,這是正確的,你需要提供什么樣的嵌入使用可視化embeddings_data參數:

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數組列表(如果模型有多個輸入)。

查看文檔以獲取有關這些參數的更新信息。

我問自己同樣的問題。 從文檔中可以看出“embeddings_data”應該是什么。 但它是有意義的,它是嵌入的單詞列表,或者更確切地說是它們的索引。

但我對格式有點困惑。 從我使用keras tokenizer的標記化開始,我有一個“word_index”,其中包含我詞匯表中所有單詞的數字,使用最常用的maxwords條目。 標記器為我提供了從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是我的詞匯量大小,一個熱門編碼的單詞/文本的大小, embedding_dim是圖層輸出的大小,而maxlen是序列的長度,即句子中的單詞數量,它保持不變通過填充。 word_index中的數字是“embeddings_data”應該以某種方式獲得的數字嗎?

當我輸入“僅”一個numpy數組,列出任意數量的單詞索引

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

我收到此錯誤:

ValueError:無法為Tensor'ceed_input_2:0'提供形狀值(3,1),其形狀為'(?,100)'

在我的例子中,100是序列的長度。 這令人困惑。 因為我想要想象單個單詞,而不是句子或文本,不是嗎? 顯然,Callback想要為圖層提供一個或多個序列。

那么我應該如何編碼我的“女王”,“國王”,“女人”,“男人”代幣,這樣才能看到語義關系(希望如此)? 或者更一般地說:如何對所有詞匯元素進行概述,以發現經過單獨訓練的嵌入的整體趨勢?

這是使用嵌入用於基本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')

現在為tensorboard創建元數據。 對於此分類任務, 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)

現在定義tensorboard回調。 請注意,'features'將引用感興趣的圖層嵌入,在模型構建期間命名。 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())

下一層名為“要素”。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM