Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 将keras模型导出为tf savedModel格式:如何修复服务\u输入\u fn_Tensorflow_Google Cloud Ml_Tf.keras_Gcp Ai Platform Notebook - Fatal编程技术网

Tensorflow 将keras模型导出为tf savedModel格式:如何修复服务\u输入\u fn

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” _________________________________________________________________ 图层(类型)输出形状参数# ===================

我想利用谷歌的人工智能平台来部署我的keras模型,它要求模型采用tensorflow SavedModel格式。我将keras模型保存为tensorflow估计模型,然后导出该估计模型。我在定义我的
服务\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。