将TensorFlow模型转换为可投放的格式

时间:2019-06-18 04:44:39

标签: tensorflow deployment deep-learning tensorflow-serving

我正在关注Tensorflow服务文档,将经过训练的模型转换为可以在Docker容器中提供的格式。当我刚接触Tensorflow时,我正在努力将这种训练有素的模型转换为适合服务的形式。

该模型已经过训练,我拥有检查点文件和.meta文件。因此,我需要从上述两个文件中获取.pb文件和变量文件夹。有人可以建议我一种方法来完成为模型提供服务的方法吗?

.
|-- tensorflow model
|       -- 1
|       |-- saved_model.pb
|       -- variables
|           |-- variables.data-00000-of-00001
|           -- variables.index

3 个答案:

答案 0 :(得分:1)

有多种方法可以执行此操作,对于更复杂的模型,可能需要其他方法。 我当前使用的是here中描述的方法,该方法对tf.keras.models.Model和tf.keras.Sequential模型非常有用(不确定tensorflow子类吗?)。

下面是一个最小的工作示例,包括使用python创建模型(似乎您已经通过文件夹结构完成了此操作,可以忽略第一步)

import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K

inputs = Input(shape=(2,))
x = Dense(128, activation='relu')(inputs)
x = Dense(32, activation='relu')(x)
outputs = Dense(1)(x)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam', loss='mse')

# loading existing weights, model architectural must be the same as the existing model
#model.load_weights(".//MODEL_WEIGHT_PATH//WEIGHT.h5") 

export_path = 'SAVE_PATH//tensorflow_model//1'

with K.get_session() as sess:
    tf.saved_model.simple_save(
            sess,
            export_path,
            inputs={'inputs': model.input}, # for single input
            #inputs={t.name[:-5]: t for t in model.input}, # for multiple inputs
            outputs={'outputs': model.output})

我建议您使用文件夹名称“ tensorflow_model”而不是“ tensorflow model”,以避免可能出现的空间问题。

然后我们可以在终端中通过以下方式构建docker映像(对于Windows,在路径制动中使用^代替\,并在路径中使用// C /代替C:\):

docker run -p 8501:8501 --name tfserving_test \
  --mount type=bind,source="SAVE_PATH/tensorflow_model",target=/models/tensorflow_model \
  -e MODEL_NAME=tensorflow_model -t tensorflow/serving

现在容器应已启动并正在运行,我们可以使用python测试服务

import requests
import json
#import numpy as np

payload = {
  "instances": [{'inputs': [1.,1.]}]
}

r = requests.post('http://localhost:8501/v1/models/tensorflow_model:predict', json=payload)
print(json.loads(r.content))
# {'predictions': [[0.121025]]}

该容器正在使用我们的模型,因此对输入[1.,1.]的预测为0.121025

答案 1 :(得分:1)

从您的问题开始,您是说您不再有权使用模型,而是仅拥有Check Point files.meta files吗?

在这种情况下,您可以参考以下链接,其中包含用于将这些文件转换为'.pb' file的代码。

Tensorflow: How to convert .meta, .data and .index model files into one graph.pb file

https://github.com/petewarden/tensorflow_makefile/blob/master/tensorflow/python/tools/freeze_graph.py

如果您有权访问训练模型,那么我想您当前正在使用tf.train.Saver保存它。取而代之的是,您可以使用下面提到的三个(常用)功能中的任何一个来保存模型并将其导出:

  1. tf.saved_model.simple_save =>在这种情况下,服务期间仅支持Predict API。 KrisR89在回答中提到了这样的例子。

  2. tf.saved_model.builder.SavedModelBuilder =>在这种情况下,您可以定义SignatureDef,即您要在服务期间访问的API。 您可以在下面的链接中找到有关如何使用它的示例, https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py

  3. 第三种方式如下所示:

    分类器= tf.estimator.DNNClassifier(config = training_config,feature_columns = feature_columns,hidden_​​units = [256,32],optimizer = tf.train.AdamOptimizer(1e-4),n_classes = NUM​​_CLASSES,dropout = 0.1,model_dir = FLAGS.model_dir)

    classifier.export_savedmodel(FLAGS.saved_dir,

    serving_input_receiver_fn = serving_input_receiver_fn)

有关如何使用估算器保存模型的示例可以在下面的链接中找到。这支持Predict和分类API。

https://github.com/yu-iskw/tensorflow-serving-example/blob/master/python/train/mnist_premodeled_estimator.py

让我知道此信息是否有帮助,或者您是否需要其他帮助。

答案 2 :(得分:0)

我希望这会有所帮助:

import tensorflow as tf
from tensorflow.contrib.keras import backend as K
from tensorflow.python.client import device_lib

K.set_learning_phase(0)
model = tf.keras.models.load_model('my_model.h5')


export_path = './'
with K.get_session() as sess:
    tf.saved_model.simple_save(
        sess,
        export_path,
        inputs={'input_image': model.input},
        outputs={t.name: t for t in model.outputs}
    )
    print('Converted to SavedModel!!!')