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К.

Полный пример здесь.

Другие вопросы по тегам