API Tensorflow Dataset удваивает размер файла
Описание: Использование нового tf.contrib.data.Dataset удваивает размер моего файла Protobuff графика, и я не могу визуализировать график в Tensorboard.
Детали:
Я пробую новый TensorFlow tf.contrib.data.Dataset
функциональность вместе с tf.contrib.learn.Experiment
фреймворк. Мои входные данные определяются как входные функции, которые возвращают тензоры функций и меток.
Если я создаю свою функцию ввода с tf.train.slice_input_producer
функция, как в следующем кодовом блоке (полный код здесь), то мой результат graph.pbtxt
файл 620M и .meta
файлы размером около 165M.
def train_inputs():
with tf.name_scope('Training_data'):
x = tf.constant(mnist.train.images.reshape([-1, 28, 28, 1]))
y = tf.constant(mnist.train.labels)
sliced_input = tf.train.slice_input_producer(
tensor_list=[x, y], shuffle=True)
return tf.train.shuffle_batch(
sliced_input, batch_size=batch_size,
capacity=10000, min_after_dequeue=batch_size*10)
Теперь, если я создам свою функцию ввода с новым tf.contrib.data.Dataset.from_tensor_slices
как в следующем кодовом блоке (полный код здесь), то мой результат graph.pbtxt
файл удваивается в размере до 1,3G и .meta
файлы удваиваются в размере до 330M.
def train_inputs():
with tf.name_scope('Training_data'):
images = mnist.train.images.reshape([-1, 28, 28, 1])
labels = mnist.train.labels
dataset = tf.contrib.data.Dataset.from_tensor_slices(
(images, labels))
dataset = dataset.repeat(None) # Infinite
dataset = dataset.shuffle(buffer_size=10000)
dataset = dataset.batch(batch_size)
iterator = dataset.make_one_shot_iterator()
next_example, next_label = iterator.get_next()
return next_example, next_label
Теперь, потому что graph.pbtxt
Файл настолько большой, что TensorBoard анализирует этот файл очень долго, и я не могу визуально отладить график модели. В документации набора данных я обнаружил, что это увеличение размера происходит из-за того, что "содержимое массива будет скопировано несколько раз", и решением будет использование заполнителей. Однако в этом случае для инициализации итератора мне понадобится передать пустые массивы в заполнители с активным сеансом:
sess.run(iterator.initializer, feed_dict={features_placeholder: features, labels_placeholder: labels})
Это кажется, однако, вне моего контроля при использовании tf.contrib.learn.Experiment
фреймворк.
Как я могу инициализировать инициализатор итератора с экспериментальной структурой? Или найти обходной путь к использованию API набора данных без увеличения размера моего графика?
1 ответ
Я нашел решение своей проблемы с помощью tf.train.SessionRunHook
, Я создаю SessionRunHook
объект, который инициализирует итератор после создания сеанса:
class IteratorInitializerHook(tf.train.SessionRunHook):
def __init__(self):
super(IteratorInitializerHook, self).__init__()
self.iterator_initiliser_func = None
def after_create_session(self, session, coord):
self.iterator_initiliser_func(session)
Функция инициализатора устанавливается при создании Итератора набора данных:
iterator_initiliser_hook.iterator_initiliser_func = \
lambda sess: sess.run(
iterator.initializer,
feed_dict={images_placeholder: images,
labels_placeholder: labels})
И я передаю в крюк объекты для train_monitors
а также eval_hooks
параметры tf.contrib.learn.Experiment
,
Результирующий graph.pbtxt
файл теперь только 500K в то время как .meta
файлы только 244К.