Keras的.h5模型转成tensorflow的.pb格式模型,方便后期的前端部署。直接上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
from keras.models import Model from keras.layers import Dense, Dropout from keras.applications.mobilenet import MobileNet from keras.applications.mobilenet import preprocess_input from keras.preprocessing.image import load_img, img_to_array import tensorflow as tf from keras import backend as K import 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_io graph_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')`
直接转换
1
2
3
|
`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
1
2
3
4
5
6
7
8
9
10
11
12
13
|
``` git clone git@github.com:amir - abdi / keras_to_tensorflow.git cd keras_to_tensorflow python keras_to_tensorflow.py - - input_model = path / to / tf.h5 - - output_model = path / to / tf.pb tflite_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操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/q6324266/article/details/85262438