AI算法基础 [11]:门控递归单元GRU
前言
门控递归单元(Gated Recurrent Unit,GRU)是LSTM的一个流行的简化变种,由Cho, et al. (2014)提出。
算法原理
GRU将遗忘门和输入门合并成一个更新门(update gate)(输出为ztz_tzt),将胞元状态CCC和隐藏层状态hhh合二为一,并且加了一个作用于隐藏层状态hhh的重置门(reset gate)(输出为rtr_trt)。
GRU聪明的一点就在于使用了同一个门控zzz同时完成了遗忘(1−z1-z1−z)和记忆(zzz)的操作。遗忘和记忆的程度之和为1,就保证了hhh的尺度不变,也就省去了输出前的tanh操作。
与LSTM的对应关系
GRU的ht−1h_{t-1}ht−1对应到LSTM的胞元状态Ct−1C_{t-1}Ct−1;
GRU重置门其实对应到LSTM的输出门,则GRU的rt∗ht−1r_t*h_{t-1}rt∗ht−1对应到LSTM的隐藏层状态ht−1h_{t-1}ht−1,相当于隐藏层状态即算即用,也就不用额外的变量存储隐藏层状态了;
GRU的1−zt1-z_t1−zt对应到LS ...
AI算法基础 [10]:长短期记忆网络LSTM
前言
RNN的不足就在于随着时间序列的增加,前后信息关联度会逐渐减小,存在横向梯度消失现象。即短期记忆问题或长期依赖问题。为了解决这一问题,LSTM应运而生。
算法原理
RNN->LSTM
长短期记忆网络(Long Short-Term Memory network,LSTM)是一种特殊的RNN,和RNN一样,其隐藏层有着随时间序列重复的节点,只不过节点内部的结构要更为复杂。
RNN中隐藏层节点内部的结构非常简单,如果激活函数为tanh,则如下图所示:
LSTM的结构要更为复杂,如下图:
图中各图形符号的含义如下:
黄色方框:神经网络(激活)层(黄框tanh和粉圈tanh的区别就是黄框前是有W⋅input+bW \cdot input+bW⋅input+b的卷积操作的);
粉红色圆圈:逐点运算(⨂\bigotimes⨂即为hadamard product⨀\bigodot⨀,后续图中公式也用∗*∗表示;⨁\bigoplus⨁即为矩阵加法);
黑色箭头线:向量转移;
箭头汇合:向量合并concat操作;
箭头分离:向量拷贝供不同模块使用;
核心思想
LSTM的核心思想是胞 ...
AI算法基础 [9]:循环神经网络RNN
前言
循环神经网络(Recurrent Neural Networks,RNN)是一种特殊的神经网络模型,常常被用来处理序列数据。
基本原理
感性认识
传统的卷积神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。层与层之间是全连接的,层中各神经元之间没有连接。而循环神经网络中隐藏层的神经元结点之间是有连接的。前一次的输出结果,带到下一次的隐藏层中,一起训练。一个NLP的工作原理如下:
假设输入是一个字符串,对字符串进行分割后有若干有先后顺序的单词作为网络输入:
先将 “what”作为 RNN 的输入,得到输出O1
再将“time”输入到 RNN 网络,得到输出O2,这时前面 “what” 的输出也产生了影响(隐藏层中有一半(定性非定量)是黑色)
以此类推,后续各输入都会受到之前输出结果的影响
我们只需要关心最终的输出O5
当然RNN的缺点也显而易见:随着时间序列的增加,前后信息关联度会逐渐减小,存在横向梯度消失现象。说人话就是越早输入的信息对后续的影响越小。短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域)。这就是 RNN 存在的短期记忆问题 ...
海思AI开发 [5]:一般问题记录
Upsample 输入问题
在转换SDK中自带的yolov3模型(HiSVP_PC_V1.1.4.0\software\data\detection\yolov3\model\yolov3.prototxt)时,报以下错误:
F0817 15:32:17.480885 1352 layer.hpp:349] Check failed: ExactNumBottomBlobs() == bottom.size() (2 vs. 1) Upsample Layer takes 2 bottom blob(s) as input.
原因:
RuyiStudio中caffe Upsample的实现需要两个bottom,但实际模型prototxt中该层只有一个bottom
one for feature maps, and one for the max-pooling indeices;
解决方案:
对caffe window的源码进行修改,编译,并替换RuyiStudio的工具(传送门,要高贵的CSDN VIP才能看,没实践)
有一说,用deconv替换upsampl ...
海思AI开发 [4]:NNIE Mapper 模型转换问题记录
问题1 pooling层尺寸不一致
pooling层输出尺寸的计算公式如下:
ho=(hi+2∗pad−kernel)/stride+1wo=(wi+2∗pad−kernel)/stride+1\begin{aligned}
h_o=(h_i+2*pad-kernel)/stride+1\\
w_o=(w_i+2*pad-kernel)/stride+1
\end{aligned}
ho=(hi+2∗pad−kernel)/stride+1wo=(wi+2∗pad−kernel)/stride+1
当不能整除(输入或卷积核为奇数)时,pytorch默认是floor,而caffe默认是ceil,因此会出现onnx2caffe转换后输出尺寸比pytorch大1的情况。
解决办法:Slice层切割pooling层的输出
如果训练端发现该问题,可以pytorch的pooling设置为ceil_mode=True
如果部署端发现该问题,不想重新修改模型retrain,则需要手动修改prototxt
首先,不能采用将padding置为0的方式,虽然能获得相同的size,但计算方 ...
海思AI开发 [3]:交叉编译OpenCV
下载
下载指定版本的opencv-4.1.0和opencv_contrib-4.1.0的源码
下载的压缩包拷贝到linux服务器上,解压
安装cmake-gui
sudo apt-get install cmake-gui
运行cmake-gui
选择source code路径和build路径,点击Configure
选择交叉编译配置选项
配置c和c++的编译器
点击finish会进行初步的配置
进一步配置
配置build类型
配置安装路径
将opencv_contrib模块也编译进来
保险起见,添加交叉编译器的根目录
勾选BUILD_opencv_world
再次点击Configure,开始解问题吧 ( :
问题1 缺少boostdesc_bgm.i
cmake尝试下载该文件,但网络问题卡住
打开opencv_contrib-4.1.0\modules\xfeatures2d\CMakeLists.txt,注释掉下载的命令
该模块也会因此被disable,目前用不到,先关了吧
也可以自行下载对应的文件放到对应的位置,这里先不管了(是福不是祸,是祸躲不过 ( ...
海思AI开发 [2]:搭建开发环境
在 Linux 服务器上建立交叉编译环境,Windows 工作台通过串口和网口与Hi3559AV100 单板连接,开发人员可以在 Windows 工作台中进行程序开发或者远程登录到 Linux 服务器进行程序开发。
搭建Linux服务器环境
使用wsl安装Ubuntu18.04
直接在Windows Store中搜索linux进行安装
下载管理工具
cd <tool-dir>.\LxRunOffline.exe -h # 查看帮助.\LxRunOffline.exe list # 查看当前已有的WSL.\LxRunOffline.exe di -n Ubuntu # 查看子系统的位置.\LxRunOffline.exe move -n Ubuntu -d <tar-dir> # 将子系统移动到指定文件夹
通过管理工具可以将子系统移动到非C盘,防止C盘爆炸
安装nfs,samna,ssh等网络组件
暂时略过,windows可以通过\\wsl$\Ubuntu-18.04访问wsl的文件系统
软件包安装
配置默认使用 ...
海思AI开发 [1]:RuyiStudio安装
编译链MinGW-W64安装
下载MinGW-W64
下载完毕后解压到指定路径,我这里是D:\software\mingw64
下载msys
下载完毕解压到mingw64根目录下
添加系统变量
D:\software\mingw64\bin和D:\software\mingw64\msys\bin添加到系统变量
重命名gcc
将D:\software\mingw64\bin下x86_64-w64-mingw32-gcc.exe再拷贝一份并重命名为mingw32-gcc.exe,否则RuyiStudio工具不能自动识别到MinGW工具链。
重启计算机
Python3.5+Caffe环境配置
下载caffe-builder
下载完毕后放到D:\software\ruyi_env_setup(我拷贝了一份该文件夹<your-dir>\SVP_PC\HiSVP_PC_V1.1.4.0\tools\nnie\windows\ruyi_env_setup-3.0.7)
其实下面的脚本会再下一次 = =
执行setup_python.bat脚本
可能会遇到以下错误,需手动配置: ...
CUDA基础 [5]:互斥锁设计
初版
流传甚广的版本,来自《GPU高性能编程CUDA实战》中的sample
class CudaKernelLock {private: int* mutex;public: CudaKernelLock(void) { int state = 0; cudaError_t ret = cudaMalloc((void**)&mutex, sizeof(int)); ret = cudaMemcpy(mutex, &state, sizeof(int), cudaMemcpyHostToDevice); } ~CudaKernelLock() { cudaFree(mutex); } __device__ void lock(void) { while (atomicCAS(mutex, 0, 1) != 0); } __device__ void unlock(void) ...
CUDA基础 [4]:多流测试
BackGround
测试验证cuda多流的并行调度逻辑
测试环境:GTX1650+VS2019+Nsight
单流循环
按序执行
双流循环(方式1)
目前最优的并行方式
双流循环(方式2)
并行程度不如方式1
双流循环(方式3)
双流循环(方式4)
TX2 deviceQuery
总结
Nsight能可视化cuda的时间线,可以在设计初期帮助规避一些不合理的设计逻辑,但PC和TX2上设备支持情况不同,在PC上的表现不完全等同于TX2上表现,TX2上需另做测试,看是否满足预期;
从上述对比结果看,在确保上下文依赖关系正确的情况下,同一流的操作放在一起调用能获得更好的并行效果;
TX2只有一个copy engine, 所以拷贝操作间不能并行。