Подача отдельных примеров в график тензорного потока, обученный на файлах?

#tensorflow #tensorflow-serving

#тензорный поток #обслуживание тензорного потока

Вопрос:

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

Где я запутываюсь, так это как обойти исходную систему ввода-вывода на графике обучения и «ввести» изображение для прогнозирования или (изображение, метку) кортеж тестовых данных для проверки точности. Для чтения обучающих данных я использую этот код:

 _, input_data = util.read_examples(
    paths_to_files,
    batch_size,
    shuffle=shuffle,
    num_epochs=None)

feature_map = {
    'label': tf.FixedLenFeature(
    shape=[], dtype=tf.int64, default_value=[-1]),
    'image': tf.FixedLenFeature(
    shape=[NUM_PIXELS * NUM_PIXELS], dtype=tf.int64),
}
example = tf.parse_example(input_data, features=feature_map)
  

Затем я передаю пример на уровень свертки и т.д. И генерирую результат.

Теперь представьте, что я обучаю свой график с помощью этого кода, определяющего входные данные, сохраняю график и веса, а затем восстанавливаю график и веса в другом сценарии для прогнозирования — я хотел бы взять (скажем) 10 изображений и передать их на график для генерации прогнозов. Как мне «внедрить» эти 10 изображений, чтобы предсказания вышли с другого конца?

Я поиграл со словарями каналов и заполнителями, но я не уверен, что они подходят для меня … похоже, они полагаются на наличие данных в памяти, в отличие от чтения, например, из очереди тестовых данных.

Спасибо!

Ответ №1:

Словарь подачи с заполнителями имел бы смысл, если бы вы хотели выполнить небольшое количество выводов / оценок (т. Е. Достаточно, чтобы поместиться в памяти) — например, если вы обслуживали простую модель или выполняли небольшие циклы оценки.

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

 _, eval_data = util.read_examples(
    paths_to_files,  # CHANGE THIS BIT
    batch_size,
    shuffle=shuffle,
    num_epochs=None)
  

Вы можете использовать это как обычную переменную Python и настроить последовательные зависимые шаги для использования этого в качестве предоставленной переменной. например

 def get_example(data):
    return tf.parse_example(data, features=feature_map)

sess.run([get_example(path_to_your_data)])
  

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

1. ок, круто, это имеет смысл. у меня возникли проблемы с тем, как это работает при загрузке моего графика — исходный узел util.read_examples находится где-то на этом графике, и я должен как-то обойти или изменить его. проще всего просто изменить мой график, чтобы удалить его и добавить новый узел подачи?

2. Ahh — обычно для вывода и обучения строятся немного разные графики, но я думаю, что самое простое решение — использовать тот же график, но предоставлять диктант подачи во время вывода. Вы можете передать тензор, который вы хотите заменить, в качестве ключа в dict и значение, которое вы хотите для этого тензора, в качестве значения. Я думаю, что в вашем примере вы могли бы использовать sess.run([your_inference_tensors], { example['image']: your_image_data }) . Проверьте документы Session.run() для большей ясности.