tensorflow笔记 string_input_producer, slice_input_producer

本文解析了TensorFlow中数据读取的两步流程,即文件名队列和内存队列的建立与处理,介绍了三种用于创建文件名队列的函数,并强调了使用tf.data API的现代数据读取方式。

tensorflow将读取数据分为了两个步骤,先读入文件名队列,再读入内存队列进行运算。为了减少GPU的等待时间,提高计算速度,tensorflow使用两个线程来分别处理这两个步骤。tf有三个函数string_input_producer, slice_input_producer, input_producer用于建立文件名队列。

函数参数如下所示,除了tensor list是必须外,其余都可以省略。input_producer输入为一个tensor,每行是一个数据,slice_input_producer输入为一个tensor列表,string_input_producer输入为一个string类型的tensor列表。

tf.train.input_producer(
    input_tensor,
    element_shape=None,
    num_epochs=None, #文件名队列中数据重复n次,保证每个文件都会被访问n次
    shuffle=True,
    seed=None,
    capacity=32,
    shared_name=None,
    summary_name=None,
    name=None,
    cancel_op=None
)

tf.train.string_input_producer(
    string_tensor,
    num_epochs=None,
    shuffle=True,
    seed=None,
    capacity=32,
    shared_name=None,
    name=None,
    cancel_op=None
)

tf.train.slice_input_producer(
    tensor_list,
    num_epochs=None,
    shuffle=True,
    seed=None,
    capacity=32,
    shared_name=None,
    name=None
)

文件名队列并不会直接读入,需要用tf.train.start_queue_runners()启动

threads = tf.train.start_queue_runners(sess,coord)

官方建议:
THIS FUNCTION IS DEPRECATED. It will be removed in a future version. Instructions for updating: Queue-based input pipelines have been replaced by tf.data. Use tf.data.Dataset.from_tensor_slices(input_tensor).shuffle(tf.shape(input_tensor, out_type=tf.int64)[0]).repeat(num_epochs). If shuffle=False, omit the .shuffle(...)

现在一般使用更简洁的data api来读取数据。

### 使用 `StringInputProducer` 创建 TensorFlow 输入管道 在 TensorFlow 中,`string_input_producer` 是一种用于处理字符串队列的工具函数。此函数会创建一个 FIFO 队列来存储文件名列表,并返回该队列的操作句柄[^1]。 具体来说,在构建数据流图时,可以调用 `tf.compat.v1.train.string_input_producer` 函数并传入包含路径名称的 Python 列表作为参数。这将生成一个张量,代表从给定列表中随机抽取的一个文件名。通过设置可选参数如 `num_epochs` 和 `shuffle` 可以控制读取行为[^2]。 下面是一个简单的例子展示如何利用这个组件建立基本的数据输入流程: ```python import tensorflow as tf # 假设我们有一系列文本文件的名字存放在 list_of_files 列表里 list_of_files = ['file1.txt', 'file2.txt'] # 创建 string input producer 来管理这些文件名字 filename_queue = tf.compat.v1.train.string_input_producer(list_of_files, num_epochs=1) # 定义 reader 对象去解析每一个文件的内容 reader = tf.TextLineReader() key, value = reader.read(filename_queue) with tf.Session() as sess: # 初始化全局变量和本地变量(对于 epoch 计数器) sess.run([tf.global_variables_initializer(), tf.local_variables_initializer()]) try: while True: k, v = sess.run([key, value]) print(f'Key: {k.decode()} Value: {v.decode()}') except tf.errors.OutOfRangeError: pass ``` 上述代码片段展示了怎样使用 `string_input_producer` 构建起始阶段的输入管线,之后可以通过 Reader 类进一步加工获取到的实际记录项[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值