Как использовать тестовые данные на сохраненной модели с очередным подходом (без feed_dict) #tensorflow?

Я новичок в тензорном потоке. Я построил convonet для классификации изображений mnist следующим образом: я использую очереди для чтения изображений (png) из пакета диска и передачи его для обучения оператору (сейчас мне это вполне комфортно) Все хорошо до поезда, и я оцениваю моя точность op на определенном количестве шагов во время тренировки.

Я сохраняю модель с объектом Saver и вижу, как мета-файл и файл контрольной точки записываются на диск.

Теперь настоящая задача - восстановить модель после завершения обучения и использовать ее для прогнозов на новых изображениях.

Один из первых шагов на моем графике (для обучения), как показано ниже, берет x_image (изображения из очереди поездов) h_conv1 = tf.nn.relu (conv2d (x_image, W_conv1) + b_conv1)

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

Как мне теперь восстановить полученные веса во время тренировки и использовать их с этим новым графиком, чтобы просто выполнить операцию прогнозирования / точности.

Я пытался следовать - https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10.py, но потерялся с кодом оценки.

Кроме того, если я добавлю фиктивную константу в свой график обучения, а затем попытаюсь получить ее значение, я смогу получить ее.

Может ли кто-нибудь 1 помочь. Спасибо


person tejas    schedule 12.06.2017    source источник
comment
Я могу использовать saver.restore () и восстанавливать переменные графика. Я осторожно не запускаю tf.global_variables_initializer (), чтобы переменные / веса не переинициализировались, а восстанавливались из сохраненной модели. Единственная странная вещь, которую я сейчас наблюдаю, это то, что мой прогноз op возвращает другую метку для одного и того же входного изображения. Я использую tf.train.shuffle_batch () для создания тестового образца. Может кто-нибудь указать на мою ошибку. Спасибо   -  person tejas    schedule 13.06.2017


Ответы (1)


Хорошо, я нашел ответ.

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

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

Настоящая задача заключалась в том, чтобы сохранить модель после обучения и использовать сохраненную модель для прогнозирования в производственной среде.

Итак, вот поток:

Обучение

  • создайте метод, который создает ваш график (будет принимать тензор изображения в качестве входных данных).
  • Постройте обучающий граф, передав пакеты обучающих изображений
  • Выполните обучение и сохраните модель с объектом-заставкой.

Оценка

  • Теперь восстановите тот же график с пакетами тестовых изображений.
  • В сеансе используйте объект заставки для восстановления весов (обратите внимание, что вам не нужно передавать, какие переменные для восстановления, по умолчанию он восстанавливает все восстанавливаемые переменные) Не запускайте инициализатор переменных gloabl в это время
  • Запустите операцию прогнозирования (созданную на основе только что построенного графика)

Также убедитесь, что вы отключили функцию выпадения в eval, так как при этом будет изменяться вывод для одного и того же ввода

Ниже псевдокод

train_op, y_predict, accuracy = create_graph(train_input, train_label)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    model_saver = tf.train.Saver()

    for i in range(2000):
        if i%100 == 0:
           train_accuracy = sess.run(accuracy)
           print("step %d, training accuracy %f" %(i, train_accuracy))
        sess.run(train_op)

    print(sess.run(accuracy))
    model_saver.save(sess, 'model/simple_model', global_step=100)
    coord.request_stop()
    coord.join(threads)

Для оценки

_, y_predict, accuracy = create_graph(test_input, test_label)

saver = tf.train.Saver()

with tf.Session() as sess:
    saver.restore(sess, tf.train.latest_checkpoint("./model/"))

    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    label_predict = sess.run([y_predict])
person tejas    schedule 13.06.2017