Tensorflow 在Google Cloud ML中部署本地keras训练模型。更改输入形状

Tensorflow 在Google Cloud ML中部署本地keras训练模型。更改输入形状,tensorflow,keras,tensorflow-serving,google-cloud-ml,Tensorflow,Keras,Tensorflow Serving,Google Cloud Ml,我在本地训练了一个简单的Keras网络,它使用GRU生成一个文本序列。模型有一个输入形状[1,窗口大小,数字字符] 我已将模型导出为TF模型,并使用tensorflow\u model\u server对其进行服务器处理。对于预测,我使用了一个带有shape[1,window\u size,number\u charazters]的输入 当我部署到google cloud ML时,模型有一个[number\u charazter,window\u size]输入 为什么要在Google Clou

我在本地训练了一个简单的Keras网络,它使用GRU生成一个文本序列。模型有一个输入形状
[1,窗口大小,数字字符]

我已将模型导出为TF模型,并使用
tensorflow\u model\u server
对其进行服务器处理。对于预测,我使用了一个带有shape
[1,window\u size,number\u charazters]
的输入

当我部署到google cloud ML时,模型有一个
[number\u charazter,window\u size]
输入

为什么要在Google Cloud ML中更改输入形状

Keras网络

def create_gru_模型(num_chars):
"""
定义网络
:param
数字字符-培训过程中使用的数字字符
:返回:
模型-定义的模型网络
"""
模型=顺序()
#1层。-GRU第1层应为具有200个隐藏单元的GRU模块
add(GRU(200,输入形状=(窗口大小,字符数),返回序列=True))
#2层-GRU第2层应为具有200个隐藏单元的GRU模块
新增型号(GRU(200))
#2层-致密,具有数字字符单元和softmax激活
添加(密集(num_chars,activation='softmax'))
回归模型
将模型导出到
tensorflow\u model\u服务器

如果os.path.isdir(导出路径):
shutil.rmtree(导出路径)
builder=saved\u model\u builder.SavedModelBuilder(导出路径)
签名=预测\签名\定义(输入={'sequence':model.input},
输出={'scores':model.output})
使用K.get_session()作为sess:
添加元图和变量(sess=sess,
tags=[tag_constants.service],
签名\定义\映射={'predict':签名})
builder.save()
使用
tensorflow\u model\u服务器预测模型

input_init=“pla panfletaria contra as leoninas taxas impostats polo ministro de xustiza real malia que vulneran”
#荷载值
窗口大小=100
字符到索引,索引到字符=加载编码的字典()
数字字符=len(字符到字符索引)
#清理文本
input_clean=clean_文本(input_init.lower())
input_clean=input_clean[:窗口大小]
#文本到数组[1,输入长度,字符数]
x_测试=np.零((1,窗口大小,数字字符))
对于t,枚举中的字符(输入_clean):
x_测试[0,t,chars_到_索引[char]]=1。
x_检验
#获取具有下一个字符的概率的数组
通道=grpc.unsecure_通道(“本地主机:+str(9000))
存根=预测\服务\ pb2\ grpc.预测服务存根(通道)
request=predict_pb2.PredictRequest()
#模型名称
request.model_spec.name='default'
request.model\u spec.signature\u name='predict'
request.inputs['inputs'].CopyFrom(
tf.contrib.util.make_tensor_proto(
x_测试,dtype='float32'))
结果=存根预测(请求)
#从数组中获取字符
test\u predict=np.array(result.outputs['outputs'].float\u val)
r=np.argmax(test_predict)#预测每个测试输入的类
d=索引到字符[r]
将模型导出到Google Cloud ML

将keras.backend导入为K
K.设置学习阶段(0)
#输入网络的大小,输入文本必须具有相同的长度
窗口大小=100
#找字典
字符到索引,索引到字符=加载编码的字典()
数字字符=len(字符到字符索引)
#重新生成模型
模型=创建模型(字符数)
模型荷载重量(
“../model_weights/best_beiras_gru_textdata_weights.hdf5”)
#导出路径,1为版本,
#我们可以用同一台服务器提供不同的版本
export_path=“../export google ml/1”
如果os.path.isdir(导出路径):
shutil.rmtree(导出路径)
builder=saved\u model\u builder.SavedModelBuilder(导出路径)
签名=预测\签名\定义(输入={'sequence':model.input},
输出={'scores':model.output})
使用K.get_session()作为sess:
添加元图和变量(sess=sess,
tags=[tag_constants.service],
signature_def_map={'serving_default':signature})
builder.save()
基于googlecloudml的预测模型

input_init=“pla panfletaria contra as leoninas taxas impostats polo ministro de xustiza real malia que vulneran”
#荷载值
窗口大小=100
字符到索引,索引到字符=加载编码的字典()
数字字符=len(字符到字符索引)
#清理文本
input_clean=clean_文本(input_init.lower())
input_clean=input_clean[:窗口大小]
#文本到数组[数字字符,窗口大小]
x_测试=np.0((数字字符、窗口大小))
对于t,枚举中的字符(输入_clean):
x_测试[chars_to_索引[char],t]=1。
service=googleapiclient.discovery.build('ml','v1')
名称='projects/{}/models/{}'。格式(项目,模型)
如果版本不是无:
名称+='/versions/{}'。格式(版本)
实例={'sequence':x_test.tolist()}
response=service.projects().predict(
name=name,
正文={'instances':实例}
).execute()
如果响应中出现“错误”:
引发运行时错误(响应['error'])
test_predict=np.array(响应['predicts'][0]['scores'])
r=np.argmax(test_predict)#预测每个测试输入的类
索引到字符[r]

我发现了问题,我在使用python3,当我改为python2.7(由gcloud推荐)时,一切正常。我发现了问题,我在使用python3,当我改为python2.7(由gcloud推荐)时,一切正常。