前言
当用户基于各种原因学习并使用了一种框架的时候,常常会发现应用或者再训练的场景改变了,比如用户用 Caffe 训练好了一个图像识别的模型,但是生产环境是使用 TensorFlow 做预测。再比如某机构主要以TensorFlow作为基础的深度学习开发框架,现在有一个深度算法项目,需要将其部署在移动设备上,并希望使用速度较优的ncnn前向框架,以观测变现等等。传统地我们可能需要用tf重写Caffe,或用Caffe2重写tf,然后再训练参数,试想这将是一个多么耗时耗力的过程。
因此,深度学习模型转换技术在AI工程化中将变得越来越重要。本人花了将近半个月的时间完成现有模型转换的技术调研,并将模型转换技术涉及到知识点以及实际转换时容易遇到的问题梳理成多个章节进行粗劣地讲解。具体分为深度学习模型简介、深度学习模型转换技术和模型转换之实战这三部分内容,并在文章的最后作了简单的总结。
深度学习模型简介
深度学习模型是指一种包含深度神经网络结构的机器学习模型。算法工程师使用某种深度学习框架构建好模型,经调参和训练优化后,将最终生成的网络参数和模型结构一并保存,得到的文件即为可用于前向推理的模型文件。不同深度学习框架训练得到的模型文件的格式不尽相同,但完整的模型文件一般都包含了张量数据、运算单元和计算图等信息。
1.1 张量(Tensor)
张量(Tensor)是深度学习系统的数据容器,它可以理解为矩阵向任意维度的扩展。仅包含一个数字的张量叫作标量(Scalar,也叫标量张量、零维张量、0D张量);数字组成的数组叫作向量(Vector)或一维张量(1D张量),而向量组成的数组叫作矩阵(Matrix)或二维张量(2D张量);将多个矩阵组合成一个新的数组,可以得到一个 3D 张量,你可以将其直观地理解为数字组成的立方体;将多个3D张量组合成一个数组,可以创建一个4D张量,以此类推。深度学习处理的一般是0D到4D 的张量,但处理视频数据时可能会遇到5D张量。
1.2 运算单元(Operation/Operator)
运算单元(Operation/Operator,常见的翻译还有计算单元、操作符、算子等)表示一种符号化的运算过程,是主流深度学习框架的基本单元,即图中的节点。它的输入和输出都是张量(Tensor)。所有计算机程序最终都可以简化为二进制输入上的一些二进制运算(AND、OR、NOR等),类似地,深度神经网络学到的所有变换也都可以简化为数值数据张量上的一些张量运算(Tensor operation),如图1的tf.add函数为TensorFlow一个简单的加法运算单元。
图1 TensorFlow的add运算单元
常见的运算单元有Add、BatchNormalization 、Conv、GRU、LRN、LSTM、MaxPool、Relu、RNN、So