运行 model.fit() 和 TensorBoard 同时?

Running model.fit() and TensorBoard at the same time?

我有一个有趣的(对我来说)问题,关于 运行ning model.fit() 和 tensorboard 同时。

我在互联网上做了一些关于 "Threading"、"Processing"、"Multi-processing" 的研究,尝试了示例但无法解决我的问题。

我想 运行 TensorBoard 和 model.fit() 同时像:

from threading import Thread
import subprocess

def startTensorboard(log_dir):
    # Tried both
    os.system('tensorboard --logdir '+ log_dir)
    # subprocess.call(['tensorboard', '--logdir', log_dir])

tensorboard = tf.keras.callbacks.TensorBoard(log_dir='logs', histogram_freq=0,
                          write_graph=True, write_images=False)

Thread(target = startTensorboard('logs')).start()

Thread(target = model.fit_generator(
                self.train_data_gen,
                steps_per_epoch=self.STEPS_PER_EPOCH,
                validation_data = self.test_data_gen,
                validation_steps = self.VALID_STEPS_PER_EPOCH,
                epochs=self.epoch,
                callbacks=[tensorboard])).start()

这可能吗?当我 运行 这段代码时,TensorBoard 是 运行ning 但 model.fit() 不工作。

以下是一个工作示例,我认为它可以满足您的要求。我正在使用 multiprocessing module. Note that it seems to be important that the model is defined inside the function that you set as the target for Process when you're calling the fit function, as indicated in 中的 Process。我尝试在函数调用之外定义模型,它会初始化模型,但随后训练会无限期挂起。

当我在我的笔记本电脑上 运行 时,tensorboard 需要一点时间才能开始,但通常在训练达到 epoch 70 时 tensorboard 已经启动并继续 运行 直到你杀死用 Ctrl+C.

import os
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from multiprocessing import Process


def startTensorboard(logdir):
    # Start tensorboard with system call
    os.system("tensorboard --logdir {}".format(logdir))


def fitModel():
    # Create your model
    model = Sequential()
    model.add(Dense(32, activation='relu', input_dim=100))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])

    # Some mock training data
    data = np.random.random((1000, 100))
    labels = np.random.randint(2, size=(1000, 1))

    # Run the fit function
    model.fit(data, labels, epochs=100, batch_size=32)


if __name__ == '__main__':
    # Run both processes simultaneously
    Process(target=startTensorboard, args=("logs",)).start()
    Process(target=fitModel).start()