Ответ 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)