Machine learning TensorFlow:tf.train.batch是否在批次完成培训后自动加载下一批次?

Machine learning TensorFlow:tf.train.batch是否在批次完成培训后自动加载下一批次?,machine-learning,tensorflow,computer-vision,deep-learning,tf-slim,Machine Learning,Tensorflow,Computer Vision,Deep Learning,Tf Slim,例如,在我创建了我的操作之后,通过该操作输入批数据并运行该操作,tf.train.batch是否会自动向会话输入另一批数据 我这样问是因为tf.train.batch有一个属性allow_minger_final_batch,这使得最终批次可以作为小于指定批次大小的大小加载。这是否意味着即使没有循环,下一批也可以自动进料?从教程代码来看,我相当困惑。当我加载一个批次时,我实际上得到了一个批次大小的形状[batch\u size,height,width,num\u channels],但是说它以

例如,在我创建了我的操作之后,通过该操作输入批数据并运行该操作,tf.train.batch是否会自动向会话输入另一批数据

我这样问是因为tf.train.batch有一个属性
allow_minger_final_batch
,这使得最终批次可以作为小于指定批次大小的大小加载。这是否意味着即使没有循环,下一批也可以自动进料?从教程代码来看,我相当困惑。当我加载一个批次时,我实际上得到了一个批次大小的形状[batch\u size,height,width,num\u channels],但是说它
以张量创建了一批张量。
另外,当我在中阅读教程代码时,其中有一个名为load\u batch的函数,只返回了3个张量:
images,images\u raw,标签
。文档中解释的“批次”数据在哪里

谢谢你的帮助

。。。tf.train.batch是否会自动向会话提供另一批数据

不,没有什么是自动发生的。必须再次调用sess.run(…)以加载新批

这是否意味着即使没有循环,下一批也可以自动进料

编号
tf.train.batch(..)
将始终加载
batch\u大小
张量。例如,如果您有100个图像和一个
batch\u size=30
,那么您将有3*30个批,就像您可以调用
sess一样。在输入队列从一开始就开始之前运行(batch)
三次(如果
epoch=1
则停止)。这意味着您错过了培训中的
100-3*30=10
样本。如果您不想错过它们,您可以执行
tf.train.batch(…,allow_minger_final_batch=True)
这样,在输入队列重新启动之前,您将有3个30个样本批次和1个10个样本批次

让我用一个代码示例来详细说明:

queue=tf.train.string\u input\u producer(文件名,
num_epochs=1)#仅对数据集中的所有样本迭代一次
reader=tf.TFRecordReader()#或您需要的任何读取器
_,示例=reader.read(队列)
图像,标签=您的转换(示例)
#批处理现在将在sess上加载多达100个图像标签对。运行(…)
#大多数tf ops都经过调整,可以批量工作
#这会更快,并且在梯度计算等方面也会提供更好的结果
批次=tf.train.batch([图像,标签],批次尺寸=100)
使用tf.Session()作为sess:
#“样板”代码
赛斯·朗([
tf.local_variables_initializer(),
tf.global_variables_initializer(),
])
coord=tf.train.Coordinator()
线程=tf.train.start\u queue\u runner(sess=sess,coord=coord)
尝试:
#在大多数情况下,coord.should_stop()将返回True
#当没有更多样本可读取时
#如果num_epochs=0,那么它将永远运行
当不协调时,是否应停止()
#将开始从输入队列读取工作数据
#和“获取”计算图的结果
#转换为原始图像和原始标签
原始图像,原始标签=sess.run([图像,标签])
最后:
协调请求停止()
坐标连接(线程)

每次要加载下一批时,都需要调用sess.run并将批传递给它。请参阅下面的代码

img = [0,1,2,3,4,5,6,7,8]
lbl = [0,1,2,3,4,5,6,7,8]
images = tf.convert_to_tensor(img)
labels = tf.convert_to_tensor(lbl)
input_queue = tf.train.slice_input_producer([images,labels])
sliced_img = input_queue[0]
sliced_lbl = input_queue[1]

img_batch, lbl_batch = tf.train.batch([sliced_img,sliced_lbl], batch_size=3)
with tf.Session() as sess:
    coord   = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)

    for i in range(0,3): #batch size
        image_batch,label_batch = sess.run([img_batch,lbl_batch ])
        print(image_batch, label_batch)

    coord.request_stop()
    coord.join(threads)
答案是这样的:

[4,1,8][4,1,8]

[2,3,7][2,3,7]


[2,6,8][2,6,8]

我在上面的帖子中修改了代码,博多凯瑟在上面的帖子中给出了答案。请注意,这是来自eval_image_classifier.py上的评估纸条。对eval_image_classifier.py代码最重要的修改是将num_epochs=1添加到DatasetDataProvider行。这样,所有图像都将被访问一次以进行推断

provider = slim.dataset_data_provider.DatasetDataProvider(
    dataset,
    shuffle=False,
    common_queue_capacity=2 * FLAGS.batch_size,
    common_queue_min=FLAGS.batch_size, num_epochs=1)
[image, label] = provider.get(['image', 'label'])
images, labels = tf.train.batch(
    [image, label],
    batch_size=FLAGS.batch_size,
    num_threads=FLAGS.num_preprocessing_threads,
    capacity=1 * FLAGS.batch_size)
with tf.Session() as sess:
     sess.run([tf.local_variables_initializer(),
               tf.global_variables_initializer(),])
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)
    try:
        while not coord.should_stop():
            np_image, np_label = sess.run([images, labels])
    except:
        coord.request_stop()
        coord.join(threads)

谢谢你的回答。我可以知道是否需要for循环来继续加载下一批吗?如果培训数据集中只有100个示例,您当前是否将100个示例加载到一个批次中?从我在TF中看到的大多数实现来看,似乎有一个循环,但我的没有,所以我对此不确定。此外,对于boiler plate代码下面的代码,我使用了tf slim的slim.learning.train,我认为除了所采取的训练步骤数之外,它没有循环。是的,如果训练数据集中只有100个示例,那么我的示例中只会有一批。我不能推荐
tf.contrib.slim
,因为它只有很少的文档,而且维护得不是很好。还不清楚他们是否会继续开发。如果数据集中有100多个示例,您建议我如何加载下一批?如果我只是通过for循环再次调用tf.train.batch,它会调用相同的示例吗?就像在我的代码示例中通过
而不是coord.shop()
。说
batch\u image,batch\u label=tf.train.batch([image,label],batch\u size=100)
和在tf.Session()内部有意义吗,通过
raw\u images,raw\u labels=sess.运行([batch\u image,batch\u label])
以充分利用批处理?在当前代码中,似乎我们仍然一次只拉一个实例,因为我们没有在批处理上运行,对吗?