How to verify optimized model in tensorflow

£可爱£侵袭症+ 提交于 2019-12-24 17:17:24

问题


I'm following a tutorial from codelabs. They use this script to optimize the model

python -m tensorflow.python.tools.optimize_for_inference \
  --input=tf_files/retrained_graph.pb \
  --output=tf_files/optimized_graph.pb \
  --input_names="input" \
  --output_names="final_result"

they verify the optimized_graph.pb using this script

python -m scripts.label_image \
    --graph=tf_files/optimized_graph.pb \
    --image=tf_files/flower_photos/daisy/3475870145_685a19116d.jpg

The problem is I try to use optimize_for_inference to my own code which is not for image classification.

Previously, before optimizing, I use this script to verify my model by test it to a sample data:

import tensorflow as tf
from tensorflow.contrib import predictor
from tensorflow.python.platform import gfile
import numpy as np

def load_graph(frozen_graph_filename):
    with tf.gfile.GFile(frozen_graph_filename, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())

    with tf.Graph().as_default() as graph:
        tf.import_graph_def(graph_def, name="prefix")

    input_name = graph.get_operations()[0].name+':0'
    output_name = graph.get_operations()[-1].name+':0'

    return graph, input_name, output_name

def predict(model_path, input_data):
    # load tf graph
    tf_model,tf_input,tf_output = load_graph(model_path)

    x = tf_model.get_tensor_by_name(tf_input)
    y = tf_model.get_tensor_by_name(tf_output) 

    model_input = tf.train.Example(
        features=tf.train.Features(feature={
        "thisisinput": tf.train.Feature(float_list=tf.train.FloatList(value=input_data)),
    }))
    model_input = model_input.SerializeToString()

    num_outputs = 3
    predictions = np.zeros(num_outputs)
    with tf.Session(graph=tf_model) as sess:
        y_out = sess.run(y, feed_dict={x: [model_input]})
        predictions = y_out

    return predictions

if __name__=="__main__":
    input_data = [4.7,3.2,1.6,0.2] # my model recieve 4 inputs
    print(np.argmax(predict("not_optimized_model.pb",x)))

but after optimizing the model, my testing script doesn't work. It raises an error:

ValueError: Input 0 of node import/ParseExample/ParseExample was passed float from import/inputtensors:0 incompatible with expected string.

So my question is how to verify my model after optimizing the model? I can't use --image command like the tutorial.


回答1:


I've solved the error by changing the placeholder's type with tf.float32 when exporting the model:

def my_serving_input_fn():
    input_data = {
        "featurename" : tf.placeholder(tf.float32, [None, 4], name='inputtensors')
    }
    return tf.estimator.export.ServingInputReceiver(input_data, input_data)

and then change the prediction function above to:

def predict(model_path, input_data):
    # load tf graph
    tf_model, tf_input, tf_output = load_graph(model_path)

    x = tf_model.get_tensor_by_name(tf_input)
    y = tf_model.get_tensor_by_name(tf_output) 

    num_outputs = 3
    predictions = np.zeros(num_outputs)
    with tf.Session(graph=tf_model) as sess:
        y_out = sess.run(y, feed_dict={x: [input_data]})
        predictions = y_out

    return predictions

After freezing the model, the prediction code above will be work. But unfortunately it raises another error when trying to load pb directly after exporting the model.



来源:https://stackoverflow.com/questions/52181099/how-to-verify-optimized-model-in-tensorflow

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!