Keras模型转成tensorflow的.pb操作

时间:2021-05-22

Keras的.h5模型转成tensorflow的.pb格式模型,方便后期的前端部署。直接上代码

from keras.models import Modelfrom keras.layers import Dense, Dropoutfrom keras.applications.mobilenet import MobileNetfrom keras.applications.mobilenet import preprocess_inputfrom keras.preprocessing.image import load_img, img_to_arrayimport tensorflow as tffrom keras import backend as Kimport os base_model = MobileNet((None, None, 3), alpha=1, include_top=False, pooling='avg', weights=None)x = Dropout(0.75)(base_model.output)x = Dense(10, activation='softmax')(x) model = Model(base_model.input, x)model.load_weights('mobilenet_weights.h5') def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True): from tensorflow.python.framework.graph_util import convert_variables_to_constants graph = session.graph with graph.as_default(): freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or [])) output_names = output_names or [] output_names += [v.op.name for v in tf.global_variables()] input_graph_def = graph.as_graph_def() if clear_devices: for node in input_graph_def.node: node.device = "" frozen_graph = convert_variables_to_constants(session, input_graph_def, output_names, freeze_var_names) return frozen_graph output_graph_name = 'NIMA.pb'output_fld = ''#K.set_learning_phase(0) print('input is :', model.input.name)print ('output is:', model.output.name) sess = K.get_session()frozen_graph = freeze_session(K.get_session(), output_names=[model.output.op.name]) from tensorflow.python.framework import graph_iograph_io.write_graph(frozen_graph, output_fld, output_graph_name, as_text=False)print('saved the constant graph (ready for inference) at: ', os.path.join(output_fld, output_graph_name))

补充知识:keras h5 model 转换为tflite

在移动端的模型,若选择tensorflow或者keras最基本的就是生成tflite文件,以本文记录一次转换过程。

环境

tensorflow 1.12.0

python 3.6.5

h5 model saved by `model.save('tf.h5')`

直接转换

`tflite_convert --output_file=tf.tflite --keras_model_file=tf.h5`output`TypeError: __init__() missing 2 required positional arguments: 'filters' and 'kernel_size'`

先转成pb再转tflite

```git clone git@github.com:amir-abdi/keras_to_tensorflow.gitcd keras_to_tensorflowpython keras_to_tensorflow.py --input_model=path/to/tf.h5 --output_model=path/to/tf.pbtflite_convert \ --output_file=tf.tflite \ --graph_def_file=tf.pb \ --input_arrays=convolution2d_1_input \ --output_arrays=dense_3/BiasAdd \ --input_shape=1,3,448,448```

参数说明,input_arrays和output_arrays是model的起始输入变量名和结束变量名,input_shape是和input_arrays对应

官网是说需要用到tenorboard来查看,一个比较trick的方法

先执行上面的命令,会报convolution2d_1_input找不到,在堆栈里面有convert_saved_model.py文件,get_tensors_from_tensor_names()这个方法,添加`print(list(tensor_name_to_tensor))` 到 tensor_name_to_tensor 这个变量下面,再执行一遍,会打印出所有tensor的名字,再根据自己的模型很容易就能判断出实际的name。

以上这篇Keras模型转成tensorflow的.pb操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章