在不导入张量流的情况下加载张量流模型

时间:2019-05-22 15:23:17

标签: python tensorflow

是否可以训练张量流模型,然后将其导出为无需张量流即可访问的模型?我想将一些机器学习应用于学校项目,在该项目中,代码是通过在线门户提交的-尽管它没有安装tensorflow,但仅安装了标准库。我可以上传其他文件,但是任何tensorflow文件都需要tensorflow才能理解...我是否必须从头开始编写ML代码?

3 个答案:

答案 0 :(得分:1)

差不多,除非您在应用程序中带来了tensorflow及其所有文件。除此之外,否,您不能导入tensorflow或拥有任何依赖于tensorflow的模块或代码。

答案 1 :(得分:1)

是的,有可能。假设您使用的是非常简单的网络,例如2或3层完全连接的NN,则可以将.pb文件的权重和偏差项保存/提取为任何格式(例如.csv),并相应地使用它们。

例如,

import tensorflow as tf
import numpy as np
from tensorflow.python.platform import gfile
from tensorflow.python.framework import tensor_util


gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.3)

config = tf.ConfigProto(allow_soft_placement=True,
                        log_device_placement=True,
                        gpu_options=gpu_options)

GRAPH_PB_PATH = "./YOUR.pb"
with tf.Session(config=config) as sess:
    print("load graph")
    with gfile.FastGFile(GRAPH_PB_PATH, 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        sess.graph.as_default()
        tf.import_graph_def(graph_def, name='')
        graph_nodes = [n for n in graph_def.node]
        wts = [n for n in graph_nodes if n.op == 'Const']

result = []
result_name = []
for n in wts:
    result_name.append(n.name)
    result.append(tensor_util.MakeNdarray(n.attr['value'].tensor))

np.savetxt("layer1_weight.csv", result[0], delimiter=",")
np.savetxt("layer1_bias.csv", result[1], delimiter=",")
np.savetxt("layer2_weight.csv", result[2], delimiter=",")
np.savetxt("layer2_bias.csv", result[3], delimiter=",")

答案 2 :(得分:0)

如果仅使用简单的完全连接的层,则可以在numpy中实现它们而不会出现大问题。将内核和偏差保存到文件中(或将权重作为python常量注入代码中)并针对每一层进行操作:

# preallocate w once at the beginning for each layer
w = np.empty([len(x), layer['kernel'].shape[1]])
# x is input, mult kernel with x, write result to w
x.dot(layer['kernel'], out=w) # matrix mult with kernel
w += layer['bias'] # add bias
out = np.maximum(w, 0)  # ReLU

或者您可以尝试以下lib(对于旧的tensorflow版本):https://github.com/riga/tfdeploy。它仅使用numpy完全编写,您可以尝试从中削减一些代码段。