Как делать прогнозы с помощью официальной модели реснета, реализованной с помощью оценщика

Я использовал код из: https://github.com/tensorflow/models/blob/master/official/resnet/imagenet_main.py, чтобы выполнить двоичную классификацию, изменив количество классов. Модель обучена без проблем и обеспечивает хорошую точность.

На следующем шаге я хочу восстановить обученную модель, выполняя прогноз. И я следовал руководству «Сохранение и восстановление» от TensorFlow. Однако я должен экспортировать свою модель в стандартном SavedModel формате (а не в автоматически сохраненной модели tf.estimator.Estimator). Я добавил это serving_input_reciever_fn в код:

def serving_input_receiver_fn():

    serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[None], name='input_exapmle_tensor')
    receiver_tensors = {"predictor_inputs": serialized_tf_example}

    feature_spec = {"image": tf.FixedLenFeature((), tf.string)}

    features = tf.parse_example(serialized_tf_example, feature_spec, example_names='input')

    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

В model_fn я добавил это, чтобы объявить экспорт:

predict_output = {
  'pred_output_class': tf.argmax(logits, axis=1),
  'pred_output_prob': tf.nn.softmax(logits, name='softmax_tensor')
}

export_output = {'predict_output': tf.estimator.export.PredictOutput(predict_output)}

if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions, export_outputs=export_output)

И в основной функции я добавил эту строку после шагов обучения и проверки:

  resnet_classifier.export_savedmodel(FLAGS.export_dir, serving_input_receiver_fn)

После обучения и проверки я получил эту ошибку:

ValueError: Shape must be rank 1 but is rank 0 for 'ParseExample/ParseExample' (op: 'ParseExample') with input shapes: [?], [], [], [0].

Конечно, ожидаемая стандартная модель так и не пошла на экспорт. Я предполагаю, что что-то из serving_input_receiver_fn было неправильным. Возможно, тип ввода не соответствует типу ввода model_fn. Как я могу определить эту функцию?


Обновление: я попытался использовать tf.estimator.export.build_raw_serving_input_receiver_fn для подачи в модель предварительно обработанных необработанных данных. Код в основной функции:

feature_spec = {"input_image": tf.placeholder(dtype=tf.string, shape=[None, 224, 224, 3], name='input')}

input_receiver_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(feature_spec)
resnet_classifier.export_savedmodel(export_dir_base=FLAGS.export_dir,serving_input_receiver_fn=input_receiver_fn, as_text=True)

А потом я получил такую ​​ошибку:

Traceback (most recent call last):
  File "classification_main.py", line 306, in <module>
    tf.app.run(argv=[sys.argv[0]] + unparsed)
  File "/home/ding/.virtualenvs/cv-py2/local/lib/python2.7/site-packages/tensorflow/python/platform/app.py", line 48, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "classification_main.py", line 301, in main
    resnet_classifier.export_savedmodel(export_dir_base=FLAGS.export_dir,serving_input_receiver_fn=input_receiver_fn, as_text=True)
  File "/home/ding/.virtualenvs/cv-py2/local/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 511, in export_savedmodel
    config=self.config)
  File "/home/ding/.virtualenvs/cv-py2/local/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 694, in _call_model_fn
    model_fn_results = self._model_fn(features=features, **kwargs)
  File "classification_main.py", line 184, in resnet_model_fn
    inputs=features, is_training=(mode == tf.estimator.ModeKeys.TRAIN))
  File "/home/ding/projektpraktikum/tensorflow_ws/classification/resnet_model.py", line 249, in model
    inputs = tf.transpose(inputs, [0, 3, 1, 2])
  File "/home/ding/.virtualenvs/cv-py2/local/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 1336, in transpose
    ret = gen_array_ops.transpose(a, perm, name=name)
  File "/home/ding/.virtualenvs/cv-py2/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 5694, in transpose
    "Transpose", x=x, perm=perm, name=name)
  File "/home/ding/.virtualenvs/cv-py2/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 513, in _apply_op_helper
    raise err
TypeError: Failed to convert object of type <type 'dict'> to Tensor. Contents: {'input_image': <tf.Tensor 'input:0' shape=(?, 224, 224, 3) dtype=string>}. Consider casting elements to a supported type.

person Shuxiao Ding    schedule 19.01.2018    source источник


Ответы (2)


В вашем первом примере форма ввода установлена ​​в [None], что означает любой вектор (serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[None], name='input_exapmle_tensor'), и это звучит так, как будто вы передаете одну строку как скаляр. Вы можете просто обернуть ввод в список (давая вам одноэлементный вектор) или измените форму на [] для скаляра.

Во втором примере dtype по-прежнему string, но похоже, что вам нужен float32 или другой числовой тип для непосредственной подачи изображений.

person Allen Lavoie    schedule 22.01.2018
comment
Привет, спасибо за ответ. Я попытался изменить форму на [] в первом примере и тип данных на float32 во втором примере, но я все равно получил и ValueError, и TypeError. - person Shuxiao Ding; 23.01.2018

Наконец-то я получил ответ:

  1. В процессе обучения вам необходимо указать параметр export_dir, чтобы сохранить модель после ее обучения. Сохраненная папка (graph_pb_path) состоит из двух частей (одна - это папка с именем variables, другая - save_model.pb)

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

with tf.Session(graph=tf.Graph()) as sess:
        tf.saved_model.loader.load(sess,["serve"], graph_pb_path)
        graph = tf.get_default_graph()
        inputs = graph.get_tensor_by_name('input_tensor:0')
        model = graph.get_tensor_by_name('resnet_model/final_dense:0')
        res = sess.run(model, {inputs:img})

Примечание: для тестирования на N изображениях вам необходимо изменить параметр batch_size в следующем файле: экспорт моделей тензорного потока

person Lizhen    schedule 23.02.2019