TensorFlow: tf.train.batch автоматически загружает следующую партию, когда партия закончила обучение?

Например, после того, как я создал свои операции, передал пакетные данные через операцию и запустил операцию, tf.train.batch автоматически загружает другую партию данных в сеанс?

Я спрашиваю об этом, потому что tf.train.batch имеет атрибут allow_smaller_final_batch, который позволяет загружать финальную партию как размер, меньший, чем указанный размер партии. Означает ли это, что даже без цикла, следующая партия может быть автоматически загружена? Из кодов учебников я довольно смущен. Когда я загружаю одну партию, я получаю буквально единый размер партии [batch_size, height, width, num_channels], но документация говорит об этом Creates batches of tensors in tensors. Кроме того, когда я прочитал код учебника в tf-slim учебном руководстве по прохождению, где есть функция load_batch, есть только 3 тензоры возвращаются: images, images_raw, labels. Где "партии" данных, как описано в документации?

Благодарим вас за помощь.

Ответ 1

... tf.train.batch автоматически передает в другой пакет данных сеанс?

Нет. Ничего не происходит автоматически. Вы должны снова позвонить sess.run(...), чтобы загрузить новую партию.

Означает ли это, что даже без цикла, следующая партия может быть автоматически загружена?

Нет. tf.train.batch(..) всегда будет загружать тензоры batch_size. Если у вас есть, например, 100 изображений и batch_size=30, то у вас будет 3 * 30 партий, так как вы можете вызывать sess.run(batch) три раза, прежде чем очередь ввода начнется с начала (или остановится, если epoch=1). Это означает, что вы пропускаете 100-3*30=10 образцы из тренировки. Если вы не хотите пропустить их, вы можете сделать tf.train.batch(..., allow_smaller_final_batch=True), так что теперь у вас будут 3x 30-выборочные партии и 1x 10-выборочная партия до перезапуска входной очереди.

Позвольте мне также уточнить пример кода:

queue = tf.train.string_input_producer(filenames,
        num_epochs=1) # only iterate through all samples in dataset once

reader = tf.TFRecordReader() # or any reader you need
_, example = reader.read(queue)

image, label = your_conversion_fn(example)

# batch will now load up to 100 image-label-pairs on sess.run(...)
# most tf ops are tuned to work on batches
# this is faster and also gives better result on e.g. gradient calculation
batch = tf.train.batch([image, label], batch_size=100)

with tf.Session() as sess:
    # "boilerplate" code
    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:
        # in most cases coord.should_stop() will return True
        # when there are no more samples to read
        # if num_epochs=0 then it will run for ever
        while not coord.should_stop():
            # will start reading, working data from input queue
            # and "fetch" the results of the computation graph
            # into raw_images and raw_labels
            raw_images, raw_labels = sess.run([images, labels])
    finally:
        coord.request_stop()
        coord.join(threads)

Ответ 2

Вам нужно вызвать 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]