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