Keras - 在监控嵌入层时,tensorboard回调会挂起

时间:2018-02-22 17:06:02

标签: tensorflow keras tensorboard

我正在尝试将keras挂钩到tensorboard,以便在模型中可视化我的嵌入层。我不确定为什么但是在纪元结束之后keras只是坐在那里什么都不做,不写日志文件或检查点。下面的代码(模型的定义是无关紧要的,它有一个嵌入层和几个GRU层,后跟Dense层):

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中不需要任何其他内容。因此,如果有一种更简单的方法可视化嵌入 - 请告诉我。

1 个答案:

答案 0 :(得分:1)

使用回调来证明其已知问题: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链接有一个代码剪切,包含TensorBoard回调,在导出到tensorboard之前,它填写验证数据变量,有效地解决了问题 - 除了你仍然需要将尽可能多的验证数据推送到内存中