我有一个有趣的(对我来说)关于同时运行model.fit()和tensorboard的问题。
[我在Internet上对“线程”,“处理”,“多处理”进行了一些研究,尝试了示例,但无法解决我的问题。
我想像同时运行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正在运行,但model.fit()无法正常工作。
以下是我认为可以满足您需要的工作示例。我正在使用Process
模块中的multiprocessing。请注意,在调用target
函数时,在为Process
设置为fit
的函数中定义模型似乎很重要,如this post所示。我尝试在函数调用之外定义模型,它将初始化模型,但随后训练将无限期地挂起。
[当我在笔记本电脑上运行此程序时,张量板需要一点时间才能开始,但通常在培训开始时会启动epoch 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()