您的位置:首页 > 理论基础 > 计算机网络

神经网络模型的压缩及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左右大小。

还是以这张多场景类型来做测试:



其识别结果如下:(识别速度非常快)



测试图片二:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息