代码之家  ›  专栏  ›  技术社区  ›  Maksim Khaitovich

Keras-tensorboard回调在监视嵌入层时挂起

  •  2
  • Maksim Khaitovich  · 技术社区  · 7 年前

    我试图将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中的其他任何东西。因此,如果有更简单的方法来可视化嵌入,请让我知道。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Maksim Khaitovich    7 年前

    事实证明,这是回调的一个已知问题: https://github.com/keras-team/keras/issues/3358

    导出到TensorBoard时,需要验证数据在内存中,而不是生成器。这需要建立适当的直方图和数据分布,所以TensorBoard需要立即查看整个数据集。另一方面,似乎即使您将histogram\u freq设置为0(没有直方图记录),它仍然无助于嵌入层,它们似乎也需要整个验证数据集。

    据我所知,keras团队试图使嵌入具有自己的独立参数embedding\u数据,以确保您可以使用与验证数据不同的数据可视化嵌入,但我看不到它是否已实现: https://github.com/keras-team/keras/pull/7766

    因此,目前唯一的解决方案是将验证集推送到内存中。第一个github链接有一个截取的代码,它包装了TensorBoard回调,在导出到TensorBoard之前,它会填充验证数据变量,有效地解决了这个问题——除了您仍然需要将尽可能多的验证数据推入内存之外。