OutOfRangeError: итератор tenorflow не реинициализируется между запусками - PullRequest
0 голосов
/ 06 февраля 2019

Я выполняю тонкую настройку модели Inception с помощью тензорного потока с помощью приведенной ниже настройки и загружаю партии tf.Dataset API.Однако каждый раз, когда я пытаюсь обучить эту модель (перед успешным получением каких-либо пакетов), я получаю OutOfRangeError, утверждающую, что итератор исчерпан:

Caught OutOfRangeError. Stopping Training. End of sequence
     [[node IteratorGetNext (defined at <ipython-input-8-c768436e70d8>:13)  = IteratorGetNext[output_shapes=[[?,224,224,3], [?,1]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator)]]
with tf.Graph().as_default():

Я создал функцию для подачи в жестко запрограммированные партии в качестверезультат get_batch, и он работает и сходится без каких-либо проблем, что наводит меня на мысль, что график и код сеанса работает правильно.Я также протестировал функцию get_batch для итерации в сеансе, и это не вызывает ошибок.Я ожидаю, что при возобновлении обучения (особенно при перезагрузке ноутбука и т. Д.) Будет создан новый итератор для набора данных.

Код для модели поезда:

with tf.Graph().as_default():

    tf.logging.set_verbosity(tf.logging.INFO)
    images, labels = get_batch(filenames=tf_train_record_path+train_file)
    # Create the model, use the default arg scope to configure the batch norm parameters.
    with slim.arg_scope(inception.inception_v1_arg_scope()):
        logits, ax = inception.inception_v1(images, num_classes=1, is_training=True)

    # Specify the loss function:
    tf.losses.mean_squared_error(labels,logits)
    total_loss = tf.losses.get_total_loss()
    tf.summary.scalar('losses/Total_Loss', total_loss)


     # Specify the optimizer and create the train op:
    optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
    train_op = slim.learning.create_train_op(total_loss, optimizer)

    # Run the training:
    final_loss = slim.learning.train(
        train_op,
        logdir=train_dir,
        init_fn=get_init_fn(),
        number_of_steps=1)

Код для получения партий с использованием набора данных

def get_batch(filenames):
    dataset = tf.data.TFRecordDataset(filenames=filenames)

    dataset = dataset.map(parse)
    dataset = dataset.batch(2)

    iterator = dataset.make_one_shot_iterator()
    data_X, data_y = iterator.get_next()

    return data_X, data_y 

Этот ранее заданный вопрос напоминает проблему, с которой я сталкиваюсь, однако я не использую batch_join вызов.Я не, если это проблема с slim.learning.train, восстановление с контрольной точки или области.Любая помощь будет оценена!

1 Ответ

0 голосов
/ 06 февраля 2019

Ваш входной конвейер выглядит нормально.Возможно, проблема в поврежденном файле TFRecords.Вы можете попробовать свой код со случайными данными или использовать ваши изображения в виде пустых массивов с tf.data.Dataset.from_tensor_slices().Также ваша функция разбора может вызвать проблемы.Попробуйте напечатать ваше изображение / этикетку с sess.run.

И я бы посоветовал использовать Estimator API в качестве train_op.Это гораздо удобнее и стройнее скоро будет устаревшим.

...