无法使用训练好的Tensorflow模型

Tor*_*ikh 6 image-processing python-3.x deep-learning tensorflow tensorboard

我是深度学习和Tensorflow的新手。我重新训练了一个预训练过的tensorflow inceptionv3模型为save_model.pb,以识别不同类型的图像,但是当我尝试将fie与以下代码一起使用时。

with tf.Session() as sess:
    with tf.gfile.FastGFile("tensorflow/trained/saved_model.pb",'rb') as  f:
        graph_def = tf.GraphDef()
        tf.Graph.as_graph_def()
        graph_def.ParseFromString(f.read())
        g_in=tf.import_graph_def(graph_def)
        LOGDIR='/log'
        train_writer=tf.summary.FileWriter(LOGDIR)
        train_writer.add_graph(sess.graph)
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误-

 File "testing.py", line 7, in <module>
graph_def.ParseFromString(f.read())
google.protobuf.message.DecodeError: Error parsing message
Run Code Online (Sandbox Code Playgroud)

我尝试了很多可以找到这个问题的解决方案,并且使用graph_def.ParseFromString(f.read())函数的tensorflow / python / tools中的模块给了我同样的错误。请告诉我如何解决此问题或告诉我可以避免ParseFromString(f.read())函数的方式。任何帮助,将不胜感激。谢谢!

anu*_*ove 6

我假设您使用TensorFlowtf.saved_model.Builder提供的保存了您训练好的模型,在这种情况下,您可能会执行以下操作:

负载模型

export_path = './path/to/saved_model.pb'

# We start a session using a temporary fresh Graph
with tf.Session(graph=tf.Graph()) as sess:
    '''
    You can provide 'tags' when saving a model,
    in my case I provided, 'serve' tag 
    '''

    tf.saved_model.loader.load(sess, ['serve'], export_path)
    graph = tf.get_default_graph()

    # print your graph's ops, if needed
    print(graph.get_operations())

    '''
    In my case, I named my input and output tensors as
    input:0 and output:0 respectively
    ''' 
    y_pred = sess.run('output:0', feed_dict={'input:0': X_test})
Run Code Online (Sandbox Code Playgroud)

为了在此处提供更多上下文,这就是我保存模型的方式,该模型可以按上述方式加载。

保存模型


x = tf.get_default_graph().get_tensor_by_name('input:0')
y = tf.get_default_graph().get_tensor_by_name('output:0')

export_path = './models/'
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
signature = tf.saved_model.predict_signature_def(
                inputs={'input': x}, outputs={'output': y}
                )

# using custom tag instead of: tags=[tf.saved_model.tag_constants.SERVING]
builder.add_meta_graph_and_variables(sess=obj.sess,
                                     tags=['serve'],
                                     signature_def_map={'predict': signature})
builder.save()

Run Code Online (Sandbox Code Playgroud)

这会将您的 protobuf('saved_model.pb')保存在上述文件夹(此处为'models')中,然后可以如上所述加载。


小智 5

保存模型时是否传递了 as_text=False ?请查看:TF save/restore graph failed at tf.GraphDef.ParseFromString()


Nag*_*ran 5

请使用frozen_inference_graph.pb加载模型,而不是使用saved_model.pb

Model_output
- saved_model
  - saved_model.pb
- checkpoint
- frozen_inference_graph.pb     # Main model 
- model.ckpt.data-00000-of-00001
- model.ckpt.index
- model.ckpt.meta
- pipeline.config
Run Code Online (Sandbox Code Playgroud)

  • 这其实是我的问题!谢谢你! (2认同)