в документе CycleGAN упоминается пул истории для дискриминатора. Таким образом, мы сохраняем последнее, например. 50 выборок из генератора и подать их на дискриминатор. Без истории это довольно просто, мы можем использовать tf.data.Dataset
и итераторы для подключения данных к сети. А вот с пулом истории я так и не понял как пользоваться tf.data.Dataset
API. Код внутри тренировочного цикла выглядит примерно так
fx, fy = sess.run(model_ops['fakes'], feed_dict={
self.cur_x: cur_x,
self.cur_y: cur_y,
})
cur_x, cur_y = sess.run([self.X_feed.feed(), self.Y_feed.feed()])
feeder_dict = {
self.cur_x: cur_x,
self.cur_y: cur_y,
self.prev_fake_x: x_pool.query(fx, step),
self.prev_fake_y: y_pool.query(fy, step),
}
# self.cur_x, self.cur_y, self.prev_fake_x, self.prev_fake_y are just placeholders
# x_pool and y_pool are simple wrappers for random sampling from the history pool and saving new images to the pool
for _ in range(dis_train):
sess.run(model_ops['train']['dis'], feed_dict=feeder_dict)
for _ in range(gen_train):
sess.run(model_ops['train']['gen'], feed_dict=feeder_dict)
Что меня беспокоит в коде, так это его неэффективность, например. нет возможности предварительно загрузить следующий пакет во время обучения, как с предварительной выборкой tf.data
API, но я не вижу никакого способа использовать tf.data
API. Предлагает ли он какой-то пул истории, который я мог бы использовать с предварительной выборкой и общей оптимизацией модели загрузки данных? Кроме того, аналогичная проблема возникает, когда у меня есть некоторое соотношение между операциями обучения дискриминаторов и операциями обучения генераторов. Если я хочу, например, запустить 2 шага операции обучения генераторов на 1 шаг дискриминаторов, можно ли это сделать, используя одни и те же данные? Потому что с tf.data
API новая выборка извлекается из итератора каждый раз, когда вызывается sess.run.
Есть ли способ реализовать это правильно и эффективно?