Экспорт VGGFace ResNet в Tensorflow Обслуживание: ValueError: Должно быть определено последнее измерение входных данных в 'Dense'.Найдено `Нет` - PullRequest
0 голосов
/ 24 сентября 2019

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

import tensorflow as tf
import keras
from keras_vggface.vggface import VGGFace

tf.keras.backend.set_learning_phase(0) 
CHANNELS = 3

model = VGGFace(model='resnet50')
model.compile(
    loss=keras.losses.categorical_crossentropy,
    optimizer='adam',
    metrics=['accuracy'])
model.save('models/VGGFaceResnet50_celebrity_classifier.h5')

def serving_input_receiver_fn():

    def decode_and_resize(image_str_tensor):
        """Decodes jpeg string, resizes it and raeturns a uint8 tensor."""
        image = tf.image.decode_jpeg(image_str_tensor, channels=CHANNELS)
        image = tf.cast(image, dtype=tf.uint8)
        return image

    # Optional; currently necessary for batch prediction.
    key_input = tf.placeholder(tf.string, shape=[None]) 
    key_output = tf.identity(key_input)

    input_ph = tf.placeholder(tf.string, shape=[None], name='image_binary')
    images_tensor = tf.map_fn(
            decode_and_resize, input_ph, back_prop=False, dtype=tf.uint8)
    images_tensor = tf.image.convert_image_dtype(images_tensor, dtype=tf.float32) 

    return tf.estimator.export.ServingInputReceiver(
         {'input_1': images_tensor},
         {'bytes': input_ph})


KERAS_MODEL_PATH='models/VGGFaceResnet50_celebrity_classifier.h5'
EXPORT_PATH='serving_model'

# If you are invoking this from your training code, use `keras_model=model` instead.
estimator = tf.keras.estimator.model_to_estimator(
    keras_model_path=KERAS_MODEL_PATH)
estimator.export_savedmodel(
    EXPORT_PATH,
    serving_input_receiver_fn=serving_input_receiver_fn
) 

Однако я получаю следующую ошибку:

ValueError                  Traceback (most recent call last)
<ipython-input-1-edfbc77c298a> in <module>
     44 estimator.export_savedmodel(
     45     EXPORT_PATH,
---> 46     serving_input_receiver_fn=serving_input_receiver_fn
     47 ) 
...
ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

Я проверил сводку модели и не вижу None в последнем измерении.Почему там ошибка?

1 Ответ

0 голосов
/ 24 сентября 2019

Конструктор VGGFace определяется как: def VGGFace(include_top=True, model='vgg16', weights='vggface', input_tensor=None, input_shape=None, pooling=None, classes=None).Размер последнего измерения вычисляется на основе input_shape, т. Е. Если оно равно None, последний размер измерения также будет None.

...