Toybrick

一维浮点数据使用rknn和pb模型结果不一致

dddeee

新手上路

积分
32
楼主
发表于 2019-4-23 19:14:57    查看: 13809|回复: 1 | [复制链接]    打印 | 只看该作者
1 生成pb(参数随机初始化,不影响前向运算):
  1. <blockquote>import tensorflow as tf
复制代码

2pb转换rknn代码
  1. from rknn.api import RKNN



  2. if __name__ == '__main__':
  3.         # 创建RKNN执行对象
  4.         rknn = RKNN()

  5.         #初始化RKNN运行环境,指定host=’rk3399pro’,后续的操作将会运行在NPU上
  6.         print('--> Init runtime environment')
  7.         ret = rknn.init_runtime()
  8.         if ret != 0:
  9.                 print('Init runtime environment failed')
  10.                 exit(ret)
  11.                 print('done')

  12.         # 配置模型输入,用于NPU对数据输入的预处理
  13.         # channel_mean_value='0 0 0 255',那么模型推理时,将会对RGB数据做如下转换
  14.         # (R - 0)/255, (G - 0)/255, (B - 0)/255。推理时,RKNN模型会自动做均值和归一化处理
  15.         # reorder_channel=’0 1 2’用于指定是否调整RBG顺序,设置成0 1 2即按输入的RGB顺序不做调整
  16.         # reorder_channel=’2 1 0’表示交换0和2通道,如果输入是RGB,将会被调整为BGR。如果是BGR将会被
  17.         # 调整为RGB
  18.         rknn.config(channel_mean_value='0 0 0 1', reorder_channel='0 1 2')

  19.         # 加载TensorFlow模型
  20.         # tf_pb='../digital_gesture_recognition/model_2500/digital_gesture.pb'指定待转换的TensorFlow模型
  21.         # inputs指定模型中的输入节点
  22.         # outputs指定模型中输出节点
  23.         # input_size_list指定模型输入的大小
  24.         print('--> Loading model')
  25.         rknn.load_tensorflow(tf_pb='test.pb',
  26.                                 inputs=['input_node'],
  27.                                 outputs=['logits'],
  28.                                 input_size_list=[[1, 1000, 1]])
  29.         print('done')

  30.         # 创建解析pb模型
  31.         # do_quantization=False指定不进行量化
  32.         # 量化会减小模型的体积和提升运算速度,但是会有精度的丢失
  33.         print('--> Building model')
  34.         rknn.build(do_quantization=False)
  35.         print('done')

  36.         # 导出保存rknn模型文件
  37.         rknn.export_rknn('test.rknn')

  38.         # Release RKNN Conte
  39.         rknn.release()
复制代码
3分别使用rknn和pb进行推理
  1. import numpy as np
  2. import tensorflow as tf
  3. from rknn.api import RKNN

  4. def load_rknn():
  5.     # 创建RKNN对象
  6.     rknn = RKNN()

  7.     # 载入RKNN模型
  8.     # print('-->loading rknn model')
  9.     rknn.load_rknn('./out1/frozen_model.rknn')
  10.     # print('loading  rknn model done')

  11.     # 初始化RKNN运行环境
  12.     # print('--> Init runtime environment')
  13.     ret = rknn.init_runtime()
  14.     if ret != 0:
  15.         print('Init runtime environment failed')
  16.         exit(ret)

  17.     print('rknn prepare done\n')

  18.     return rknn
  19. def load_pb():
  20.     with tf.gfile.GFile('test.pb', "rb") as f:  # 读取模型数据
  21.         graph_def = tf.GraphDef()
  22.         graph_def.ParseFromString(f.read())  # 得到模型中的计算图和数据
  23.         with tf.Graph().as_default() as graph:  # 这里的Graph()要有括号,不然会报TypeError
  24.             tf.import_graph_def(graph_def, name = "")  # 导入模型中的图到现在这个新的计算图中
  25.             print("pb prepare done\n")
  26.             return graph
  27. def rknn_infer(data,rknn):
  28.     outputs = rknn.inference(inputs=[data],data_type="float32")
  29.     return outputs
  30. def pb_infer(data,graph):
  31.     x = graph.get_tensor_by_name("input_node:0")  # 输入节点,RKNN转换模型时,input为"input_x"
  32.     y = graph.get_tensor_by_name("logits:0")
  33.     with tf.Session(graph = graph) as sess:
  34.         yout= sess.run([y], feed_dict = {x: data})
  35.     return yout
  36. def prepare_data():
  37.     data = np.ones(1000,dtype=np.int32)
  38.     data1 = np.reshape(data,(1,1000,1))
  39.     print(data1.dtype)
  40.     data2 = np.reshape(data,(1,1,1000,1))
  41.     return data1,data2
  42. if __name__=="__main__":
  43.     data1,data2 = prepare_data()
  44.     rknn = load_rknn()
  45.     graph = load_pb()
  46.     out1 = rknn_infer(data1,rknn)
  47.     out2 = pb_infer(data2,graph)

  48.     # print(np.sum(out2[0],axis=-1))
  49.     np.set_printoptions(suppress = True)

  50.     print("the rknn output is :{}\n".format(out1))
  51.     print("the pb output is :{}\n".format(out2))
复制代码
以上三步,完成所有过程,返回结果,但是相差很大。
输出:

  1. the rknn output is :[array([[-0.00941467,  0.00408554,  0.00399399, -0.01940918,  0.00273895,
  2.          0.00243187, -0.01450348,  0.00104523,  0.00271606,  0.00832367,
  3.          0.00605774,  0.00070429]], dtype=float32)]

  4. the pb output is :[array([[-0.02569406,  0.01786735,  0.00751904, -0.02548516, -0.02158996,
  5.          0.01359443, -0.00974836, -0.01726884,  0.02188211,  0.02064164,
  6.         -0.00169315, -0.00375702]], dtype=float32)]
复制代码
代码是.txt改成py就可以运行

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
沙发
发表于 2019-5-15 02:28:03 | 只看该作者
你好,请问问题解决了吗把我的数据是二维的也遇到了这个问题,想请教一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表