最近在做一个关于MobileNet的卡片识别任务,最后的目的在于把训练好的模型移植到手机端,关于的移植的步骤,网上已经讲了很多了,我就不多讲述了,这里推荐一个博客我的模型移植就是参考这里的,同时我的模型是直接通过TFhub上的MobileNet迁移学习得到的。迁移之后会生成一个pb文件,然而pb文件又不能直接使用Tensorflow-lite这一个神器,因此就必须把pb模型转化为tflite模型,在转化的时候猜到了一个坑,苦苦搜寻终于在StackOverflow上找到了解决办法,附上链接。也贴上我错误的代码:
import tensorflow as tf
in_path=r'D:\tmp_mobilenet_v1_100_224_classification_3\output_graph.pb'
out_path=r'D:\tmp_mobilenet_v1_100_224_classification_3\output_graph.tflite'
input_tensor_name='Placeholder'
input_tensor_shape={'Placeholder':[1,224,224,3]}
class_tensor_name='final_result'
convertr=tf.lite.TFLiteConverter.from_frozen_graph(in_path,input_arrays=input_tensor_name
,output_arrays=class_tensor_name
,input_shapes=input_tensor_shape)
# convertr=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir=in_path,input_arrays=[input_tensor_name],output_arrays=[class_tensor_name])
tflite_model=convertr.convert()
with open(out_path,'wb') as f:
f.write(tflite_model)
最后报错信息为
ValueError: Invalid tensors 'P''l''a''c''e''h''o''l''d''e''r' were found."
经过检查可以发现是在
input_tensor_name='Placeholder'
class_tensor_name='final_result'
当中少了两个中括号,加上去之后就可以正常生成tflite模型。
正确的代码是:
import tensorflow as tf
in_path=r'D:\tmp_mobilenet_v1_100_224_classification_3\output_graph.pb'
out_path=r'D:\tmp_mobilenet_v1_100_224_classification_3\output_graph.tflite'
input_tensor_name=['Placeholder']
input_tensor_shape={'Placeholder':[1,224,224,3]}
class_tensor_name=['final_result']
convertr=tf.lite.TFLiteConverter.from_frozen_graph(in_path,input_arrays=input_tensor_name
,output_arrays=class_tensor_name
,input_shapes=input_tensor_shape)
# convertr=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir=in_path,input_arrays=[input_tensor_name],output_arrays=[class_tensor_name])
tflite_model=convertr.convert()
with open(out_path,'wb') as f:
f.write(tflite_model)