神经网络模型的压缩及SqueezeNet的应用测试
2017-07-03 15:05
483 查看
深度学习已经在很多领域取得了重大突破,然而现有深度学习训练好的模型经常都比较大,如ImageNET或者COCO上面的各种训练模型经常是几百M以上,这对于现有主流的计算机当然没有什么问题,但是对于一些移动设备或者一些硬件层面上的应用可能就比较有难度。因此神经网络压缩也是深度学习研究应用的重要一环。
在微软秦涛的一篇演讲(http://www.msra.cn/zh-cn/news/blogs/2017/03/tao-qin-machine-learning-20170309.aspx)中提到:现有的网络压缩主要有四大类。
一个是叫剪枝,大家知道,神经网络主要是由一层一层的节点通过边连接,每个边上有些权重。剪枝的意思很简单,如果我们发现某些边上的权重很小,这样的边可能不重要,这些边就可以去掉。我们在把大模型训练完之后,看看哪些边的权重比较小,把这些边去掉,然后在保留的边上重新训练模型;
模型压缩的另外一种做法就是通过权值共享。假设相邻两层之间是全连接,每层有一千个节点,那么这两层之间有一千乘一千也就是一百万个权值(参数)。我们可以对一百万个权值做个聚类,看看哪些权值很接近,我们可以用每个类的均值来代替这些属于这一类的权值,这样很多边(如果他们聚在同一类)共享相同的权值。如果我们把一百万个数聚成一千类,就可以把参数的个数从一百万降到一千个,这也是一个非常重要的一个压缩模型大小的技术。
还有一个技术可以认为是权值共享的更进一步,叫量化。深度神经网络模型的参数都是用的浮点型的数表达,32bit长度的浮点型数。实际上没必要保留那么高的精度,我们可以通过量化,比如说就用0到255表达原来32个bit所表达的精度,通过牺牲精度来降低每一个权值所需要占用的空间。
这种量化的更极致的做法就是第四类的技术,叫二制神经网络。所谓二制神经网络,就是所有的权值不用浮点数表达了,就是一个二进制的数,要么是+1要么是-1,用二进制的方式来表达,这样原来一个32 bit权值现在只需要一个bit来表达,从而大大降低这个模型的尺寸。
在研究深度模型压缩这一块,比较著名就是squeezenet,最关键的是其效果相当不错。它是对谷歌AlexNET进行压缩的经典压缩模型。它的主要做法是将原来的3*3的CONV,转换为1*1的CONV,这样能减少不少的参数。
当然还不止上面的改进,还有Expand扩展模块中的操作,还有类似于残差处理中的穿插pool操作。特别是最后的全连接层的替换等。
(2) 测试
基于SqueezeNet进行测试,发现训练好的模型基本上就4.8M,已经非常的小,网上还有直接将参数类型改为INT型等的,能够控制在0.8M左右大小。
还是以这张多场景类型来做测试:
其识别结果如下:(识别速度非常快)
测试图片二:
在微软秦涛的一篇演讲(http://www.msra.cn/zh-cn/news/blogs/2017/03/tao-qin-machine-learning-20170309.aspx)中提到:现有的网络压缩主要有四大类。
一个是叫剪枝,大家知道,神经网络主要是由一层一层的节点通过边连接,每个边上有些权重。剪枝的意思很简单,如果我们发现某些边上的权重很小,这样的边可能不重要,这些边就可以去掉。我们在把大模型训练完之后,看看哪些边的权重比较小,把这些边去掉,然后在保留的边上重新训练模型;
模型压缩的另外一种做法就是通过权值共享。假设相邻两层之间是全连接,每层有一千个节点,那么这两层之间有一千乘一千也就是一百万个权值(参数)。我们可以对一百万个权值做个聚类,看看哪些权值很接近,我们可以用每个类的均值来代替这些属于这一类的权值,这样很多边(如果他们聚在同一类)共享相同的权值。如果我们把一百万个数聚成一千类,就可以把参数的个数从一百万降到一千个,这也是一个非常重要的一个压缩模型大小的技术。
还有一个技术可以认为是权值共享的更进一步,叫量化。深度神经网络模型的参数都是用的浮点型的数表达,32bit长度的浮点型数。实际上没必要保留那么高的精度,我们可以通过量化,比如说就用0到255表达原来32个bit所表达的精度,通过牺牲精度来降低每一个权值所需要占用的空间。
这种量化的更极致的做法就是第四类的技术,叫二制神经网络。所谓二制神经网络,就是所有的权值不用浮点数表达了,就是一个二进制的数,要么是+1要么是-1,用二进制的方式来表达,这样原来一个32 bit权值现在只需要一个bit来表达,从而大大降低这个模型的尺寸。
在研究深度模型压缩这一块,比较著名就是squeezenet,最关键的是其效果相当不错。它是对谷歌AlexNET进行压缩的经典压缩模型。它的主要做法是将原来的3*3的CONV,转换为1*1的CONV,这样能减少不少的参数。
当然还不止上面的改进,还有Expand扩展模块中的操作,还有类似于残差处理中的穿插pool操作。特别是最后的全连接层的替换等。
(2) 测试
基于SqueezeNet进行测试,发现训练好的模型基本上就4.8M,已经非常的小,网上还有直接将参数类型改为INT型等的,能够控制在0.8M左右大小。
还是以这张多场景类型来做测试:
其识别结果如下:(识别速度非常快)
测试图片二:
相关文章推荐
- 常用神经网络模型及其应用评述
- 深度神经网络模型压缩
- 深度神经网络模型压缩
- 当前深度神经网络模型压缩和加速方法速览
- 如何保存训练好的神经网络直接进行测试-TensorFlow模型持久化
- 神经网络在测试抽样中的应用
- 阅读笔记:深度神经网络模型压缩与加速
- 神经网络模型压缩与加速
- 常用神经网络模型及其应用评述
- Little Explanations #1 -神经网络与模型压缩
- 【腾讯TMQ】MBT探索系列 – PRE/POST 模型在网络接口测试MBT的应用和探索
- 当前深度神经网络模型压缩和加速方法速览
- 综合布线测试模型对网络应用的影响
- 综述论文:当前深度神经网络模型压缩和加速方法速览
- 毕业论文:白盒和黑盒测试技术在“手机信息管理系统模型”测试中的实际应用
- 【软件测试】网络应用篇:第一章 网络应用概述
- 遗传算法及神经网络在游戏开发中的应用
- 人工神经网络入门(1) —— 单层人工神经网络应用示例
- 如何在低速率网络中测试 Web 应用
- ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)