如何在张力板中加载选定范围的试样

2024-04-16 07:55:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个500万样本的张力板日志文件。Tensorboard在加载时对其进行下采样,这样就不会耗尽内存,但是可以用--samples_per_plugin覆盖此行为并加载所有这些行为。如果我这样做的话,我的记性就会耗尽。假设我想先加载1000个样本而不进行下采样(例如,如果我对培训开始时我的网络发生的细节感兴趣)。你知道吗

有没有办法让张力板只加载指定的样本子集?我认为目前还没有命令行参数,但是否有办法编辑日志文件或Tensorboard代码或其他解决方法?你知道吗


Tags: 文件内存命令行网络参数plugin细节感兴趣
1条回答
网友
1楼 · 发布于 2024-04-16 07:55:11

我不认为有任何方法可以让TensorBoard做到这一点,但是可以“切片”事件文件。这些文件原来是记录文件(只包含事件数据而不是示例),因此您可以将它们作为^{}读取。显然,有一个第一个记录指示文件版本号,但除此之外,它应该很简单。假设只有要切片的事件,可以使用这样的函数(tf1.x,尽管在2.x中大致相同):

import tensorflow as tf

def slice_events(input_path, output_path, skip, take):
    with tf.Graph().as_default():
        ds = tf.data.TFRecordDataset([str(input_path)])
        rec_first = ds.take(1).make_one_shot_iterator().get_next()
        ds_data = ds.skip(skip + 1).take(take)
        rec_data = ds_data.batch(1000).make_one_shot_iterator().get_next()
        with tf.io.TFRecordWriter(str(output_path)) as writer, tf.Session() as sess:
            writer.write(sess.run(rec_first))
            while True:
                try:
                    for ev in sess.run(rec_data):
                        writer.write(ev)
                except tf.errors.OutOfRangeError: break

这将从一个现有的事件文件生成一个新的事件文件,其中第一个skip事件被丢弃,之后的take事件被保存。您可以使用其他^{}操作来选择要保留的数据。例如,下采样可按以下方式进行:

ds_data = ds.skip(1).window(1, 5).unbatch()  # Takes one in five events

您可以创建一个脚本,将目录中的所有事件文件切片,然后将它们保存到另一个具有相同结构的文件中,例如:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# slice_events.py

import sys
import os
from pathlib import Path
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'  # Not necessary to use GPU
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'  # Avoid log messages

def slice_events(input_path, output_path, skip, take):
    # Import here to avoid loading on error
    import tensorflow as tf
    # Code from before...

def slice_events_dir(input_dir, output_dir, skip, take):
    input_dir = Path(input_dir)
    output_dir = Path(output_dir)
    output_dir.mkdir(parents=True, exist_ok=True)
    for ev_file in input_dir.glob('**/*.tfevents*'):
        out_file = Path(output_dir, ev_file.relative_to(input_dir))
        out_file.parent.mkdir(parents=True, exist_ok=True)
        slice_events(ev_file, out_file, skip, take)

if __name__ == '__main__':
    if len(sys.argv) != 5:
        print(f'{sys.argv[0]} <input dir> <output dir> <skip> <take>', file=sys.stderr)
        sys.exit(1)
    input_dir, output_dir, skip, take = sys.argv[1:]
    skip = int(skip)
    take = int(take)
    slice_events_dir(input_dir, output_dir, skip, take)

那你就把它当作

$ python slice_events.py log log_sliced 100 1000

请注意,这假设了一个简单的情况,即只有一系列类似的事件要切片。如果您有其他类型的事件(例如,图形本身),或者同一文件中有多种类型的交叉事件,或者其他一些事件,那么您需要根据需要调整逻辑。你知道吗

相关问题 更多 >