Python Tensorflow批量连接&x27;s允许较小的最终批次不';不行?

Python Tensorflow批量连接&x27;s允许较小的最终批次不';不行?,python,tensorflow,Python,Tensorflow,我正在使用tenosrlfow队列来处理我的数据,我需要得到大小小于批量大小的最终批次,但我只能得到5个批量,无法得到最终批次。我不明白那有什么问题 data = np.arange(105) data_placeholder = tf.placeholder(dtype=tf.int64, shape=[None,]) queue = tf.FIFOQueue(capacity=200,dtypes=tf.int64,shapes=()) enqueue_op = queue.enqueue

我正在使用tenosrlfow队列来处理我的数据,我需要得到大小小于批量大小的最终批次,但我只能得到5个批量,无法得到最终批次。我不明白那有什么问题

data = np.arange(105)
data_placeholder = tf.placeholder(dtype=tf.int64, shape=[None,])

queue = tf.FIFOQueue(capacity=200,dtypes=tf.int64,shapes=())
enqueue_op = queue.enqueue_many([data_placeholder])

data_list = []
data_ = queue.dequeue()

data_list.append([data_])
batch_data = tf.train.batch_join(data_list,batch_size=20, capacity=100 ,allow_smaller_final_batch=True)

sess = tf.Session()

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

step = 0
under = 0
uper = 0
enqueu_step = len(data)//20 + 1
while step < enqueu_step:
    uper = uper + 20
    sess.run(enqueue_op, feed_dict={data_placeholder:data[under:uper]})
    print("enque step=%d/%d %d-%d" %(step, enqueu_step,under, uper))
    step = step + 1
    under = uper
i = 0
while i < enqueu_step:
    _data = sess.run(batch_data)
    print("setp=%d/%d shape=%s" % (i, enqueu_step,_data.shape))

    i = i + 1
print("end")
data=np.arange(105)
数据\u占位符=tf.placeholder(dtype=tf.int64,shape=[None,])
队列=tf.FIFOQueue(容量=200,数据类型=tf.int64,形状=())
enqueue\u op=queue.enqueue\u many([数据占位符])
数据列表=[]
数据=队列。出列()
数据\u列表。追加([data\u])
批次数据=tf.train.batch\U join(数据列表,批次大小=20,容量=100,允许更小的批次,最终批次=True)
sess=tf.Session()
coord=tf.train.Coordinator()
训练开始、排队、跑步者(sess、coord)
步长=0
低于=0
uper=0
enqueu_step=len(数据)//20+1
当步骤
我没有检查您的全部代码,但如果我没有弄错,您希望获得所有样本,即使最后一批样本比其他样本小,对吗

我们使用8个样品和3个批次的玩具示例:

import tensorflow as tf
import numpy as np

num_samples = 8
batch_size = 3
capacity = num_samples % batch_size # set the capacity to the actual remaining samples
data = np.arange(1, num_samples+1)
data_input = tf.constant(data)

batch = tf.train.batch([data_input], enqueue_many=True, batch_size=batch_size, capacity=capacity, allow_smaller_final_batch=True)

with tf.Session() as sess:
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    for i in range(2):
        print(i, sess.run([batch]))
    coord.request_stop()
    coord.join(threads)
    # this should follow a closed queue
    print(i+1, sess.run([batch]))
结果:

0[数组([1,2,3])]

1[数组([4,5,6])]

2[数组([7,8])]

<> P>这里的重要参数是代码> EnQueLe>许多< /代码>,以便考虑每个数字是单独的一个和<代码>容量<代码>,它被设置为实际剩余样本(例如,这里是2)。如果
capacity
设置为1,则只会得到1个
样本,如果是3个,则会错过
allow_minger_final_batch`标志效果,因为它将返回3个样本(从开始算起的最后一个样本)


希望这澄清了您应该使用
allow\u minger\u final\u batch
参数的方式。

奇怪的是:使用这种方法,我的最后一批(部分)样品无法交付所有预期的样品。看起来
request\u stop()
发生得太早了。是否有办法将此延迟到所有样本处理完毕?看见