如何解决Tensorflow 保存的模型不包含输入名称
我们目前正在 tensorflow 2.4.0 中训练一个对象检测模型,该模型运行良好。然而,为了能够为它服务,我们需要用一个图像预处理层包装它,该层将图像字节作为输入并将它们转换为检测模型所需的图像张量。看下面的代码:
png_file = 'myfile.png'
input_tensor = tf.io.read_file(png_file,name='image_bytes')
def preprocessing_layer(inputs):
image_tensor = tf.image.decode_image(inputs,channels=3)
image_tensor = tf.expand_dims(
image_tensor,axis=0,name=None
)
return image_tensor
model = keras.Sequential(
[
keras.Input(tensor=input_tensor,dtype=tf.dtypes.string,name='image_bytes',batch_size=1),tf.keras.layers.Lambda(lambda inp: preprocessing_layer(inp)),yolo_model
]
)
model.summary()
这个包装模型提供了有用的检测,如果我们调用 model.input_names
,将返回正确的名称:['image_bytes']
。
现在,如果我们使用 model.save('model_path')
保存模型,保存的模型不再包含输入名称,而是用通用名称 (args_0
) 替换它们。
signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['args_0'] tensor_info:
dtype: DT_STRING
shape: ()
name: serving_default_args_0:0
The given SavedModel SignatureDef contains the following output(s):
outputs['model'] tensor_info:
dtype: DT_FLOAT
shape: (1,64512,6)
这是一个问题,因为 tensorflow 服务依赖于以 _bytes
结尾的名称来转换 base64 输入。
您能否提供有关在保存模型时如何保留输入名称的提示?
解决方法
问题源于您定义 lambda 层的方式,以及您设置模型的方式。
您的 lambda 函数应该能够处理批处理,目前情况并非如此。您可以天真地使用 we can separate "your.name" from the POM by specifying a filter file my-filter-values.properties containing:
使其处理一批图像,如下所示:
tf.map_fn
然后您可以使用符号 def preprocessing_layer(str_inputs):
def decode(inputs):
image_tensor = tf.image.decode_image(inputs[0],channels=3)
image_tensor = tf.expand_dims(
image_tensor,axis=0,name=None
)
return image_tensor
return tf.map_fn(decode,str_inputs,fn_output_signature=tf.uint8)
定义模型,将形状设置为 tf.keras.Input
(指定除批量大小之外的其他维度):
()
现在模型已正确创建,签名可以正确导出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。