FailedPreconditionError (см. Выше для отслеживания): GetNext() не удалось, потому что итератор не был инициализирован

#python #tensorflow #tensorflow-datasets

#python #тензорный поток #tensorflow-datasets

Вопрос:

Я построил конвейер набора данных для входных данных при составлении прогнозов.Однако, когда я попробовал код, произошла ошибка

FailedPreconditionError (см. Выше для отслеживания): GetNext() не удалось, потому что итератор не был инициализирован. Убедитесь, что вы выполнили операцию инициализации для этого итератора, прежде чем получать следующий элемент. [[Узел: IteratorGetNext_259 = IteratorGetNextoutput_shapes=[[?,227,227,6]], output_types=[DT_FLOAT], _device=»/задание: локальный хост / реплика: 0/ задача:0/устройство: процессор: 0″]]

итератор для обхода набора данных был определен следующим образом:

 for k in range(num_init_ops):
with tf.device('/cpu:0'):


    pre_data.append(PreDataGenerator(pre_file,
                                mode='predicting',
                                batch_size=batch_size,
                                num_classes=num_classes,
                                shuffle=False,
                                iterator_size=iterator_size,
                                kth_init_op=k))

    # create an reinitializable iterator given the dataset structure
    iterator = Iterator.from_structure(pre_data[k].data.output_types,
                                       pre_data[k].data.output_shapes)
    next_batch = iterator.get_next()

# Ops for initializing the two different iterators
predicting_init_op.append(iterator.make_initializer(pre_data[k].data))
  

цикл for был написан потому, что я ожидаю создать несколько инициализаций набора данных для разделения данных на разные итераторы, чтобы предотвратить накопление вызовов памяти, вызывающих ошибки ООМ (интересно, сработает ли это).).

Я уверен, что итератор инициализирован (он выводит правильную структуру при отладке). Вот мой код сеанса Tensorflow:

 with tf.Session(config=config) as sess:
sess.run(tf.global_variables_initializer())
# sess.run(tf.local_variables_initializer())
saver.restore(sess, './checkpoints_grade1/model_epoch46.ckpt')  # todo:

print("{} Start predicting...".format(datetime.now()))

for j in range(num_init_ops 1):#todo:

    print('{} Initializing {} iterator'.format(datetime.now(),j))

    # Initialize iterator with the predicting dataset
    sess.run(predicting_init_op[j])

    for i in range(iterator_size):

        # get next batch of data
        img_batch = sess.run(next_batch)#todo:?

        # And run the predicting op
        img_batch = tf.reshape(img_batch, (1, 227, 227, 6))
        pred = sess.run(softmax, feed_dict={x: sess.run(img_batch)})
        predicted_label = pred.argmax(axis=1)
        predictions.append(predicted_label[0])
        output_file.write(str(i)   ' , '   str(predicted_label[0])   'n')
  

Ответ №1:

Вам необходимо инициализировать итератор:

 sess.run(iterator.initializer)
  

И выполните обучение следующим образом:

 next_batch = iterator.get_next()
sess.run(iterator.initializer)

for epoch in range(n_epochs):
    while True:
        try:
            batch = sess.run(next_batch)
            # feed data, train
            # ...
        except tf.errors.OutOfRangeError:
            sess.run(iterator.initializer)
            break
  

В качестве альтернативы, при определении вашего tf.data.Dataset.from_tensor_slices экземпляра вы можете указать, сколько эпох для обучения:

 data = tf.data.Dataset.from_tensor_slices({
            'x':train_data,
            'y':train_labels
            }).repeat(n_epochs).batch(batch_size)
iterator = data.make_initializable_iterator()
  

При этом вам не нужен for epoch in range(n_epochs) цикл:

 next_batch = iterator.get_next()
sess.run(iterator.initializer)

while True:
    try:
        batch = sess.run(next_batch)
        # feed data, train
        # ...
    except tf.errors.OutOfRangeError:
        break
  

Комментарии:

1. Я изменил код, как было предложено, проблема все еще осталась. И когда я навожу курсор на переменную next_batch, это показывает, что имя ‘next_batch’ может быть определено не меньше… (Ctrl F1) Информация об инспекции: эта проверка предупреждает о локальных переменных, на которые ссылаются перед назначением.

2. Не могу сказать, не видя ваш код. Загрузите его куда-нибудь и разместите здесь ссылку. Я посмотрю.

3. Я только что загрузил репозиторий на github. Эта ссылка касается сценария прогнозирования. [ github.com/ChengYeung1222/finetune_alexnet_v2/blob/master/… Спасибо за ваше драгоценное время!!

4. Ссылка

Ответ №2:

Я управляю программой прогнозирования с помощью сценария оболочки, каждый раз, когда я начинаю прогнозировать пакет выборок, чтобы память просто не заканчивалась. Проблема решена.

 #!/bin/bash 
for ((i=0;i<9;i  ))
do
    python classifier_v4.py --iter_epoch $i
done