Tensorflow keras tensorboard:在同一个图中绘制序列和验证标量

Tensorflow keras tensorboard:在同一个图中绘制序列和验证标量,tensorflow,neural-network,keras,tensorboard,Tensorflow,Neural Network,Keras,Tensorboard,所以我在keras内使用张力板。在tensorflow中,可以使用两个不同的摘要编写器来编写训练和验证标量,这样tensorboard就可以将它们绘制在同一个图形中 在keras有没有办法做到这一点 谢谢 要使用单独的编写器处理验证日志,您可以编写一个自定义回调,该回调围绕原始的TensorBoard方法 导入操作系统 导入tensorflow作为tf 从keras.callbacks导入TensorBoard 列车级张力板(张力板): def uuu init uuuu(self,log_d

所以我在keras内使用张力板。在tensorflow中,可以使用两个不同的摘要编写器来编写训练和验证标量,这样tensorboard就可以将它们绘制在同一个图形中

在keras有没有办法做到这一点


谢谢

要使用单独的编写器处理验证日志,您可以编写一个自定义回调,该回调围绕原始的
TensorBoard
方法

导入操作系统
导入tensorflow作为tf
从keras.callbacks导入TensorBoard
列车级张力板(张力板):
def uuu init uuuu(self,log_dir='./logs',**kwargs):
#将原始“TensorBoard”记录到“training”子目录中
training\u log\u dir=os.path.join(log\u dir,‘training’)
超级(TrainValTensorBoard,self)。\uuuuu初始(training\u log\u dir,**kwargs)
#将验证指标记录到单独的子目录中
self.val\u log\u dir=os.path.join(log\u dir,‘验证’)
def set_型号(自身,型号):
#验证指标的设置编写器
self.val\u writer=tf.summary.FileWriter(self.val\u log\u dir)
super(TrainValTensorBoard,self).集_模型(模型)
def on_epoch_end(self、epoch、logs=None):
#弹出验证日志,并使用
#“self.val\u writer”。还要重命名键,以便它们可以
#与培训指标绘制在同一图上
日志=日志或{}
val_logs={k.replace('val_',''):v代表k,v在logs.items()中,如果k.startswith('val_')}
对于名称,val_logs.items()中的值:
summary=tf.summary()
summary\u value=summary.value.add()
summary\u value.simple\u value=value.item()
summary_value.tag=名称
self.val\u writer.add\u摘要(摘要,纪元)
self.val_writer.flush()
#将剩余的圆木传递到“TensorBoard.on”端`
logs={k:v代表k,logs.items()中的v如果不是k.startswith('val')}
超级(TrainValTensorBoard,self)。在“纪元”端(纪元,日志)
列车端def(自身,日志=无):
超级(火车车厢板,自我)。火车车厢端(原木)
self.val_writer.close()
  • \uuuu init\uuuu
    中,为培训和验证日志设置了两个子目录
  • set\u model
    中,为验证日志创建一个writer
    self.val\u writer
  • 在_epoch_end上的
    中,验证日志与培训日志分离,并通过
    self.val_writer
以MNIST数据集为例:

从keras.models导入
从keras.layers导入稠密
从keras.dataset导入mnist
(x_列,y_列),(x_测试,y_测试)=列表负载数据()
x_列=x_列。重塑(60000784)
x_测试=x_测试。重塑(10000,784)
x_-train=x_-train.astype('float32')
x_test=x_test.astype('float32')
x_列/=255
x_检验/=255
模型=顺序()
添加(密集(64,激活=relu',输入形状=(784,))
model.add(密集型(10,activation='softmax'))
compile(loss='sparse'\u categorical'\u crossentropy',optimizer='adam',metrics=['accurity'])
模型拟合(x_序列,y_序列,历次=10,
验证数据=(x检验,y检验),
回调=[TrainValTensorBoard(write_graph=False)])
然后可以在TensorBoard中将同一图形上的两条曲线可视化


EDIT:我对该类做了一些修改,以便它可以用于急切执行

最大的变化是我在下面的代码中使用了
tf.keras
。独立Keras中的
TensorBoard
回调似乎还不支持急切模式

导入操作系统
导入tensorflow作为tf
从tensorflow.keras.callbacks导入TensorBoard
从tensorflow.python.eager导入上下文
列车级张力板(张力板):
def uuu init uuuu(self,log_dir='./logs',**kwargs):
self.val\u log\u dir=os.path.join(log\u dir,‘验证’)
training\u log\u dir=os.path.join(log\u dir,‘training’)
超级(TrainValTensorBoard,self)。\uuuuu初始(training\u log\u dir,**kwargs)
def set_型号(自身,型号):
if context.executing_急切地()
self.val\u writer=tf.contrib.summary.create\u file\u writer(self.val\u log\u dir)
其他:
self.val\u writer=tf.summary.FileWriter(self.val\u log\u dir)
super(TrainValTensorBoard,self).集_模型(模型)
定义、编写、自定义摘要(自我、步骤、日志=无):
日志=日志或{}
val_logs={k.replace('val_',''):v表示k,v表示logs.items()中的v,如果k}中的'val_'
if context.executing_急切地()
使用self.val_writer.as_default()、tf.contrib.summary.always_record_summaries():
对于名称,val_logs.items()中的值:
tf.contrib.summary.scalar(名称,值.item(),步骤=步骤)
其他:
对于名称,val_logs.items()中的值:
summary=tf.summary()
summary\u value=summary.value.add()
summary\u value.simple\u value=value.item()
summary_value.tag=名称
self.val\u writer.add\u摘要(摘要,步骤)
self.val_writer.flush()
logs={k:v代表k,logs.items()中的v如果不是k}
超级(TrainValTensorBoard,self)。\编写\自定义\总结(步骤、日志)
列车端def(自身,日志=无):
超级(火车车厢板,自我)。火车车厢端(原木)
self.val_writer.close()
想法是一样的--

  • 检查
    TensorBoard
    回调的源代码
  • 看看它如何设置编写器
  • 在这个自定义回调中执行相同的操作
同样,您可以使用MNIST数据对其进行测试

从tensorflow.keras.datasets导入mnist
从tensorflow.keras.models导入顺序
从tensorflow.keras.layers导入稠密
从tensorflow.train导入AdamOptimizer