Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编辑现有的Tensorboard训练损失摘要?_Python_Tensorflow_Machine Learning_Edit_Tensorboard - Fatal编程技术网

Python 如何编辑现有的Tensorboard训练损失摘要?

Python 如何编辑现有的Tensorboard训练损失摘要?,python,tensorflow,machine-learning,edit,tensorboard,Python,Tensorflow,Machine Learning,Edit,Tensorboard,我已经培训了我的网络,并生成了一些培训/验证损失,我通过以下代码示例保存了这些损失(仅培训损失示例,验证完全等效): 训练结束后,我想用张力板查看损耗曲线。但是,由于我将损失曲线保存在“Training loss”和“Validation loss”的名称下,因此这些曲线绘制在单独的图形上。我知道我应该将名称更改为“loss”,以解决这个问题,以便将来写入日志目录。但是,我如何编辑培训/验证损失的现有日志文件来说明这一点 我试图修改以下帖子的解决方案:编辑日志文件的步骤并重新写入文件;其中我的版

我已经培训了我的网络,并生成了一些培训/验证损失,我通过以下代码示例保存了这些损失(仅培训损失示例,验证完全等效):

训练结束后,我想用张力板查看损耗曲线。但是,由于我将损失曲线保存在“Training loss”和“Validation loss”的名称下,因此这些曲线绘制在单独的图形上。我知道我应该将名称更改为“loss”,以解决这个问题,以便将来写入日志目录。但是,我如何编辑培训/验证损失的现有日志文件来说明这一点

我试图修改以下帖子的解决方案:编辑日志文件的步骤并重新写入文件;其中我的版本涉及更改文件中的标记。但我在这方面没有成功。它还需要通过“tf.compat.v1”导入旧的Tensorflow代码。有没有办法做到这一点(也许在TF2.X中)

我原以为只需从包含丢失的每个日志目录中获取丢失值和步骤值,并通过以前的工作方法将它们写入新的日志文件,但我只获得了步骤,而没有获得丢失值本身。这里有人成功过吗

---==编辑===---

我使用@jhedesa中的代码解决了这个问题

我不得不稍微改变函数“rename_events_dir”的调用方式,因为我正在Google Colab笔记本中协作使用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')
注意,我调用了“rename\u events\u dir”两次,一次用于编辑培训损失的标记,一次用于验证损失的标记。我可以使用前面调用代码的方法,通过设置“old_tags='Training Loss;Validation Loss'”并使用“old_tags=old_tags.split(';')”来拆分标记。我使用我的方法只是为了理解代码以及它是如何处理数据的。

如中所述,TensorBoard事件实际上是存储在记录文件中的,因此您可以读取它们并进行处理。这里有一个脚本,与发布在那里的脚本类似,但用于重命名事件,并更新为在TF2.x中工作

#/usr/bin/env蟒蛇3
#-*-编码:utf-8-*-
#重命名_events.py
导入系统
从pathlib导入路径
导入操作系统
#如果要避免使用GPU,请使用此选项
os.environ['CUDA_VISIBLE_DEVICES']='-1'
导入tensorflow作为tf
从tensorflow.core.util.event_pb2导入事件
def rename_事件(输入_路径、输出_路径、旧_标记、新_标记):
#成为一名唱片作家
使用tf.io.TFRecordWriter(str(输出路径))作为写入程序:
#迭代事件记录
对于tf.data.TFRecordDataset([str(输入路径)])中的记录:
#读取事件
ev=事件()
ev.MergeFromString(rec.numpy())
#检查它是否是摘要
如果是ev,总结:
#迭代摘要值
对于ev.summary.value中的v:
#检查是否应重命名标记
如果v.tag位于旧标签中:
#使用新标记名重命名
v、 标签=新标签
writer.write(ev.SerializeToString())
def重命名事件目录(输入目录、输出目录、旧标签、新标签):
输入目录=路径(输入目录)
输出目录=路径(输出目录)
#生成输出目录
输出\u dir.mkdir(父项=True,存在\u确定=True)
#迭代事件文件
对于input_dir.glob('***.tfevents*')中的ev_文件:
#生成输出事件文件的目录
out\u file=Path(输出目录,ev\u file.relative\u to(输入目录))
out\u file.parent.mkdir(parents=True,exist\u ok=True)
#写入重命名的事件
重命名事件(ev_文件、out_文件、旧_标记、新_标记)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
如果len(sys.argv)!=5:
打印(f'{sys.argv[0]}',
文件=sys.stderr)
系统出口(1)
输入目录、输出目录、旧标签、新标签=sys.argv[1:]
old_tags=old_tags.split(“;”)
重命名事件目录(输入目录、输出目录、旧标签、新标签)
打印(‘完成’)
您可以这样使用它:

>python rename_events.py my_log_dir重命名为_log_dir“培训丢失;验证丢失”丢失

谢谢你的建议。它主要是为了解决我的问题,但是我不得不将行“writer.write(ev.SerializeToString())”缩进到第一个if语句的同一级别,因为它只是为我的大多数日志将最后一个“ev”条目写入文件。此外,在Tensorboard中显示训练/验证丢失曲线时,它确实给了我一些问题。当它在不同日期的开始/结束时间将曲线连接在一起时,我认为它还试图根据我训练网络的时间和时间显示x轴。我将发布一些imgur链接供参考。你有什么建议吗?@AlexP你是对的,那一行的缩进是错误的,谢谢你指出这一点。避免曲线,我在过去看到过。。。您是否在
train
Validation
目录中都写了“培训损失”和“验证损失”摘要(而不是仅在
train
中写“培训损失”和仅在
Validation
中写“验证损失”)?我想不会,但这可以解释为什么TensorBoard在重命名后会被弄糊涂……我以前用以下方式保存每个日志文件:“main_logdir/date/train”,所以如果我运行培训课程5次,就会有5个“date”文件夹(后来我更改了它,因为如果我只想将所有曲线显示为一条曲线,它就不是一个很好的存储结构)。我还设法解决了其他曲线/奇怪线条的问题;在我发布本文之前,我正在测试在当前文件结构中存储新创建的日志,但我忘记清除一个旧的tfevents文件,因此删除该文件修复了该问题。再次感谢您的帮助,您为我节省了大量时间!
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')