so动态链接库,这个链接库中包括了我们神经网络所需要的一切推断功能。
那么怎么导出呢?其实官方已经有很详细的导出说明。我这里不进行赘述了,仅仅展示核心的代码加以注释即可。
请看以下的代码:
#开始同样是读取.onnx模型
onnx_model = onnx.load('../../test/new-mobilenetv2-128_S.onnx')
img = Image.open('../../datasets/hand-image/paper.jpg').resize((128, 128))
# 以下的图片读取仅仅是为了测试
img = np.array(img).transpose((2, 0, 1)).astype('float32')
img = img/255.0 # remember pytorch tensor is 0-1
x = img[np.newaxis, :]
# 这里首先在PC的CPU上进行测试 所以使用LLVM进行导出
target = tvm.target.create('llvm')
input_name = '0' # change '1' to '0'
shape_dict = {input_name: x.shape}
sym, params = relay.frontend.from_onnx(onnx_model, shape_dict)
# 这里利用TVM构建出优化后模型的信息
with relay.build_config(opt_level=2):
graph, lib, params = relay.build_module.build(sym, target, params=params)
dtype = 'float32'
from tvm.contrib import graph_runtime
# 下面的函数导出我们需要的动态链接库 地址可以自己定义
print("Output model files")
libpath = "../tvm_output_lib/mobilenet.so"
lib.export_library(libpath)
# 下面的函数导出我们神经网络的结构,使用json文件保存
graph_json_path = "../tvm_output_lib/mobilenet.json"
with open(graph_json_path, 'w') as fo:
fo.write(graph)
# 下面的函数中我们导出神经网络模型的权重参数
param_path = "../tvm_output_lib/mobilenet.params"
with open(param_path, 'wb') as fo:
fo.write(relay.save_param_dict(params))
# -------------至此导出模型阶段已经结束--------
# 接下来我们加载导出的模型去测试导出的模型是否可以正常工作
loaded_json = open(graph_json_path).read()
loaded_lib = tvm.module.load(libpath)
loaded_params = bytearray(open(param_path, "rb").read())
# 这里执行的平台为CPU
ctx = tvm.cpu()
module = graph_runtime.create(loaded_json, loaded_lib, ctx)
module.load_params(loaded_params)
module.set_input("0", x)
module.run()
out_deploy = module.get_output(0).asnumpy()
print(out_deploy)
上述的代码输出[[13.680096 -7.218611 -6.7872353]]
,因为输入的图像是paper.jpg
,所以输出的三个数字第一个数字最大,没有毛病。
执行完代码之后我们就可以得到需要的三个文件
得到三个文件之后,接下来我们利用TVM的C++端读取并运行起来。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!