Keras - 监控嵌入层时张量板回调挂起
Keras - tensorboard callback hangs when monitoring embedding layers
我正在尝试将 keras 连接到 tensorboard,以便在模型中可视化我的嵌入层。我不确定为什么,但在纪元结束后,keras 只是坐在那里什么都不做,不写日志文件或检查点。下面的代码(模型的定义无关紧要,它有一个嵌入层和几个 GRU 层,然后是密集层):
filepath="./logs/modelBasicGRU.h5"
checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
#do the embedding vizualization
tb_callback = TensorBoard(log_dir='./logs', histogram_freq=1, write_graph=False,
embeddings_freq=1, batch_size=32,
embeddings_layer_names=embeddings_layer_names)
#later you need to open cmd for environment and do tensorboard --logdir=\path\to\logs
#then go to localhost:port
callbacks_list = [checkpoint, tb_callback]
history = model.fit_generator(train_gen,
steps_per_epoch=10,
epochs=40,
validation_data=val_gen,
validation_steps=val_steps,callbacks=callbacks_list)
当 epoch 结束时,它就处于这种状态:
Epoch 1/40
9/10 [==========================>...] - ETA: 1s - loss: 6.8852e-04
我检查我的日志目录 - 它不写入检查点,它不在那里写入任何日志文件。发生了什么事?
注意 - 当我在等待 20 分钟后杀死它时,我得到了:
File "C:\Users\maxim\Anaconda3\envs\Py35\lib\site-packages\keras\engine\training.py", line 2235, in evaluate_generator
generator_output = next(output_generator)
File "C:\Users\maxim\Anaconda3\envs\Py35\lib\site-packages\keras\utils\data_utils.py", line 712, in get
time.sleep(self.wait_time)
我有一种感觉,它会无限期地遍历生成器(而且我的生成器是永恒的,它永远不会结束),而不是仅仅采用一批示例。
并且只是为了强调 - 我只需要嵌入层的可视化,我不需要 Tensorboard 中的任何其他东西。因此,如果有更简单的方法来可视化嵌入 - 请告诉我。
事实证明这是回调的已知问题:https://github.com/keras-team/keras/issues/3358
当导出到 TensorBoard 时,它期望验证数据在内存中而不是生成器。这是构建正确的直方图和数据分布所必需的——因此 TensorBoard 需要一次查看整个数据集。另一方面,似乎即使您设置 histogram_freq=0(无直方图记录)它仍然无助于嵌入层,它们似乎也需要整个验证数据集。
据我所知,keras 团队试图让嵌入具有自己单独的参数 embedding_data,以确保您可以可视化具有与验证数据不同的数据的嵌入,但我没有看到它是实施的:
https://github.com/keras-team/keras/pull/7766
因此,目前唯一的解决方案是将验证集推送到内存中。首先 github link 有一段代码被剪断,它包装了 TensorBoard 回调,在导出到 tensorboard 之前,它填充了验证数据变量,有效地解决了这个问题——除了你仍然需要尽可能多地推送一个你想要存入内存的验证数据。
我正在尝试将 keras 连接到 tensorboard,以便在模型中可视化我的嵌入层。我不确定为什么,但在纪元结束后,keras 只是坐在那里什么都不做,不写日志文件或检查点。下面的代码(模型的定义无关紧要,它有一个嵌入层和几个 GRU 层,然后是密集层):
filepath="./logs/modelBasicGRU.h5"
checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
#do the embedding vizualization
tb_callback = TensorBoard(log_dir='./logs', histogram_freq=1, write_graph=False,
embeddings_freq=1, batch_size=32,
embeddings_layer_names=embeddings_layer_names)
#later you need to open cmd for environment and do tensorboard --logdir=\path\to\logs
#then go to localhost:port
callbacks_list = [checkpoint, tb_callback]
history = model.fit_generator(train_gen,
steps_per_epoch=10,
epochs=40,
validation_data=val_gen,
validation_steps=val_steps,callbacks=callbacks_list)
当 epoch 结束时,它就处于这种状态:
Epoch 1/40
9/10 [==========================>...] - ETA: 1s - loss: 6.8852e-04
我检查我的日志目录 - 它不写入检查点,它不在那里写入任何日志文件。发生了什么事?
注意 - 当我在等待 20 分钟后杀死它时,我得到了:
File "C:\Users\maxim\Anaconda3\envs\Py35\lib\site-packages\keras\engine\training.py", line 2235, in evaluate_generator
generator_output = next(output_generator)
File "C:\Users\maxim\Anaconda3\envs\Py35\lib\site-packages\keras\utils\data_utils.py", line 712, in get
time.sleep(self.wait_time)
我有一种感觉,它会无限期地遍历生成器(而且我的生成器是永恒的,它永远不会结束),而不是仅仅采用一批示例。
并且只是为了强调 - 我只需要嵌入层的可视化,我不需要 Tensorboard 中的任何其他东西。因此,如果有更简单的方法来可视化嵌入 - 请告诉我。
事实证明这是回调的已知问题:https://github.com/keras-team/keras/issues/3358
当导出到 TensorBoard 时,它期望验证数据在内存中而不是生成器。这是构建正确的直方图和数据分布所必需的——因此 TensorBoard 需要一次查看整个数据集。另一方面,似乎即使您设置 histogram_freq=0(无直方图记录)它仍然无助于嵌入层,它们似乎也需要整个验证数据集。
据我所知,keras 团队试图让嵌入具有自己单独的参数 embedding_data,以确保您可以可视化具有与验证数据不同的数据的嵌入,但我没有看到它是实施的: https://github.com/keras-team/keras/pull/7766
因此,目前唯一的解决方案是将验证集推送到内存中。首先 github link 有一段代码被剪断,它包装了 TensorBoard 回调,在导出到 tensorboard 之前,它填充了验证数据变量,有效地解决了这个问题——除了你仍然需要尽可能多地推送一个你想要存入内存的验证数据。