gpt4 book ai didi

python - Tensorflow 队列 - 在训练数据和验证数据之间切换

转载 作者:IT老高 更新时间:2023-10-28 21:11:58 25 4
gpt4 key购买 nike

我正在尝试使用队列从 Tensorflow 中的文件加载数据。

我想在每个 epoch 结束时使用验证数据运行图表,以便更好地了解训练的进展情况。

这就是我遇到问题的地方。我似乎无法弄清楚如何使用队列时在训练数据和验证数据之间进行切换。

我已将我的代码精简为一个最小的玩具示例,以便更容易得到帮助。我没有包含加载图像文件、执行推理和训练的所有代码,而是在文件名加载到队列中的位置。

import tensorflow as tf

# DATA
train_items = ["train_file_{}".format(i) for i in range(6)]
valid_items = ["valid_file_{}".format(i) for i in range(3)]

# SETTINGS
batch_size = 3
batches_per_epoch = 2
epochs = 2

# CREATE GRAPH
graph = tf.Graph()
with graph.as_default():
file_list = tf.placeholder(dtype=tf.string, shape=None)

# Create a queue consisting of the strings in `file_list`
q = tf.train.string_input_producer(train_items, shuffle=False, num_epochs=None)

# Create batch of items.
x = q.dequeue_many(batch_size)

# Inference, train op, and accuracy calculation after this point
# ...


# RUN SESSION
with tf.Session(graph=graph) as sess:
# Initialize variables
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())

# Start populating the queue.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

try:
for epoch in range(epochs):
print("-"*60)
for step in range(batches_per_epoch):
if coord.should_stop():
break
train_batch = sess.run(x, feed_dict={file_list: train_items})
print("TRAIN_BATCH: {}".format(train_batch))

valid_batch = sess.run(x, feed_dict={file_list: valid_items})
print("\nVALID_BATCH : {} \n".format(valid_batch))

except Exception, e:
coord.request_stop(e)
finally:
coord.request_stop()
coord.join(threads)

变化和实验

num_epochs

尝试不同的值

num_epochs=无

如果我将 tf.train.string_input_producer() 中的 num_epochs 参数设置为None 它给出以下输出,这表明它正在按预期运行两个时期,但它正在使用数据运行评估时从训练集中获取。

------------------------------------------------------------
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']

VALID_BATCH : ['train_file_0' 'train_file_1' 'train_file_2']

------------------------------------------------------------
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']

VALID_BATCH : ['train_file_3' 'train_file_4' 'train_file_5']

num_epochs=2

如果我将 tf.train.string_input_producer() 中的 num_epochs 参数设置为 2它给出了以下输出,这表明它甚至根本没有运行完整的两个批处理(并且评估仍在使用训练数据)

------------------------------------------------------------
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']

VALID_BATCH : ['train_file_0' 'train_file_1' 'train_file_2']

------------------------------------------------------------
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']

num_epochs=1

如果我将 tf.train.string_input_producer() 中的 num_epochs 参数设置为 1希望它会被冲走队列中的任何其他训练数据,以便它可以利用验证数据,我得到以下输出,这表明它正在终止它通过了一个时期的训练数据,并且没有通过加载评估数据。

------------------------------------------------------------
TRAIN_BATCH: ['train_file_0' 'train_file_1' 'train_file_2']
TRAIN_BATCH: ['train_file_3' 'train_file_4' 'train_file_5']

capacity 参数设置为各种值

我也试过设置 capacity 参数tf.train.string_input_producer() 到小的值,例如 3 和 1。但是这些对结果没有影响。

我应该采取什么其他方法?

我还可以采取哪些其他方法在训练数据和验证数据之间切换?我必须创建单独的队列吗?我不知道如何做到这一点工作。我是否还必须创建额外的协调器和队列运行器?

最佳答案

我正在编制一份可能解决此问题的潜在方法列表。其中大部分只是模糊的建议,没有实际的代码示例来展示如何使用它们。

默认占位符

建议 here

使用 tf.cond()

建议 here

sygi 在这个 stackoverflow 线程上也提出了建议。 link

使用 tf.group() 和 tf.cond()

建议 here

make_template() 方法

建议 herehere

共享权重法

由 sygi 在这个 stackoverflow 线程 (link) 中建议。这可能与 make_template() 方法相同。

QueueBase() 方法。

建议 here带有示例代码 here在这个线程上适应我的问题的代码。 link

训练桶法

建议 here

关于python - Tensorflow 队列 - 在训练数据和验证数据之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41162955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com