我已经训练了我的网络并产生了一些训练/验证损失,这些损失通过下面的代码示例保存(仅训练损失示例,验证完全等效):
valid_summary_writer = tf.summary.create_file_writer("/path/to/logs/")
with train_summary_writer.as_default():
tf.summary.scalar('Training Loss', data=epoch_loss, step=current_step)
训练后,我想使用Tensorboard查看损耗曲线。但是,由于我将损耗曲线保存为“ Training Loss”和“ Validation Loss”,因此这些曲线分别绘制在单独的图形上。我知道我应该将名称更改为简单的“丢失”以解决此问题,以备将来写入日志目录时使用。但是,如何针对培训/验证损失来编辑现有日志文件以解决此问题?
我试图修改以下帖子的解决方案:https : //stackoverflow.com/a/55061404,它可以编辑日志文件的步骤并重新写入文件;我的版本涉及更改文件中的标记。但是我在这方面没有成功。它还需要通过'tf.compat.v1'导入较旧的Tensorflow代码。有没有办法做到这一点(也许在TF 2.X中)?
我曾想过简单地从每个包含损耗的日志目录中获取损耗和步长值,然后通过以前的工作方法将它们写入新的日志文件中,但是我只能设法获取步长,而不是损耗值本身。有人在这里有成功吗?
--- ===编辑=== ---
我设法使用@jhedesa中的代码解决了问题
我必须稍微改变函数“ rename_events_dir”的调用方式,因为我是在Google Colab Notebook中协同使用Tensorflow的。为此,我更改了代码的最后部分:
if __name__ == '__main__':
if len(sys.argv) != 5:
print(f'{sys.argv[0]} <input dir> <output dir> <old tags> <new tag>',
file=sys.stderr)
sys.exit(1)
input_dir, output_dir, old_tags, new_tag = sys.argv[1:]
old_tags = old_tags.split(';')
rename_events_dir(input_dir, output_dir, old_tags, new_tag)
print('Done')
要阅读此内容:
rootpath = '/path/to/model/'
dirlist = [dirname for dirname in os.listdir(rootpath) if dirname not in ['train', 'valid']]
for dirname in dirlist:
rename_events_dir(rootpath + dirname + '/train', rootpath + '/train', 'Training Loss', 'loss')
rename_events_dir(rootpath + dirname + '/valid', rootpath + '/valid', 'Validation Loss', 'loss')
请注意,我两次调用了“ rename_events_dir”,一次用于编辑训练损失的标签,一次用于验证损失的标签。我可以通过设置“ old_tags ='Training Loss; Validation Loss'”并使用“ old_tags = old_tags.split(';')”来拆分标签来使用以前的代码调用方法。我使用我的方法只是为了了解代码及其如何处理数据。
如如何在Tensorboard中加载选定范围的样本中所述,TensorBoard事件实际上是存储的记录文件,因此您可以读取它们并对其进行处理。这是一个与此处发布的脚本类似的脚本,但用于重命名事件,并已更新为可在TF 2.x中使用。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# rename_events.py
import sys
from pathlib import Path
import os
# Use this if you want to avoid using the GPU
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
import tensorflow as tf
from tensorflow.core.util.event_pb2 import Event
def rename_events(input_path, output_path, old_tags, new_tag):
# Make a record writer
with tf.io.TFRecordWriter(str(output_path)) as writer:
# Iterate event records
for rec in tf.data.TFRecordDataset([str(input_path)]):
# Read event
ev = Event()
ev.MergeFromString(rec.numpy())
# Check if it is a summary
if ev.summary:
# Iterate summary values
for v in ev.summary.value:
# Check if the tag should be renamed
if v.tag in old_tags:
# Rename with new tag name
v.tag = new_tag
writer.write(ev.SerializeToString())
def rename_events_dir(input_dir, output_dir, old_tags, new_tag):
input_dir = Path(input_dir)
output_dir = Path(output_dir)
# Make output directory
output_dir.mkdir(parents=True, exist_ok=True)
# Iterate event files
for ev_file in input_dir.glob('**/*.tfevents*'):
# Make directory for output event file
out_file = Path(output_dir, ev_file.relative_to(input_dir))
out_file.parent.mkdir(parents=True, exist_ok=True)
# Write renamed events
rename_events(ev_file, out_file, old_tags, new_tag)
if __name__ == '__main__':
if len(sys.argv) != 5:
print(f'{sys.argv[0]} <input dir> <output dir> <old tags> <new tag>',
file=sys.stderr)
sys.exit(1)
input_dir, output_dir, old_tags, new_tag = sys.argv[1:]
old_tags = old_tags.split(';')
rename_events_dir(input_dir, output_dir, old_tags, new_tag)
print('Done')
您可以这样使用它:
> python rename_events.py my_log_dir renamed_log_dir "Training Loss;Validation Loss" loss
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句