冻结tensor_forest Android 的图形



我在tensorflow中构建了一个aimple Random Forest模型,并希望针对Android冻结和优化它。 我使用以下函数来构建tesnor_forest估计器:

def build_estimator(_model_dir, _num_classes, _num_features, _num_trees, _max_nodes):
params = tensor_forest.ForestHParams(
num_classes=_num_classes, num_features=_num_features,
num_trees=_num_trees, max_nodes=_max_nodes, min_split_samples=3)
graph_builder_class = tensor_forest.RandomForestGraphs
return random_forest.TensorForestEstimator(
params, graph_builder_class=graph_builder_class,
model_dir=_model_dir)

此函数将文本模型存储到指定模型目录中的 graph.pbtxt 文件中。

然后我使用以下方法对其进行训练:

est = build_estimator(output_model_dir, 3,np.size(features_eval,1), 5,6)
train_X = features_eval.astype(dtype=np.float32)
train_Y = labels_y.astype(dtype=np.float32)
est.fit(x=train_X, y=train_Y, batch_size=np.size(features_eval,0))

(在这个简单的例子中:树数 = 5,max_nodes=6(

现在我想冻结模型,所以我调用这个函数:

def save_model_android(model_path):
checkpoint_state_name = "model.ckpt-1"
input_graph_name = "graph.pbtxt"
output_graph_name = "freezed_model.pb"
checkpoint_path = os.path.join(model_path, checkpoint_state_name)
input_graph_path = os.path.join(model_path, input_graph_name)
input_saver_def_path = None
input_binary = False
output_node_names = "output"
restore_op_name = "save/restore_all"
filename_tensor_name = "save/Const:0"
output_graph_path = os.path.join(model_path, output_graph_name)
clear_devices = True
freeze_graph(input_graph_path, input_saver_def_path,
input_binary, checkpoint_path,
output_node_names, restore_op_name,
filename_tensor_name, output_graph_path,
clear_devices, "")

在生成的 freezed_model.pb 文件中,我只得到 1 个输出节点。 在控制台中,当调用freeze_graph函数时,我收到以下消息:

Converted 0 variables to const ops.
1 ops in the final graph.

有谁知道为什么在调用freeze_graph时只导出一个节点?

我正在使用支持 cuda 的 Tensorflow 版本 1.2.1,从 Linux 上的源代码安装

我遇到了同样的问题,但是代码 fo 转换可以顺利地将另一个 CKPT 模型转移到 PB 上,在传输 deeplabV3 的 CKPT 模型时出错,我不知道。

转移代码是吹:

import tensorflow as tf
from tensorflow.python.framework import graph_util
from tensorflow.python.platform import gfile
def freeze_graph(ckpt, output_graph):
output_node_names = "logits/biases"
saver = tf.train.import_meta_graph(ckpt+'.meta', clear_devices=False)
graph = tf.get_default_graph()
input_graph_def = graph.as_graph_def()
with tf.Session() as sess:
saver.restore(sess, ckpt)
output_graph_def = graph_util.convert_variables_to_constants(
sess=sess,
input_graph_def=input_graph_def,
output_node_names=output_node_names.split(',')
)
with tf.gfile.GFile(output_graph, 'wb') as fw:
fw.write(output_graph_def.SerializeToString())
print ('{} ops in the final graph.'.format(len(output_graph_def.node)))
ckpt = './6/model.ckpt'
pb = './6/modelxxxxxx.pb'
if __name__ == '__main__':
freeze_graph(ckpt, pb)

问题解决了,我需要在 grapy 中添加另一个输出节点 就像: https://github.com/GeorgeSeif/Semantic-Segmentation-Suite/issues/63

最新更新