«Нет операции с именем [input] в графике» при использовании в программе java модели из hub.KerasLayer с python и тензорным потоком 2.1.0 - PullRequest
1 голос
/ 06 мая 2020

Я обучил модель тензорного потока mobilnet_v2 с помощью tf 2.1.0 и hub.KerasLayer с помощью python и экспортировал ее в формате pb с помощью tf.keras.models.save_model. Я загрузил его с помощью java, но не могу найти способ правильно скормить график.

Вот код построения и экспорта модели:

for image_batch, label_batch in train_generator:
    break

IMG_SHAPE = (IMG_SIZE, IMG_SIZE, 3)

feature_extractor_url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/2"

feature_extractor_layer = hub.KerasLayer(feature_extractor_url,
                                         input_shape=IMG_SHAPE,
                                         name='input')

feature_batch = feature_extractor_layer(image_batch)
feature_extractor_layer.trainable = False

model = tf.keras.Sequential([
  feature_extractor_layer,
  layers.Dense(train_generator.num_classes, name='output')
])

...... training .......

tf.keras.models.save_model(model,export_path)

Вот как я пытаюсь ввести его java:

Tensor inputImage = getTensorFromImage() // a method defined in other code and tested ok
final Session s = new Session(graphFromPBLoadedModel);
final Tensor result = s.runner().feed("input", inputImage )
                        .fetch("output").run().get(0))

Вот сгенерированное исключение:

java.lang.IllegalArgumentException: No Operation named [input] in the Graph

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

1 Ответ

0 голосов
/ 06 мая 2020

Я мог видеть, откуда возникла проблема, запустив saved_model_cli show --dir '.' --all в моем каталоге экспортированной модели:

MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['__saved_model_init_op']:
  The given SavedModel SignatureDef contains the following input(s):
  The given SavedModel SignatureDef contains the following output(s):
    outputs['__saved_model_init_op'] tensor_info:
        dtype: DT_INVALID
        shape: unknown_rank
        name: NoOp
  Method name is:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['input_input'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 224, 224, 3)
        name: serving_default_input_input:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['output'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 5)
        name: StatefulPartitionedCall:0
  Method name is: tensorflow/serving/predict

Используя "serving_default_input_input", я мог решить проблему.

...