卷积神经网络在ARM-CPU上的推断计算综述

摘要


  深度学习在计算机视觉领域大放异彩,许多在传统方法下无法解决的问题正在被一一攻克。然而,高昂的计算成本也极大地限制了深度学习的使用,在移动端设备、嵌入式设备等计算资源比较拮据的平台上其计算密集的特性尤为突出。本文对现阶段,工业界所使用的深度学习推断阶段的软件操作库、计算框架等,做了充分调研,由底向上勾勒出深度学习推断阶段的技术轮廓。本文主要工作如下:

  1. 总结深度学习推断阶段的主要操作,指出其性能瓶颈所在;
  2. 从软件库层面总结现阶段可用的开源库;
  3. 对比各层次的软件库,做出总结。

深度学习推断的主要操作


  对于大部分的卷积神经网络而言,卷积层是最消耗时间的部分,而全连接层则是参数量最多的部分[2]。 如下图所示[10]为 2012 年获得imagenet冠军的深度神经网络结构Alexnet分别在GPU和CPU进行推断的性能benchmark,由图可以看出,在CPU上卷积层和全连接层占用了95%的计算时间,而在CPU上卷积层和全连接层占用了89%的时间,如何高效地进行卷积层和全连接层的计算成为提升深度学习推断性能的关键点。

继续阅读卷积神经网络在ARM-CPU上的推断计算综述

卷积与反卷积、步长(stride)与重叠(overlap)及output的大小

1. 卷积神经网络的基础概念

        卷积神经网络是一种专门用来处理具有类似网络结果的数据的神经网络。至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

        最核心的几个思想:稀疏交互、参数共享、等变表示(通俗成为平移不变性)。根本目的说白了就是为了节省运算时间和空间。那接下来看一下是怎么实现的。

1.0 卷积

         用一张图展示一下,卷积的计算。element-wise multiply 然后再相加。

继续阅读卷积与反卷积、步长(stride)与重叠(overlap)及output的大小

国内访问Coursera网站上的教学视频

最近在通过 Coursera 网站学习 Andrew Ng机器学习 课程,但是发现网站上的视频无法正常播放。

抓包分析发现课程的视频是通过 Amazoncloudfront.net 进行加速的,解决方法就是指定一个不被屏蔽的 IP地址即可。

/etc/hosts 中指定解析地址,如下:

参考链接


Coursera的视频为什么打不开了?

 Andrew Ng机器学习课程相关资料

Andrew Ng 的机器学习课程的视频,由于需要翻墙,因此在这里简单提供一下本站的下载链接。

Mathematics Behind Large Margin Classification

第七周


Support Vector Machines Kernels I

Support Vector Machines Kernels II

UsingAnSVM

讲座幻灯片 Lecture12 Support Vector Machines
编程作业: Support Vector Machines

第八周


讲座幻灯片 Lecture14 K-Means Clustering And PCA
编程作业: K-Means Clustering and PCA

第九周


Density Estimation

Problem Motivation

Gaussian Distribution

Algorithm

Building an Anomaly Detection System

第十周


Learning With Large Datasets

Stochastic Gradient Descent

第十一周


Problem Description and Pipeline

CNN 模型压缩与加速算法综述

CNN 模型压缩与加速算法综述

姜媚 2017-08-21 5760标签: CNN , 神经网络

导语:卷积神经网络日益增长的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,CNN模型压缩与加速成为了学术界和工业界都重点关注的研究领域之一。

前言

自从AlexNet一举夺得ILSVRC 2012 ImageNet图像分类竞赛的冠军后,卷积神经网络(CNN)的热潮便席卷了整个计算机视觉领域。CNN模型火速替代了传统人工设计(hand-crafted)特征和分类器,不仅提供了一种端到端的处理方法,还大幅度地刷新了各个图像竞赛任务的精度,更甚者超越了人眼的精度(LFW人脸识别任务)。CNN模型在不断逼近计算机视觉任务的精度极限的同时,其深度和尺寸也在成倍增长。

表1 几种经典模型的尺寸,计算量和参数数量对比

Model Model Size(MB) Million
Mult-Adds
Million
Parameters
AlexNet[1] >200 720 60
VGG16[2] >500 15300 138
GoogleNet[3] ~50 1550 6.8
Inception-v3[4] 90-100 5000 23.2

随之而来的是一个很尴尬的场景:如此巨大的模型只能在有限的平台下使用,根本无法移植到移动端和嵌入式芯片当中。就算想通过网络传输,但较高的带宽占用也让很多用户望而生畏。另一方面,大尺寸的模型也对设备功耗和运行速度带来了巨大的挑战。因此这样的模型距离实用还有一段距离。

在这样的情形下,模型小型化与加速成了亟待解决的问题。其实早期就有学者提出了一系列CNN模型压缩方法,包括权值剪值(prunning)和矩阵SVD分解等,但压缩率和效率还远不能令人满意。

近年来,关于模型小型化的算法从压缩角度上可以大致分为两类:从模型权重数值角度压缩和从网络架构角度压缩。另一方面,从兼顾计算速度方面,又可以划分为:仅压缩尺寸和压缩尺寸的同时提升速度。

本文主要讨论如下几篇代表性的文章和方法,包括SqueezeNet[5]、Deep Compression[6]、XNorNet[7]、Distilling[8]、MobileNet[9]和ShuffleNet[10],也可按照上述方法进行大致分类:

表2 几种经典压缩方法及对比

Method Compression Approach Speed Consideration
SqueezeNet architecture No
Deep Compression weights No
XNorNet weights Yes
Distilling architecture No
MobileNet architecture Yes
ShuffleNet architecture Yes

继续阅读CNN 模型压缩与加速算法综述

神经网络瘦身:SqueezeNet

2016年2月份,UC Berkeley和Stanford一帮人在arXiv贴了一篇文章:

这篇文章做成了许多人梦寐以求的事——压缩神经网络参数。但和以往不同,原作不是在前人网络基础上修修补补(例如Deep Compression),而是自己设计了一个全新的网络,它用了比AlexNet少50倍的参数,达到了AlexNet相同的精度!

关于SqueezeNet的创新点、网络结构,国内已经有若干爱好者发布了相关的简介,如这篇这篇,国外的文献没有查,相信肯定也有很多。

本文关注的重点在SqueezeNet为什么能实现网络瘦身?难道网络参数的冗余性就那么强吗?或者说很多参数都是浪费的、无意义的?

继续阅读神经网络瘦身:SqueezeNet

Ubuntu 16.04系统Microsoft Common Objects in Context(COCO)数据集在Python环境中的使用

Microsoft Common Objects in Context(简写COCO)数据集是微软团队提供的一个可以用来进行图像识别,分割,注解等开发工作的数据集。

其官方说明网址:http://mscoco.org/

继续阅读Ubuntu 16.04系统Microsoft Common Objects in Context(COCO)数据集在Python环境中的使用

Caffe训练过程中的train,val,test的区别

valvalidation的简称。
training datasetvalidation dataset都是在训练的时候起作用。
而因为validation的数据集和training没有交集,所以这部分数据对最终训练出的模型没有贡献。
validation的主要作用是来验证是否过拟合、以及用来调节训练参数等。

比如训练0-10000次迭代过程中,trainvalidationloss都是不断降低,
但是从10000-20000过程中train loss不断降低,validationloss不降反升。
那么就证明继续训练下去,模型只是对training dataset这部分拟合的特别好,但是泛化能力很差。
所以与其选取20000次的结果,不如选择10000次的结果。
这个过程的名字叫做Early Stopvalidation数据在此过程中必不可少。

如果跑caffe自带的训练demo,你会用到train_val.prototxt,这里面的val其实就是validation
而网络输入的TEST层,其实就是validation,而不是test。你可以通过观察validationlosstrainloss定下你需要的模型。

但是为什么现在很多人都不用validation了呢?
我的理解是现在模型中防止过拟合的机制已经比较完善了,Dropout\BN等做的很好了。
而且很多时候大家都用原来的模型进行fine tune,也比从头开始更难过拟合。
所以大家一般都定一个训练迭代次数,直接取最后的模型来测试。

引用链接