Ответ 1
Функция tf.train.shuffle_batch()
использует tf.RandomShuffleQueue
, чтобы накапливать партии элементов batch_size
, которые выборочно выбираются случайным образом из элементов, находящихся в настоящее время в очереди.
Многие алгоритмы обучения, такие как алгоритмы стохастического градиентного спуска, основанные на использовании TensorFlow для оптимизации нейронных сетей, полагаются на выборку записей равномерно случайным образом из всего набора тренировок. Тем не менее, не всегда удобно загружать весь набор тренировок в память (для того, чтобы пробовать от него), поэтому tf.train.shuffle_batch()
предлагает компромисс: он заполняет внутренний буфер с помощью элементов min_after_dequeue
и capacity
, а образцы равномерно случайным образом из этого буфера. Для многих процессов обучения это повышает точность модели и обеспечивает адекватную рандомизацию.
Аргументы min_after_dequeue
и capacity
оказывают косвенное влияние на производительность обучения. Установка большого значения min_after_dequeue
приведет к задержке начала обучения, так как TensorFlow должен обработать, по крайней мере, столько элементов до начала обучения. capacity
представляет собой верхнюю границу объема памяти, которую потребляет входной конвейер: установка этого слишком большого может привести к тому, что процесс обучения закончится из памяти (и, возможно, начнется свопинг, что ухудшит пропускную способность обучения).
Если набор данных имеет только 200 изображений, можно будет легко загрузить весь набор данных в память. tf.train.shuffle_batch()
будет довольно неэффективным, так как он помещает каждое изображение и помещает его несколько раз в tf.RandomShuffleQueue
. В этом случае вы можете найти более эффективным сделать следующее, используя tf.train.slice_input_producer()
и tf.train.batch()
:
random_image, random_label = tf.train.slice_input_producer([all_images, all_labels],
shuffle=True)
image_batch, label_batch = tf.train.batch([random_image, random_label],
batch_size=32)