栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

tf2onnx模型转换与加载

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

tf2onnx模型转换与加载

## 获得随机数
def generateRandomInput(batch_size=16):
    xs= np.random.randn(batch_size, 784)
    ys=np.zeros((batch_size,10))
    for i in range(batch_size):
        ys[i][np.random.randint(0, 10)]=1
    return xs,ys

## 构造训练数据
def getFixedInput(reuse=None):
    if reuse:
        with open("test.txt", "r", encoding="utf-8") as f:
            xsInputs=[]
            ysInputs=[]
            for line in f.readlines():
                d=json.loads(line)
                xsInputs.append([float(i) for i in d["xs"].split(",")])
                ysInputs.append([float(i) for i in d["ys"].split(",")])
            return np.array(xsInputs),np.array(ysInputs)
    xs,ys=generateRandomInput(10000)
    with open("test.txt","w",encoding="utf-8") as f:
        for (x,y) in zip(xs,ys):
            d=dict()
            d["xs"]=",".join([str(i) for i in list(x)])
            d["ys"]=",".join([str(i) for i in list(y)])
            json.dump(d, f)
            f.write('n')
    return xs,ys


## 构造训练数据
def getFixedInput(reuse=None):
if reuse:
with open("test.txt", "r", encoding="utf-8") as f:
xsInputs=[]
ysInputs=[]
for line in f.readlines():
d=json.loads(line)
xsInputs.append([float(i) for i in d["xs"].split(",")])
ysInputs.append([float(i) for i in d["ys"].split(",")])
return np.array(xsInputs),np.array(ysInputs)
xs,ys=generateRandomInput(10000)
with open("test.txt","w",encoding="utf-8") as f:
for (x,y) in zip(xs,ys):
d=dict()
d["xs"]=",".join([str(i) for i in list(x)])
d["ys"]=",".join([str(i) for i in list(y)])
json.dump(d, f)
f.write('n')
return xs,ys


## 模型生成和onnx模型保存
def train_model(model_dir):
tf.reset_default_graph()
config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
config.gpu_options.per_process_gpu_memory_fraction = 0.99

 with tf.Session(config=config) as sess:
## 定义x,y,keep_prob占位符
 xs = tf.placeholder(tf.float32, [None, 784],name="xs")
ys = tf.placeholder(tf.float32, [None, 10],name="ys")
keep_prob = tf.placeholder(tf.float32,name="keep_prob")
# keep_prob = tf.placeholder_with_default(1.0, shape=(), name="keep_prob") # dropout (keep probability
 x_image = tf.reshape(xs, [-1, 28, 28, 1]) # [n_samples,28,28,1] -1代表输入暂时不定可以多张输入
 with tf.variable_scope("conv1_layer"):
### conv1 layer ###
 W_conv1 = weight_variable([5, 5, 1, 32],) ##patch 5x5 ,in size 1,out size 32
 b_conv1 = biases_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # out size 28x28x32
 h_pool1 = max_pool_2x2(h_conv1) # out size 14x14x32
 with tf.variable_scope("conv2_layer"):
###conv2 layer ###
 W_conv2 = weight_variable([5, 5, 32, 64]) # patch 5x5 ,in size 32 ,out size 64
 b_conv2 = biases_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) # out size 14x14x32
 h_pool2 = max_pool_2x2(h_conv2) # output size 7x7x64
 with tf.variable_scope("fc1_layer"):
### fc1 layer###
 W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = biases_variable([1024])
## [n_samples ,7 ,7 ,64] ->> [n_samples ,7x7x64]
 h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
# h_fc1_drop=h_fc1
 with tf.variable_scope("fc2_layer"):
### fc2 layer###
 W_fc2 = weight_variable([1024, 10])
b_fc2 = biases_variable([10])
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2,name="predict")
tf.identity(prediction, name="output")


loss = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)

init = tf.initialize_all_variables()

sess.run(init)


# for i in range(1000):
 batch_xs, batch_ys = generateRandomInput(16)

# print(type(batch_xs), batch_ys.shape)
 sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys, keep_prob: 0.5})
# sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys})

 node_names_list = [tensor.name for tensor in tf.get_default_graph().as_graph_def().node]
# for node_name in node_names_list:
 # print(node_name)
 saver = tf.train.Saver() # 实例化saver对象,用于保存模型
 saver.save(sess, '{}/mymodel'.format(model_dir))

save_pb_model(sess, '{}/'.format(model_dir), ['output'])
# print('my model saved in file:', my_model)
 frozen_graph = freeze_session(sess, input_names=["xs:0","keep_prob:0"],output_names=["output:0"]) ##模型冻结,将参数固化
 with tf.Graph().as_default() as tf_graph:
tf.import_graph_def(frozen_graph, name='')
with tf.Session(graph=tf_graph) as sess:
onnx_graph = tf2onnx.tfonnx.process_tf_graph(sess.graph, input_names=["xs:0","keep_prob:0"], output_names=["output:0"])
# onnx_graph = tf2onnx.tfonnx.process_tf_graph(sess.graph, input_names=["xs:0"],output_names=["output:0"])
 model_proto = onnx_graph.make_model("model")
with open("{}/model.onnx".format(model_dir), "wb") as f: ##onnx模型保存
 f.write(model_proto.SerializeToString())
print("done")
##onnx 模型加载
def myCheckONNX( xs, ys ,model_dir):
    print("myCheckONNX")
    onnx_model = onnx.load("{}/model.onnx".format(model_dir))
    onnx.checker.check_model(onnx_model)
    import onnxruntime

    ort_session = onnxruntime.InferenceSession("{}/model.onnx".format(model_dir),providers=['CUDAExecutionProvider'])

    def to_numpy(tensor):
        return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()


    # compute ONNX Runtime output prediction
    # ort_inputs = {ort_session.get_inputs()[0].name: input1,ort_session.get_inputs()[1].name:d[0]}
    print(ort_session.get_inputs()[1].name)
    a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='float64')
    c = a.astype(np.float32)
    ort_inputs = {ort_session.get_inputs()[0].name: xs.astype(np.float32),ort_session.get_inputs()[1].name: np.array((1.0)).astype(np.float32)}

    ort_outs = ort_session.run(["output:0"], ort_inputs)
    print(ort_outs)

    return ort_outs[0]

if __name__ == '__main__':
    model_dir="models_keepProb"

    train_model(model_dir)
    xs, ys = getFixedInput()
    res_onnx=myCheckONNX(xs, ys,model_dir)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954380.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号