Tensorflow 将keras模型导出为tf savedModel格式:如何修复服务\u输入\u fn
我想利用谷歌的人工智能平台来部署我的keras模型,它要求模型采用tensorflow SavedModel格式。我将keras模型保存为tensorflow估计模型,然后导出该估计模型。我在定义我的Tensorflow 将keras模型导出为tf savedModel格式:如何修复服务\u输入\u fn,tensorflow,google-cloud-ml,tf.keras,gcp-ai-platform-notebook,Tensorflow,Google Cloud Ml,Tf.keras,Gcp Ai Platform Notebook,我想利用谷歌的人工智能平台来部署我的keras模型,它要求模型采用tensorflow SavedModel格式。我将keras模型保存为tensorflow估计模型,然后导出该估计模型。我在定义我的服务\u输入\u接收器\u fn时遇到问题 以下是我的模型的摘要: Model:“Model_49” _________________________________________________________________ 图层(类型)输出形状参数# ===================
服务\u输入\u接收器\u fn时遇到问题
以下是我的模型的摘要:
Model:“Model_49”
_________________________________________________________________
图层(类型)输出形状参数#
=================================================================
输入_49(输入层)[(无、400、254)]0
_________________________________________________________________
gru_121(gru)(无、400、64)61248
_________________________________________________________________
gru_122(gru)(无,64)24768
_________________________________________________________________
辍学(辍学)(无,64)0
_________________________________________________________________
1M(密实)(无,1)65
=================================================================
总参数:86081
可培训参数:86081
不可训练参数:0
_________________________________________________________________
下面是我遇到的错误:
KeyError: "The dictionary passed into features does not have the expected
inputs keys defined in the keras model.\n\tExpected keys:
{'input_49'}\n\tfeatures keys: {'col1','col2', ..., 'col254'}
下面是我的代码
def服务于输入接收器()
功能\u占位符={
column.name:tf.placeholder(tf.float64,[None]),用于输入列中的列
}
#功能\u占位符={
#'input_49':tf.placeholder(tf.float64,[None])
# }
特征={
键:tf.expand_dims(张量,-1)
对于键,特征_占位符中的张量。items()
}
返回tf.estimator.export.ServingInputReceiver(特征,特征占位符)
def run():
h5_model_file='../models/model2.h5'
json_model_file='../models/model2.json'
model=get_keras_model(h5_model_文件、json_model_文件)
打印(model.summary())
估计器模型=tf.keras.estimator.model\u to\u估计器(keras\u模型=模型,model\u dir='estimator\u模型')
导出路径=估计器模型。导出保存的模型(“导出”,
服务\输入\接收器\ fn=服务\输入\接收器\ fn)
似乎我的模型需要一个单一的特征键:input\u 49
(我的神经网络的第一层),然而,例如,从服务接收器输入fn
将所有特征的dict输入到我的模型中
我如何解决这个问题
我正在使用tensorflow==2.0.0-beta1。我已经设法保存了一个Keras模型,并使用对象的TF服务托管它。我不确定这是否可以很容易地推广到您的应用程序中,但下面是对我有效的方法,尽我所能使其通用化
#设置保存模型的路径。
export_base_path=os.path.abspath('models/versions/'))
型号_版本='1'
export\u path=os.path.join(tf.compat.as\u字节(export\u base\u path),
tf.compat.as_字节(型号版本))
#制作模型生成器。
builder=tf.saved\u model.builder.SavedModelBuilder(导出路径)
#定义TensorInfo协议缓冲区对象,用于封装
#输入/输出张量。
#注意:您可以有一个model.input图层列表,也可以只有一个model.input图层
#没有任何索引。我展示了一个输入列表和一个输出层。
#输入张量信息。
tensor\u info\u input0=tf.saved\u model.utils.build\u tensor\u info(model.input[0])
tensor\u info\u input1=tf.saved\u model.utils.build\u tensor\u info(model.input[1])
#输出张量信息。
tensor\u info\u output=tf.saved\u model.utils.build\u tensor\u info(model.output)
#定义TF Predict API使用的调用签名。记下名字
#此处的字符串应与模型定义中所调用的层相匹配。
#我可能不得不使用它,因为我忘了它是name参数,还是
#代码中的实际对象句柄。
预测\u签名=(
tf.saved_model.signature_def_utils.build_signature_def(
输入={'input0':张量信息输入0,'input1':张量信息输入1},
输出={'prediction':张量信息输出},
方法\名称=tf.保存的\模型.签名\常数.预测\方法\名称)
#现在,我们构建SavedModel协议缓冲区对象,然后保存它。
添加元图和变量(SES,
[tf.saved_model.tag_constants.service],
签名\定义\映射={'predict':预测\签名})
builder.save(as_text=True)
我会努力找到那些让我来到这里的推荐人,但当时我没有记下来。找到链接后,我将使用链接进行更新。我最终更改了以下内容:
feature_placeholders = {
column.name: tf.placeholder(tf.float64, [None]) for column in INPUT_COLUMNS
}
为此:
feature_placeholders = {
'input_49': tf.placeholder(tf.float32, (254, None), name='input_49')
}
我可以用保存的_model.pb获取一个文件夹 谢谢,我想我会试试这个。AI平台目前支持TF1.14。它还不支持TF beta 2.0。它将支持TF2.0,当它成为GA。