研究背景
神经网络训练完成后在实际部署时仍需要安装神经网络开发用到的框架库,往往上百MB,非常繁琐,但实际应用中往往只需要前推过程即可,因此本课题研究旨在将框架代码转为无需安装框架库即可运行的基础代码,以python+tensorflow为例。
研究问题
以MNIST识别为例,研究全连接网络的代码转换问题。
模型结构采用全连接网络:
inputs = tf.keras.Input(shape=(x_train.shape[1],x_train.shape[2], 1), name='data')
# for 32*32 input
x = tf.keras.layers.Flatten()(inputs)
x = tf.keras.layers.Dense(120, activation='relu')(x)
x = tf.keras.layers.Dense(84, activation='relu')(x)
outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs, name='LeNet')
数据集样例图
训练10次的过程指标曲线:
最后达到的精度:97%
课题实验
目的:
将模型加载后读取各层信息,按照各层对应的前推公式计算 W T X + b W^TX+b WTX+b,循环遍历到最后的输出层后输出结果,即num_classes维的类别预测向量,再转为预测的类别即可达到转换效果。最后需要测试准确率,预期目标是转换后的代码测试准确率不得明显低于转换前的测试准确率,否则即使转换了代码降低了模型部署门槛,但实际的应用效果大打折扣也是无意义的。
效果:
以上是在输入图像不÷255的条件下得到的结果,即输入范围是0~255;
如果÷255,即输入范围是0~1:
根据两次实验的结果证明:
- 转换代码可以正常运行,且效果(acc)跟预期一致
- 转换代码可适应大数值计算(0~255输入场景)
NOTE:发现 MNIST模型训练好后对是否÷255的图像均具有较好的预测效果,具体表现为acc: 0.971和0.9706
课题应用
目的:
转换代码是非常有效的,虽然只做了全连接层、输入层、Flatten层,但已经证明了理论的可行性和实践落地的可行性。在应用阶段,应考虑如何使用转换后的代码替换之前的依赖于框架的模型代码。
使用np.save和np.load完成类的对象的保存和加载。
为找寻转换为基础代码后的最小依赖和代码量,重写一个代码文件:
import numpy as np
x_test = np.load("x_test.npy",)
y_test = np.load("y_test.npy",)
# definetion
这里是类的定义,如果不写会报错,具体类的定义内容是本博客的核心技术,需购买。
# load convert_model 加载自定义的模型
convert_model = np.load("convert_model.npy",allow_pickle=True).tolist()
# convert_model.print()#打印模型的成员变量 确认该对象确实是之前训练好的对象
output = convert_model.infer(x_test)#使用基础代码完成推理过程
output = np.argmax(output, axis=-1)
y_test = np.argmax(y_test, axis=-1)
acc = np.mean(output == y_test)
print("使用加载的模型 代码转换后 acc:", acc)
代码正常执行,由此可见,最小依赖就是numpy库,而anaconda3安装后默认是安装有numpy库的,所以本课题研究目的达到,课题未来可考虑卷积层等高级网络层的推理过程加入,实现对标tensorflow网络框架的基础代码转换标准和参考。注意:这里没有测试使用基础代码的执行速度,预期是更快,但没有实际比测过时间。
备注
如需技术支持(源码+本项目相关的任何问题答疑),请打赏支付宝并添加支付宝好友备注。
代码质量可靠有保障,提供了丰富的用户接口可以自定义实验,还可根据你的个性化需求进行代码定制修改,比如添加网络层的前推代码、激活函数等。