Экспорт модели Keras в качестве оценщика TF: обученная модель не найдена - PullRequest
0 голосов
/ 10 февраля 2019

При попытке экспортировать модель Keras в качестве оценщика TensorFlow с целью обслуживания модели я столкнулся со следующей проблемой.Поскольку та же самая проблема также появилась в ответе на этот вопрос , я проиллюстрирую, что происходит на игрушечном примере, и предоставлю мое решение для обхода проблемы в целях документирования.Такое поведение происходит с Tensorflow 1.12.0 и Keras 2.2.4.Это происходит как с настоящими Keras, так и с tf.keras.

Проблема возникает при попытке экспортировать Оценщик, созданный из модели Keras с tf.keras.estimator.model_to_estimator.При вызове estimator.export_savedmodel выдается либо NotFoundError, либо ValueError.

Код ниже воспроизводит это для примера с игрушкой.

Создайте модель Keras и сохраните ее:

import keras
model = keras.Sequential()
model.add(keras.layers.Dense(units=1,
                                activation='sigmoid',
                                input_shape=(10, )))
model.compile(loss='binary_crossentropy', optimizer='sgd')
model.save('./model.h5')

Затем преобразуйте модель в оценщик с помощью tf.keras.estimator.model_to_estimator, добавьте функцию приемника ввода и экспортируйте ее в формате Savedmodel с помощью estimator.export_savedmodel:

# Convert keras model to TF estimator
tf_files_path = './tf'
estimator =\
    tf.keras.estimator.model_to_estimator(keras_model=model,
                                          model_dir=tf_files_path)
def serving_input_receiver_fn():
    return tf.estimator.export.build_raw_serving_input_receiver_fn(
        {model.input_names[0]: tf.placeholder(tf.float32, shape=[None, 10])})

# Export the estimator
export_path = './export'
estimator.export_savedmodel(
    export_path,
    serving_input_receiver_fn=serving_input_receiver_fn())

Thisскинет:

ValueError: Couldn't find trained model at ./tf.

1 Ответ

0 голосов
/ 10 февраля 2019

Мой обходной путь заключается в следующем.Из проверки папки ./tf становится ясно, что при вызове model_to_estimator были сохранены необходимые файлы в подпапке keras, в то время как export_model ожидает, что эти файлы будут непосредственно в папке ./tf, так как это путь, который мы указалидля аргумента model_dir:

$ tree ./tf
./tf
└── keras
    ├── checkpoint
    ├── keras_model.ckpt.data-00000-of-00001
    ├── keras_model.ckpt.index
    └── keras_model.ckpt.meta

1 directory, 4 files

Простой обходной путь - переместить эти файлы в одну папку.Это можно сделать с помощью Python:

import os
import shutil
from pathlib import Path

def up_one_dir(path):
    """Move all files in path up one folder, and delete the empty folder
    """
    parent_dir = str(Path(path).parents[0])
    for f in os.listdir(path):
        shutil.move(os.path.join(path, f), parent_dir)
    shutil.rmtree(path)

up_one_dir('./tf/keras')

, что сделает каталог model_dir похожим на это:

$ tree ./tf
./tf
├── checkpoint
├── keras_model.ckpt.data-00000-of-00001
├── keras_model.ckpt.index
└── keras_model.ckpt.meta

0 directories, 4 files

Выполнение этой манипуляции между model_to_estimator и export_savedmodel вызывает позволяет экспортировать модель по желанию:

export_path = './export'
estimator.export_savedmodel(
    export_path,
    serving_input_receiver_fn=serving_input_receiver_fn())

ИНФОРМАЦИЯ: тензор потока: SavedModel записывается в: ./export/temp-b'1549796240'/saved_model.pb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...