在TensorFlow 2.0中修改TensorBoard

我正在关注Sentdex's DQN tutorial。我陷入尝试在TF 2.0中重写自定义TensorBoard的问题。重点是向文件添加** stats,例如:{'reward_avg': -99.0,'reward_min': -200,'reward_max': 2,'epsilon': 1} 原始代码:

class ModifiedTensorBoard(TensorBoard):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.step = 1
        self.writer = tf.summary.FileWriter(self.log_dir)

    # Custom method for saving own metrics
    # Creates writer,writes custom metrics and closes writer
    def update_stats(self,**stats):
        self._write_logs(stats,self.step)

我的尝试

def update_stats(self,**stats):
    for name,value in stats.items():
        with self.writer.as_default():
            tf.summary.scalar(name,value,self.step)

这样,我会得到:TypeError: unsupported operand type(s) for +: 'ModifiedTensorBoard' and 'list'

alex_mao 回答:在TensorFlow 2.0中修改TensorBoard

我遵循了相同的教程,这是我为使其工作而做的事情:

这是ModifiedTensorBoard类:

class ModifiedTensorBoard(TensorBoard):

    # Overriding init to set initial step and writer (we want one log file for all .fit() calls)
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.step = 1
        self.writer = tf.summary.create_file_writer(self.log_dir)
        self._log_write_dir = os.path.join(self.log_dir,MODEL_NAME)

    # Overriding this method to stop creating default log writer
    def set_model(self,model):
        pass

    # Overrided,saves logs with our step number
    # (otherwise every .fit() will start writing from 0th step)
    def on_epoch_end(self,epoch,logs=None):
        self.update_stats(**logs)

    # Overrided
    # We train for one batch only,no need to save anything at epoch end
    def on_batch_end(self,batch,logs=None):
        pass

    # Overrided,so won't close writer
    def on_train_end(self,_):
        pass

    def on_train_batch_end(self,logs=None):
        pass

    # Custom method for saving own metrics
    # Creates writer,writes custom metrics and closes writer
    def update_stats(self,**stats):
        self._write_logs(stats,self.step)

    def _write_logs(self,logs,index):
        with self.writer.as_default():
            for name,value in logs.items():
                tf.summary.scalar(name,value,step=index)
                self.step += 1
                self.writer.flush()
,

以下代码适用于 TensorFlow 2.4.1 :

class ModifiedTensorBoard(TensorBoard):     
                                        
def __init__(self,**kwargs):
    super().__init__(**kwargs)
    self.step = 1
    self.writer = tf.summary.create_file_writer(self.log_dir)
    self._log_write_dir = self.log_dir

def set_model(self,model):
    self.model = model

    self._train_dir = os.path.join(self._log_write_dir,'train')
    self._train_step = self.model._train_counter

    self._val_dir = os.path.join(self._log_write_dir,'validation')
    self._val_step = self.model._test_counter

    self._should_write_train_graph = False

def on_epoch_end(self,logs=None):
    self.update_stats(**logs)

def on_batch_end(self,logs=None):
    pass

def on_train_end(self,_):
    pass

def update_stats(self,**stats):
    with self.writer.as_default():
        for key,value in stats.items():
            tf.summary.scalar(key,step = self.step)
            self.writer.flush()

只需按原样复制并粘贴上面的代码,它应该可以工作

本文链接:https://www.f2er.com/3159584.html

大家都在问