YOLOv2与YOLOv3学习笔记
基本思路YOLOv2是YOLO的第二个版本,该物品检测系统仍然只需要“Look Once”,其整体结构如下所示:
其主要由两个部分构成:
神经网络:将图片计算为一个$13\times 13 \times 125$的向量,该向量包含了预测的物品位置和类别信息
检测器:将神经网络输出的向量进行“解码”操作,输出物品的分类和位置信息。
神经网络部分YOLOv2的神经网络部分使用了一个带跳层的神经网络,具体结构如下所示:
神经网络的设计没有太大飞跃性的改变,相对于YOLOv1的神经网络设计主要有以下改变:
每个卷积层后添加了批标准化层,加速了网络的收敛。
在第16层开始分为两条路径,将低层的特征直接连接到高层,可提高模型性能。
移除全连接层,最终的输出向量中保存了原来的位置信息。
输入尺寸变为$416\times 416 \times 3$,识别更高分辨率的图片。
该网络最终输入图片尺寸为,$416\times 416 \times 3$输出向量尺寸为$13 \times 13 \times 125$。
检测器部分YOLOv2使用了Anchor Box的方法,神经网络输出的向量尺寸 ...
YOLO1学习笔记
基本思路YOLO(You Only Look Once)是一种目标检测系统,其特点是将物品识别和物品分类融合,使用一个深度学习模型直接计算出物体的位置和类型。基本思路如下所示:
首先图片被分为$S \times S$个框,如最左边的图所示。对于每个框,若一个物体的中心落在该框中,则这个框负责该物体的类型和位置预测。对于每个框,需要计算以下数据:
B个Bounding boxes的数据,共$B \times 5$个。每个框对应5个数据,分别是:
x:物体中心x的位置
y:物体中心y的位置
w:物体水平长度
h:物品垂直长度
conf:物品置信度,即有多大的概率这个框包含了物体,定义$conf =P(object) \times IOU_{pred}^{truth}$,即该指标同时考虑物品的存在可能性和对应Bounding boxes与真实物体重叠的面积。
所属类别:共C个,分别对应物品的种类,用于标记这个框的属于哪一个物体。
在VOC数据集中,共有20类物品,即C=20。取S = 7,B = 2,因此最后数据共$7 \times 7 \times (20 + 5 \times ...
DianNao系列分析
简介DianNao系列是中科院计算所推出的系列机器学习加速器,包括以下四个成员:
DianNao:神经网络加速器,DianNao系列的开山之作。
DaDianNao:神经网络“超级计算机”,DianNao的多核升级版本
ShiDianNao:机器视觉专用加速器,集成了视频处理部分
PuDianNao:机器学习加速器,DianNao系列收山之作,可支持7种机器学习算法
DianNao系列相比于其他神经网络加速器,除了关心运算的实现外,更关心存储的优化。
整体架构DianNao系列的整体架构比较类似,均分为以下三个部分:
运算核心:完成对应的运算加速功能
缓存:缓存输入输出数据与参数,减小访存带宽需求
控制:协调运算核心和缓存的工作
前三代(DianNao,DaDianNao,ShiDianNao)的整体架构如下图所示:
其中:
NBin,NBout和SB:均为存储器,分别用于存储输入数据,输出数据或临时数据和参数
NFU:运算核心,用于完成神经网络相关的运算
以下为原论文中所绘制的架构图(左图为DianNao/DaDianNao,右图为ShiDianNao):
最后一代P ...
神经网络优化算法总结
优化算法框架优化算法的框架如下所示:
w_{t+1} = w_t - \eta_t \\
\eta_t = \cfrac{\alpha}{\sqrt{V_t}} \cdot m_t其中,$w_i$为i时刻的权值,$\eta_i$为i时刻的优化量;$\alpha$为学习率,$m_t$为一阶动量,$V_t$为二阶动量。一阶动量和二阶动量都与梯度有关,如下所示:
m_t = M_1(g_1,g_2,...,g_t) \\
V_t = M_2(g_1,g_2,...,g_t) \\
g_t = \nabla f(w_t)一阶动量和二阶动量均是历史梯度和当前梯度的函数
优化算法固定学习率优化算法学习率固定的优化算法均有一个特点:不考虑二阶动量(即$M_2(g_i) = I$)
随机梯度下降(SGD)随机梯度下降时最简单的优化算法,有:$m_t = g_t,V_t = I$,带入公式有优化公式为:$\eta_t = \alpha \cdot g_t$
带动量的随机梯度下降(SGD with Momentum)随机梯度下降加上动量项,即考虑梯度累积,有:
g_t = \nabla f(w_t) ...
AHB学习笔记
目录[TOC]
1.AHB概述AHB总线是一种专为高性能同步传输设计的总线,层次高于APB总线,支持以下特性:
突发传输
拆分事务
主设备单时钟周期传输
单时钟沿操作
非三态实现
宽数据总线配置(64/128bit)
1.1.典型AHB系统
典型的AHB系统包括以下部分:
可支持高带宽传输的主干总线
AHB主设备(如高性能CPU和DMA设备等)
AHB从设备(存储器和APB桥等)
1.2.AHB互连AHB的互连使用多路复用器策略,由以下几个部分组成:
主设备:发起通信,所有主设备将通行地址和数据发送到主设备多路复用器
从设备:回应通信,从主设备多路复用器获得通信地址和数据,将回应数据发送到从设备多路复用器
判决器:主设备多路复用器的控制器,控制哪一个主设备的通信数据可以被发送到从机
解码器:从设备多路复用器的控制器,控制哪一个从设备的通信数据可以被发送回主机
2.AHB信号2.1.基本AHB信号
信号名
位宽
来源
描述
HCLK
1
系统时钟
传输系统的时钟
HRESETn
1
复位系统
传输系统复位信号,低有效
HADDR
32
主机
主机发送传 ...
基于pytorch的CapsNet代码详解
CapsNet基本结构参考CapsNet的论文,提出的基本结构如下所示:
可以看出,CapsNet的基本结构如下所示:
普通卷积层Conv1:基本的卷积层,感受野较大,达到了9x9
预胶囊层PrimaryCaps:为胶囊层准备,运算为卷积运算,最终输出为[batch,caps_num,caps_length]的三维数据:
batch为批大小
caps_num为胶囊的数量
caps_length为每个胶囊的长度(每个胶囊为一个向量,该向量包括caps_length个分量)
胶囊层DigitCaps:胶囊层,目的是代替最后一层全连接层,输出为10个胶囊
代码实现胶囊相关组件激活函数Squash胶囊网络有特有的激活函数Squash函数:
Squash(S) = \cfrac{||S||^2}{1+||S||^2} \cdot \cfrac{S}{||S||}其中输入为S胶囊,该激活函数可以将胶囊的长度压缩,代码实现如下:
1234def squash(inputs, axis=-1): norm = torch.norm(inputs, p=2, dim=axis, kee ...
深入理解感知机
1.模型感知机的模型如下图所示:
公式表示如下所示:
f(x) = sign(w \cdot x + b) \\
sign(x) = \begin{cases} +1 & x \geq 0 \\
-1 & x < 0
\end{cases}对于该分类器,其假设空间为特征空间的所有线性分类器,从几何学的角度可以理解为是特征空间中所有的超平面。那么,只要样本在特征空间中是线性可分的(可以被一个超平面完美划分),由感知机的假设空间,那么这个超平面一定在假设空间内,所以感知机是可以用于区分所有线性可分的样本。
2.学习策略2.1.代价函数感知机的目标是为了找到那个能完美划分线性可分样本的超平面。为了达到这个目标,我们需要定义代价函数。代价函数的意思是该函数刻画的是模型的性能,通常需要满足以下条件:
条件一:模型性能越好,代价函数越小,模型性能越差,代价函数越大
条件二:连续可导
条件一是使代价函数可以刻画模型性能,条件二是为了该模型可以使用梯度下降的方法优化
2.2.感知机代价函数选择对于感知机,选取代价函数为:
L(w,b) = - \sum\limits_{x_i \in M} ...
左式堆
左式堆性质零路径长零路径长的定义为:
零路径长:从节点X到一个没有两个子节点的(有一个子节点或没有子节点)节点的最短距离
对于零路径长,有以下递归的计算方法:
每个节点的零路径长比子节点的最小零路径长大1
NULL的节点的零路径长为-1,只有一个子节点或没有子节点的节点零路径长为0
左式堆左式堆是特殊的优先堆,除了有序性(每个节点的数据小于其子节点)以外,还有具有与零路径长相关的性质:对于左式堆,要求任一节点的左子节点零路径长大于等于右子节点的零路径长
操作合并操作左式堆的基本操作是合并,合并的递归描述如下:
当输入的两个堆都是空的,输出空堆;当有一个堆是空的,则返回非空的堆
当两个堆非空时,比较两个根节点的大小,返回为:
堆根节点为原较小的根节点
左子树为原较小的跟节点的左子树
右子树为根节点较大的堆和跟节点较小堆右子树合并的结果
如下图所示:
对于最终结果,可能在根节点上出现不符合左式堆的性质的情况,出现这种情况时,交换左右子节点即可:
其他操作有了核心操作合并,优先堆的其他操作可由合并实现:
插入:通过合并单个节点和现有堆实现
弹出:将根节点返回,并合并左右 ...
基于gluno的Inception结构
Inception结构初级Inception结构初级Inception结构如下所示:
其前向传播分为4个部分:
通过1x1卷积
通过3x3卷积,padding为1(不改变图片大小)
通过5x5卷积,padding为2(不改变图片大小)
通过3x3池化,为了保证图片大小与以上相同,stride应为1,padding应为1
最后,将以上四个部分在feature这一维度堆叠起来,即获得最终输出
分析假设输入feature,每个层(卷积和池化)输出feature分别为$N_i,N_o$(即最终输出feature为$4 \times N_o$);输入图片的尺寸为WxL,对于每一层,有:
1x1卷积层:有参数$1 \times 1 \times N_i \times N_o = N_iN_o$,需要进行计算的次数为$N_o \times W \times L \times 1 \times 1 \times N_i = WLN_iN_o$
3x3卷积层:有参数$3 \times 3 \times N_i \times N_o = 9N_iN_o$,需要计算次数为$N_o \times W ...
基于优先堆的调度队列
应用场景模拟考虑优先堆的一种应用场景——按优先级的任务调度队列:每个任务有一个优先级和唯一标号,该调度队列需要具有以下功能:
添加任务:将任务添加进调度队列并按优先级置于对应的位置
执行任务:将优先堆中优先级最高的任务取出(并执行)
删除任务:按标号删除队列中的未执行任务
修改任务优先级:修改指定标号任务的优先级
应用分析数据结构对于任务,考虑使用类封装,对于一个任务类需要以下特征:
标号:int型,用于区别任务的标号,每个任务有一个且唯一
优先级:int型,每个任务的优先级,该特征越小则优先级越高
同时需要具有以下方法:
任务执行方法:调用该任务表示执行了该任务
优先级修改方法:调用该任务修改优先级
优先堆定义了数据结构后,使用2D优先堆实现该优先队列,2D优先堆为完全二叉树,且任意一个节点的值小于其子节点的值。要实现场景中的几种功能,需要以下几种方法:
Push:对应添加任务,将任务类插入该优先堆中,调用上移方法。
Pop:对应执行任务,取出2D优先堆根节点的任务,调用下移方法。
Delete:对应删除任务,按标号取出某一节点的任务并调整堆使其满足2D优先堆的条件,调 ...