Python 3.x 如何在Python中使用TensorBoard和Keras可视化嵌入

Python 3.x 如何在Python中使用TensorBoard和Keras可视化嵌入,python-3.x,keras,tensorboard,Python 3.x,Keras,Tensorboard,我正在阅读使用Keras的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)

我正在阅读使用Keras的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\u 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\u data
而不会导致错误的方法。但即便如此,这也无济于事。张力板的
投影仪
选项卡仍然为空:


非常感谢您的帮助。

是的,这是正确的,您需要使用
embeddings\u 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,...]),
    )
]
嵌入数据:嵌入层名称中指定的层中嵌入的数据。Numpy数组(如果模型有一个输入)或Numpy数组列表(如果模型有多个输入)


请看一下,以获取关于这些论点的最新信息。

我刚才问了自己同样的问题。从文档中看,不太清楚“嵌入数据”应该是什么。但这是一个要嵌入的单词列表,或者更确切地说是它们的索引,这是有道理的

但我对格式有点困惑。通过keras标记器的标记化,我有一个“word_索引”,其中包含我词汇表中使用最频繁的maxwords条目的所有单词的编号。标记器为我提供从0到maxwords的整数列表或一个热编码的单词包。然后我将这些序列填充到maxlen

然后,我创建了一个以嵌入层开始的模型,如下所示:

embedding_dim = 300

model = Sequential()
model.add(Embedding(max_words,embedding_dim,input_length=maxlen, name='embed'))
model.add(Flatten())
...
所以max_words是我的词汇量,一个热编码单词/文本的大小,embedded_dim是层输出的大小,maxlen是序列的长度,即句子中的单词数,通过填充保持不变。 单词索引中的数字是“嵌入数据”应该得到的数字吗

当我输入“仅”一个numpy数组时,它列出了任意数量的单词索引

...
tensorboard = TensorBoard(log_dir='log_dir', histogram_freq=1, embeddings_freq=1, embeddings_data=np.array([1,2,3]))
...
我得到这个错误:

ValueError:无法为张量'embed_input_2:0'输入形状(3,1)的值,该张量具有形状'(?,100)'

在我的示例中,100是序列的长度。这令人困惑。因为我想想象单个单词,而不是句子或文本,不是吗?很明显,回调想要向层提供一个或多个序列

那么,我应该如何对我的“女王”、“国王”、“女人”、“男人”标记进行编码,以便我能够看到语义关系(希望如此)? 或者更一般地说:如何对所有词汇表元素进行概述,以发现单独训练的嵌入的总体趋势?

这里是一个使用嵌入的基本MNIST卷积NN分类器。
embedded_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创建了元数据。对于此分类任务,
嵌入_数据
是测试集。然后元数据必须包含相应的数字标签

# 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回调。请注意,“特征”将指感兴趣的嵌入层,该层在模型构建期间命名。
嵌入_数据
只是这里的测试集

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
我还在读一本使用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)
但有一个错误:

因为“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)


请注意,在投影仪中,“Points:100”表示有100个样本,“Dimension:64000”表示one样本的嵌入向量长度为64000。一个示例中有500个单词,如“max_len=500”,每个单词有一个128_dim向量,因此500*128=64000。

谢谢,但您能更具体一点吗?我的意思是我提供了完整的例子。在本例中,作为
embeddings\u data
我应该提供什么?为了方便起见,要嵌入的单词的索引将根据数据集中的总体频率进行索引,例如整数“3”对数据中第三个最常用的单词进行编码。感谢您对我的耐心,我理解您的意思,但我应该从哪里获得这些信息?同样,我仍在学习Keras,尽管我理解这些概念,但我很难找到
嵌入\u数据所需的内容。如果你能完成给定的例子就太好了。@Mehran你找到解决方案了吗?完整版本的OP代码就太好了。@zahbaz不,我还没有找到解决方案。但老实说,我已经有一段时间没有尝试过任何解决方案了。至于代码的完整版本,即使这里给出的代码是完整的,你也可以在上面提到的书中找到它。只需谷歌一下。
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)