现在,我正在使用来自tensorflow的默认retrain.py来训练图像分类模型。但是,当我在google ai平台上提供模型并尝试调用api时,我收到一条错误消息,指出图像太大,因为它是float32数组。我认为最好的办法是更改retrain.py以获取b64图像而不是float32数组,但是我不知道该怎么做。有什么建议吗?
感谢您的帮助!谢谢!
更新
def export_model(module_spec, class_count, saved_model_dir):
sess, in_image, _, _, _, _ = build_eval_session(module_spec, class_count)
image = tf.placeholder(shape=[None], dtype=tf.string)
export_dir = "/tmp/save/"
inputs = {'image_bytes': image}
with sess.graph.as_default() as graph:
tf.saved_model.simple_save(sess, export_dir, inputs, {'prediction': graph.get_tensor_by_name('final_result:0')})
这是我更新的代码,但是仍然无法正常工作
答案 0 :(得分:0)
看看this post,其中包含您需要的信息。如果没有,请回复,我将帮助您准备一些代码,但是您可能需要url安全的b64变体。
编辑
您的代码有点混乱,我不认为输入已经连接到您的图形,您是否用tf.summary.FileWriter('output folder',sess.graph)看了图形?
我将逐步尝试解释如何在模型前面构建一些图层,并提供一些示例,该代码不应位于retrain.py中,并且可以在训练模型后运行。
1)加载tensorflow模型,如果它是使用saveModelBuilder或简单的保存方法构建的,则可以像this那样进行操作:
def loader(path):
with tf.Session(graph=tf.Graph()) as sess:
tf.saved_model.loader.load(sess, [tag_constants.TRAINING], path)
return tf.get_default_graph().as_graph_def()
可以使用saved_model_cli tool检查标记常量,在您的情况下,可能必须为空[]。
2)添加所需的层/张量,需要一些东西来接受字节字符串,或者在这种情况下需要以64为基数,将其解码并将其转换为3D图像:
image_str_tensor = tf.placeholder(dtype=tf.string, shape=(None,), name='input_image_bytes')
input_image = tf.decode_base64(image_str_tensor)
decoder = tf.image.decode_jpeg(input_image[0], channels=3)
如果您从retrain.py获得了其他张量,例如转换为float,dim_expanding和重塑,则应该已经在图中。
3)通过将它们输入到图形中来实现它们。
graph_def_inception = loader('path to your saved model')
output_prediction, = tf.import_graph_def(graph_def_inception, input_map={"DecodeJpeg:0": decoder}, return_elements=['final_result:0'], name="")
4)创建一个保存的模型,并检查是否一切都符合您的要求!
builder = tf.saved_model.builder.SavedModelBuilder('output/model/path')
with tf.Session() as sess:
tf.summary.FileWriter('output/graph_log/files', sess.graph)
input_tensor_info = tf.saved_model.utils.build_tensor_info(input_image)
output_tensor_info = tf.saved_model.utils.build_tensor_info(output_prediction)
signature = tf.saved_model.signature_def_utils.build_signature_def(
inputs={'input_image': input_tensor_info},
outputs={'output_prediction': output_tensor_info},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
# save as SavedModel
builder.add_meta_graph_and_variables(sess,
[tf.saved_model.tag_constants.SERVING],
signature_def_map={'serving_default': signature})
builder.save()
5)如果遇到错误,请尝试使用张量板进行调试
tensorboard --logdir=output/graph_log/files
我希望能有所帮助,此代码从第一次尝试就不会起作用,您需要对某些部分感到困惑。如果您确实无法成功,那么应该共享模型,也许我可以这样做,并且如果有时间的话可以与您共享代码。