深度学习基础介绍
[TOC]
概述文章参考:https://github.com/wuwenjie1992/StarrySky
文章参考:https://blog.csdn.net/thl789/article/details/109037433
文章参考:https://github.com/Mikoto10032/DeepLearning
深度学习之NCHW和NHWC
[TOC]
概述文章参考:https://blog.csdn.net/thl789/article/details/109037433
流行的深度学习框架中有不同的数据格式,典型的有NCHW和NHWC格式。本文从逻辑表达和物理存储角度用图的方式来理解这两种数据格式,最后以RGB图像为例来加深NHWC和NCHW数据存储格式的理解。
深度学习框架中,数据一般是4D,用NCHW或NHWC表达,其中:
N - Batch
C - Channel
H - Height
W - Width
假定N = 2,C = 16,H = 5,W = 4,那么这个4D数据,看起来是这样的:
NCHW其实代表的是[W H C N],第一个元素是000,第二个元素是沿着w方向的,即001,这样下去002 003,再接着呢就是沿着H方向,即004 005 006 007…这样到09后,沿C方向,轮到了020,之后021 022 …一直到319,然后再沿N方向。
物理存储NHWC的话以此类推,代表的是[C W H N],第一个元素是000,第二个沿C方向,即020 ...
深度学习之卷积层、激活层、池化层、全连接层学习
[TOC]
文章转自:https://zhuanlan.zhihu.com/p/363345545
文章参考:https://juejin.cn/post/7130176282427392007
局部连接+权值共享全连接神经网络需要非常多的计算资源才能支撑它来做反向传播和前向传播,所以说全连接神经网络可以存储非常多的参数,如果你给它的样本如果没有达到它的量级的时候,它可以轻轻松松把你给他的样本全部都记下来,这会出现过拟合的情况。
所以我们应该把神经元和神经元之间的连接的权重个数降下来,但是降下来我们又不能保证它有较强的学习能力,所以这是一个纠结的地方,所以有一个方法就是局部连接+权值共享,局部连接+权值共享不仅权重参数降下来了,而且学习能力并没有实质的降低,除此之外还有其它的好处,下来看一下,下面的这几张图片:
这几张图片描述的都是一个东西,但是有的大有的小,有的靠左边,有的靠右边,有的位置不同,但是我们构建的网络识别这些东西的时候应该是同一结果。为了能够达到这个目的,我们可以让图片的不同位置具有相同的权重(权值共享),也就是上面所有的图片,我们只需要在训练集中放一张,我们 ...
深度神经网络量化之后训练量化
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/156835141
文章参考:https://aitechtogether.com/aiquestion/22771.html
文章参考:https://oldpan.me/archives/how-to-quan-1
markdown数学公式参考:https://geek-docs.com/markdown/markdown-tutorial/markdown-mathematical-formula.html
markdown数学公式参考:https://blog.csdn.net/weixin_42782150/article/details/104878759
markdown数学公式参考:https://zhuanlan.zhihu.com/p/59412540
介绍了矩阵量化的基本原理,并推广到卷积网络中。这一章开始,我会逐步深入到卷积网络的量化细节中,并用 pytorch 从零搭建一个量化模型,帮助读者实际感受量化的具体流程。
本章中,我们来具体学习最简单的量化方法——后训练量化「post ...
深度神经网络模型量化方法基础
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/149659607
上面讲解了基本的量化公式和量化的方法,下面来详细展开感知量化训练(Aware Quantization)模型中插入伪量化节点fake quant来模拟量化引入的误差。端测推理的时候折叠fake quant节点中的属性到tensor中,在端测推理的过程中直接使用tensor中带有的量化属性参数。
伪量化节点(Fake Quant)的意义在于:
1)找到输入数据的分布,即找到min和max值;
2)模拟量化到低比特操作的时候的精度损失,把该损失作用到网络模型中,传递给损失函数,让优化器去在训练过程中对该损失值进行优化。
量化基本原理低比特量化模型运行时,需要确定$scale$与$offset$两个量化参数:$$float=scale*(uint8 + offset)$$其中,是float32浮点数,uint8为unsigned int定点数,offset是int32定点数。其表示的数据范围为:
感知训练量化量化方法矩阵运算量化由于卷积网络中的卷积层和全连接层本质上都是一堆矩阵乘 ...
深度神经网络模型量化之Folding BN和ReLU
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/176982058
介绍了量化训练的基本流程,本文介绍量化中如何把 BatchNorm 和 ReLU 合并到 Conv 中。
Folding BatchNorm康奈尔大学的论文:https://arxiv.org/abs/1502.03167
BatchNorm 是 Google 提出的一种加速神经网络训练的技术,在很多网络中基本是标配。
回忆一下,BatchNorm 其实就是在每一层输出的时候做了一遍归一化操作:
其中$x_i$是网络中间某一层的激活值,$\mu_{\beta}、\sigma_{\beta}$分别是其均值和方差,$y_i$则是过了 BN 后的输出。
一般卷积层与BN合并Folding BatchNorm 不是量化才有的操作,在一般的网络中,为了加速网络推理,我们也可以把 BN 合并到 Conv 中。
合并的过程是这样的,假设有一个已经训练好的 Conv 和 BN:
假设 Conv 的 weight 和 bias 分别是$w$和$b$。那么卷积层的输出为:
$$y=\sum ...
Android8.0需要显示发送广播
[TOC]
概述项目中遇到下面这样一个问题:
在Android8.0(target?=26)上面,App发送的隐式广播无法被接收到。
108-23 21:45:38.271 1207 1225 W BroadcastQueue: Background execution not allowed: receiving Intent { act=com.xxx.xxx flg=0x10 (has extras) } to com.xx.xx/com.xx.xx.receiver.XxReceiver
原因分析: 基于以上种种原因,从Android O开始,Google做了一系列规避措施,最直接的体现在两个方面:
取消静态广播的支持。 以前很好用的静态广播消息将接收不到,比如开机广播:“android.intent.action.BOOT_COMPLETED”,
网络状态发生改变广播:“android.net.conn.CONNECTIVITY_CHANGE”。
必须以动态的方式才能接收到,这就保证了”只有用户将你的应用置为前台应 ...
Android之BroadcastReceiver基础学习
[TOC]
概述 BroadcastReceiver(广播接收器)是Android四大组件之一,顾名思义,通过广播的方式进行消息传递,其本质是一个全局的监听器,可以监听到各种广播,可以用来实现不同组件之间的通信。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合。
广播的类型 根据不同的角度,广播可以分为不同的类型,这些分类基本都是根据广播发送者来决定的。下面咱们来详细探讨一下这些类型。
1、自定义广播和系统广播 根据发送的广播是用户自己定义的还是由系统定义的,可将广播分为自定义广播和系统广播。这个比较简单,容易理解。
Android系统中内置了多个系统广播,只要涉及到手机的基本操作,基本上都会发出相应的系统广播。如:开启启动、电量变化、网络状态改变,拍照,屏幕关闭与开启,点亮不足等等。每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,有系统自动发出。
2、普 ...
Android应用在未启动的情况下接受指定广播
[TOC]
最近项目中遇到一个这样的需求,如何使App在接收到指定广播的时候,做特定的事情(启动APP或者做某些数据收集操作)思考:如果APP已经启动,只需注册相应的广播就可以实现这个需求,但是如果APP从未启动过呢?
问题原因Android在3.1以后将新安装的应用置为“STOPPED”状态,只有当应用启动过一次之后这个状态才会改变,同时,从Android 3.1开始,系统的包管理器保持跟踪处于停止状态(stopped state)的应用程序,提供了一种控制其从后台进程和其它应用程序启动的方式。这种停止状态的应用程序指那些安装了但从未启动过的apk,或被用户在程序管理中force stop的apk。Android系统为防止广播无意或不必要开启停止状态的组件,它给所有广播intent添加了FLAG_EXCLUDE_STOPPED_PACKAGES标志(不设置和同FLAG_INCLUDE_STOPPED_PACKAGES一起设置结果都是此标志)
简言之就是:从Android 3.1开始,系统给intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAG ...