Запускать модели.fit () и TensorBoard одновременно? - PullRequest
2 голосов
/ 23 декабря 2019

У меня есть интересный (для меня) вопрос о одновременном запуске model.fit () и тензорной доски.

Я провёл в интернете исследование о «Threading», «Processing», «Multi-processing», попробовал примеры, но не смог решить мою проблему.

Я хочу запустить TensorBoard и модель.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 работает, но model.fit () не работает.

1 Ответ

1 голос
/ 25 декабря 2019

Ниже приведен рабочий пример, который, я думаю, делает то, что вы хотите. Я использую Process из многопроцессорного модуля . Обратите внимание, что представляется важным, чтобы модель определялась внутри функции, которую вы задали как target для Process при вызове функции fit, как указано в в этом посте . Я попытался определить модель вне вызова функции, и она инициализировала бы модель, но затем обучение просто зависало на неопределенное время.

Когда я запускаю это на своем ноутбуке, тензорная доска требует немного времени для начала, но обычнок тому времени, когда тренировочные хиты начнутся, тенорборд эпохи 70 запустится и будет работать до тех пор, пока вы не убьете его 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()
...