Python 如何使用来自Google AutoML Vision Classification的TensorFlow冻结GraphDef(single saved_model.pb)进行推理和迁移学习

Python 如何使用来自Google AutoML Vision Classification的TensorFlow冻结GraphDef(single saved_model.pb)进行推理和迁移学习,python,tensorflow,tensor,transfer-learning,google-cloud-automl,Python,Tensorflow,Tensor,Transfer Learning,Google Cloud Automl,我使用的是从Google AutoML Vision导出的分类模型,因此我只有一个保存的\u model.pb,没有变量、检查点等。 我想将此模型图加载到本地TensorFlow安装中,使用它进行推理,并继续使用更多图片进行培训 主要问题: 该计划是否可行,即使用单个保存的\u model.pb而不使用变量、检查点等,并使用新数据训练生成的图形? 如果是:如何使用编码为字符串的图像获得(?,)的输入形状? 理想,展望:训练部分要考虑的重要事项? 关于代码的背景信息: 为了读取图像,我使用

我使用的是从Google AutoML Vision导出的分类模型,因此我只有一个
保存的\u model.pb
,没有变量、检查点等。 我想将此模型图加载到本地TensorFlow安装中,使用它进行推理,并继续使用更多图片进行培训

主要问题:

  • 该计划是否可行,即使用单个
    保存的\u model.pb
    而不使用变量、检查点等,并使用新数据训练生成的图形?

  • 如果是:如何使用编码为字符串的图像获得
    (?,)
    的输入形状?

  • 理想,展望:训练部分要考虑的重要事项?


关于代码的背景信息:

  • 为了读取图像,我使用了与使用Docker容器进行推断时相同的方法,因此使用base64编码图像

  • 要加载图形,我通过CLI(
    saved\u model\u CLI show--dir input/model
    )检查了图形所需的标记集,即
    service

  • 为了获取输入张量名称,我使用了
    graph.get\u operations()
    ,它为图像字节提供了
    占位符:0
    ,为键提供了
    占位符:1\u 0
    (只需标识图像的任意字符串)。两者都有维度
    dim-1

将tensorflow导入为tf
将numpy作为np导入
导入base64
path_img=“input/testimage.jpg”
path\u mdl=“输入/模型”
#网络输入应为base64编码图像
将io.open(path_img,'rb')作为图像文件:
encoded_image=base64.b64编码(image_file.read()).decode('utf-8')
#当预期尺寸为(?,)时,重塑为(1,)
馈送命令选项1={
占位符:0:{np.array(str(encoded_image)).resforme(1,)},
占位符\u 1:0:“图像\u键”
}
#当预期尺寸为(?,)时,重塑为(1,1)
馈送命令选项2={
“占位符:0”:np.数组(str(编码的_图像)).重塑(1,1),
占位符\u 1:0:“图像\u键”
}
使用tf.Session(graph=tf.graph())作为sess:
tf.saved_model.loader.load(sess,[“service”],path_mdl)
graph=tf.get\u default\u graph()
成绩运行('分数:0',
提要内容=提要内容选项1)
成绩运行('分数:0',
提要内容=提要内容选项2)
输出:

#用于将输入整形为(1,)
ValueError:无法为具有形状“(?,)”的张量“占位符:0”提供形状(1,)的值
#对于重塑为(1,1)的输入
ValueError:无法为张量“占位符:0”提供形状(1,1)的值,该张量具有形状“(?,)”
如何获得
(?,)


非常感谢。

是的!有可能,我有一个应该类似的对象检测模型,我可以在tensorflow 1.14.0中运行它,如下所示:

import cv2
cv2.imread(filepath)
flag, bts = cv.imencode('.jpg', img)
inp = [bts[:,0].tobytes()]
out = sess.run([sess.graph.get_tensor_by_name('num_detections:0'),
                sess.graph.get_tensor_by_name('detection_scores:0'),
                sess.graph.get_tensor_by_name('detection_boxes:0'),
                sess.graph.get_tensor_by_name('detection_classes:0')],
               feed_dict={'encoded_image_string_tensor:0': inp})
我用netron查找我的输入

在tensorflow 2.0中更容易:

import cv2
cv2.imread(filepath)
flag, bts = cv.imencode('.jpg', img)
inp = [bts[:,0].tobytes()]
saved_model_dir = '.'
loaded = tf.saved_model.load(export_dir=saved_model_dir)
infer = loaded.signatures["serving_default"]
out = infer(key=tf.constant('something_unique'), image_bytes=tf.constant(inp))

另外
保存的\u模型。pb
不是一个
冻结的\u推理图。pb
,请参阅:

感谢您的简明回答!您帮助我在代码中发现了两个问题:首先,网络不需要numpy数组(
np.Array
)中的输入图像,而是在常规python列表中(
[…]
)。其次,通过
base64.b64encode
编码不起作用,但通过opencv python与
cv2.imread
cv2.imencode
进行编码。还感谢您对保存的模型与冻结的图形的澄清!