我正在关注Tensorflow服务文档,将经过训练的模型转换为可以在Docker容器中提供的格式。当我刚接触Tensorflow时,我正在努力将这种训练有素的模型转换为适合服务的形式。
该模型已经过训练,我拥有检查点文件和.meta文件。因此,我需要从上述两个文件中获取.pb文件和变量文件夹。有人可以建议我一种方法来完成为模型提供服务的方法吗?
.
|-- tensorflow model
| -- 1
| |-- saved_model.pb
| -- variables
| |-- variables.data-00000-of-00001
| -- variables.index
答案 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
如果您有权访问训练模型,那么我想您当前正在使用tf.train.Saver
保存它。取而代之的是,您可以使用下面提到的三个(常用)功能中的任何一个来保存模型并将其导出:
tf.saved_model.simple_save
=>在这种情况下,服务期间仅支持Predict API。 KrisR89在回答中提到了这样的例子。
tf.saved_model.builder.SavedModelBuilder
=>在这种情况下,您可以定义SignatureDef,即您要在服务期间访问的API。
您可以在下面的链接中找到有关如何使用它的示例,
https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py
第三种方式如下所示:
分类器= 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。
让我知道此信息是否有帮助,或者您是否需要其他帮助。
答案 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!!!')