• 前言
  • 目录

    • 1 BNN Net
      • 1.1 网络结构
      • 1.2 实验目的
      • 1.3 实验环境
      • 1.4 实验步骤
    • 2 单元阵列
      • 2.1 实验目的
      • 2.2 实验环境
      • 2.3 实验步骤
      • 2.4 实验结果

1 BNN Net

BNN(“二值化神经网络”),即Bengio于2016年发表的文章:《Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1》。通过“二值化”操作,使模型的参数占用更小的存储空间(内存消耗理论上减少为原来的1/32倍,从float32到1bit);同时利用位操作来代替网络中的乘加运算,大大降低了运算时间。
“二值化”是一种1位的量化,其数据只有两个可能的值,即-1(0)或+1,使用“二值化”操作进行压缩后,网络中的权重和激活都可以用1位表示,而不会占用太多内存。此外,通过二值化,网络可以使用轻量级的XNOR位运算代替繁重的浮点乘加运算,相比于“非二值化”的网络,将大量的数学运算变成了位操作,这样就节省了大量的空间和前向传播的时间,使神经网络的应用门槛变得更低。
由于深度模型具有多层结构和数百万个参数,因此深层CNN具有很强的学习能力,通常具有令人满意的性能。例如,VGG-16网络包含大约1.4亿个32位浮点参数,对于ImageNet数据集上的图像分类任务,可以达到92.7%的Top-5测试准确率。整个网络需要占用500M字节以上的存储空间,并再一次推理过程中执行 1.6x1010次浮点算术运算。这使得深层的卷积神经网络严重依赖于GPU等高性能硬件,而在实际应用中,通常只有计算资源有限的设备可用,如移动电话和嵌入式设备。以基于FPGA的嵌入式设备为例,通常该类设备只有数千个计算单元,远远不能处理常见深度模型中的数百万次浮点运算,复杂的模型与有限的计算资源之间存在着严重的矛盾。
尽管目前涌现了大量用于深度学习的专用硬件,这些硬件提供了高效的矢量运算操作以实现正向推理中的快速卷积,但繁重的计算和存储仍然不可避免地限制了深度卷积神经网络的实际应用。因此出现了大量的网络压缩的相关研究。
在现有的网络压缩技术中,基于量化的技术是一种很有潜力且十分高效的解决方案,与浮点模型相比,量化模型可以通过以非常低的精度表示网络权重来压缩、加速原始网络。沿此方向,最极端的量化是二值化。
BNN研究对象是前馈网络。
前馈模型(卷积可以看成是一种特殊的全连接)可以用如下公式表示:

其中,xk为第k层的输入,Wk为第k层的权值矩阵,σ(⋅)为非线性激活函数。 对于二值化权值和激活,首先,我们定义取符号操作:

在 BNN中,网络权值为 +1 或 -1,即可以用 1bit 表示,这一点与 BinaryConnect 相同。更进一步,BinaryNet 使用了输出为二值的激活函数,即:

这样,除了第一层的输入为浮点数或多位定点数外,其他各层的输入都为 1 bit。项目中对此处做了改进,在精度允许的情况下,将第一层同样做二值化处理。

1.1 网络结构

(1)含有三层卷积层,7.2节中使用的为该网络,网络结构如下所示:

其中输入层为77,三个卷积层输出通道分别为16,23和2,激活层为Hardtanh。
(2)含有五层卷积层,该节使用的为此网络,网络结构如下所示:

其中输入层为28
28,五个卷积岑输出通道分别为4、8、16、32、2,激活层为Hardtanh。

1.2 实验目的

在口罩判定的分类任务中验证BNN网络的性能。

1.3 实验环境

操作系统:Ubuntu18.04
其他:AI004, Python 3.6.8,PyTorch 1.1.0,GTX 1080ti
数据集:CelebA,RMFD

1.4 实验步骤

Step 0:打开终端,进入项目根目录
$ cd BinaryNet.pytorch
项目结构如下所示:

Step 1:输入命令开始训练
$ python main_mask_prune_v1.py
训练过程如下图所示:

训练结束后,权重自动保存在ckp文件目录下,如下图所示:

Step 2:预测图片
$ python predict_prune_v1.py
结果如下图所示:

预测结果自动保存在work/result目录下,如图所示:

Step 3:输出FM文件
输出满足硬件需求的FM数据文件
$ python input_fm.py
在当前目录下会生成input.fm.bin文件,该文件直接供硬件使用。

2 单元阵列

2.1 实验目的

基于****** FPGA PA1芯片完成一个低比特DNN算法实现设计,该设计用到的LUT单元阵列容量不低于100k逻辑单元。

2.2 实验环境

(1)生成Verilog文件:
操作系统:Ubuntu18.04
其他:AI004, Python 3.6.8,PyTorch 1.1.0,GTX 1080ti
数据集:CelebA,RMFD
使用网络:BNN Net
(2)生成位流文件:
操作系统::Win10(64位),
工具:TD,iverilog,GTKWave

2.3 实验步骤

(1)结合BNN Net生成Verilog文件
BNN Net详述见7.5.4节,这里采用了三层卷积的网络结构。其中其中输入层为14*14,共四层卷积层,卷积层数分别为8、16、23、2,激活层为Hardtanh。
Step0:进入项目根目录,并查看项目结构
$ cd /AIHOME/bwu/workspace_temp/project/BinaryNet.pytorch2
项目结构如下所示:

Step1:训练网络
$ cd train
$ python main_mask_14.py
训练过程如图所示:

训练结束后,权重自动保存在ckp/ckp-14文件目录下,如图所示:

Step2:推断
$ cd …/
$ python predict.py
过程如下图所示:

预测结果自动保存在work/result目录下,如下图所示:


Step3:生成Verilog文件,输出数据网表
为满足硬件仿真调试需求,需要将训练后的权重文件以及卷积后的特征图逐层解析,并且映射成测试网表,形成硬件描述语言。流程图如下:


其中,对每一层的参数以及特征图变量的映射规则如下:
P0000代表当前层输入特征,P后面的四个变量从左至右分别代表层名,坐标x,坐标y,通道c。
W00000代表当前层的权重参数,W后的五个变量从左至右分别代表层名,输出batch,坐标x,坐标y,输入通道c。
c00000代表一个卷积单元的计算结果,,每个卷积单元为9*9大小,即分别有9个权重和9个特征点乘累加,c后的五个变量从左至右分别代表层名,输入通道c,坐标x,坐标y,输出batch。
C0000代表卷积单元计算结果的通道和,即下一层第一个batch的最终结果,C后的四个变量从左至右分别代表层名,坐标x,坐标y,输入通道c。
A0000代表经过激活后的结果,A后的四个变量从左至右分别代表层名,坐标x,坐标y,输入通道c。

提取网络每层的权重文件及特征图文件
$ cd extract
$ python extract_14.py
输出结果如下所示:

每层的权重参数和特征图数据分别保存在当前目录新产生的extract_out/param_14和extract_out/fm_14文件下。
加载权重及特征图文件,生成硬件描述语言文件,输出卷积过程的数据网表。

$ cd …/dump_net_list
$ python test_unit_layer_all4.py
生成的test_unit_layer14.v文件存放在当前目录新产生的test_unit文件夹下。

经过简单修改后即可用于实现低比特DNN算法实现,修改后的源文件为BNN.v


(2)通过Verilog文件实现低比特DNN算法
Step1:新建工程(TD)
>>> 双击打开TD软件
>>> 选择“Project” , “New Project”
此时会弹出新项目对话框。
>>> 指定所创建项目的存储路径并输入项目名称(英文),例如DNN_TEST
>>> 选择“Device Family” ==> PA1。
>>> 选择“Device Name” ==> PA1L120SFG676C。
>>> 选择“OK”。
。。。。。。

2.4 实验结果

Step0:资源使用情况分析
>>>在Console中写TCL语句:report_area -file *.area,可以在打印的log中查看slice的信息,利用率为98.03%如下图:

本芯片每一个slice可配置成1个独立lut6,业界所说的lut逻辑单元一般以lut4为标准,PA1芯片的lut6电路等效1.8个标准lut4电路。本设计等效于125051个逻辑单元,已超过100k的逻辑单元用量,达到实验目标。
Step1:仿真结果分析
在上述具体仿真实验步骤中已经可以看到仿真的波形,可以看到P_data_valid有效(高有效)的时候,P_data_0的数值是0,P_data_1的数值是1,此口罩识别网络最后是根据最后得到的这两个数值来判断图片的人是否戴口罩的,当第二个数值为1第一个数值是0那么此人就是戴口罩的,反之就是未戴口罩(按照训练数据集的标注中这两个数值只有可能是0和1或者1和0)。因为本设计是将一个戴口罩的图片(如下图)转成网络专用的feature map然后当成初始数据放入本设计中的,所以最后的结果可以证明是正确的。

BNNVGG3-BNN Net相关推荐

  1. BNN领域开山之作——不得错过的训练二值化神经网络的方法

    作者| cocoon 编辑| 3D视觉开发者社区 文章目录 导读 概述 方法 确定二值化以及随机二值化 梯度计算以及累加 离散化梯度传播 乘法运算优化 基于位移(shift)的BN 基于位移的AdaM ...

  2. 基于PYNQ-Z2重建BNN工程

    基于PYNQ重建BNN工程 Github链接 环境:ubuntu18.04 vivado2018.3 参考步骤(源自Github的Readme) Hardware design rebuilt In ...

  3. 基于PYNQ-Z2实现BNN硬件加速

    用HLS工具在PYNQ-Z2开发板上实现BNN(二值神经网络)硬件加速--毕设小结 本文主要是本人本科毕业设计的主要工作. 主要工作有两部分,一是使用Vivado HLS工具实现二值卷积神经网络模型并 ...

  4. 比 TensorFlow Lite 快 15.6 倍!业界首个移动 GPU BNN 加速引擎 PhoneBit 开源

    头图 | CSDN 下载自视觉中国 在过去的几年里,深度神经网络(DNN)已经在计算机视觉和其他领域取得了巨大的进展.然而,由于深度神经网络较高的计算复杂度,以及移动设备性能和功率限制,导致深度神经网 ...

  5. BNN - 基于low-bits量化压缩的跨平台深度学习框架

    写在最前 本文介绍阿里IDST部门研发.基于low-bits量化压缩的深度学习框架BNN(Binary Neural Network),BNN具有以下特点: 1) 跨平台:BNN可以在不同的主流硬件平 ...

  6. 二值神经网络(Binary Neural Network,BNN)

    在我刚刚过去的研究生毕设中,我在ImageNet数据集上验证了图像特征二值化后仍然具有很强的表达能力,可以在检索中达到较好的效果.而Bengio大神的这篇文章,则不止于将特征二值化,而是要将权重和每层 ...

  7. BNN Pytorch代码阅读笔记

    BNN Pytorch代码阅读笔记 这篇博客来写一下我对BNN(二值化神经网络)pytorch代码的理解,我是第一次阅读项目代码,所以想仔细的自己写一遍,把细节理解透彻,希望也能帮到大家! 论文链接: ...

  8. FINN(二)CNN,BNN及其硬件实现的背景知识

    2.1 CNN 这项工作的重点是监督学习,其目标是找到一个函数g(xi),它近似于映射xi→yi ∀i,其中{xi,yi}是一个输入/输出对,称为训练样例. 多层感知器是一种人工神经网络,其神经元在多 ...

  9. 【Paper Reading】二值化网络——BNN

    Binarized Neural Networks: Training Neural Networks withWeights and Activations Constrained to +1 or ...

  10. 基于堆栈二值化自动编码器和二值化神经的无约束人脸表情识别算法(An efficient unconstrained FERa based on BAEs and BNN)

    摘要(abstract) 虽然深度学习在许多模式识别任务中都取得了良好的效果,但对于含有大量参数集.标记数据有限的深度网络,过拟合问题仍然是一个严重的问题.在这项工作中,二进制自动编码器(BAEs)和 ...

最新文章

  1. 在MSN、QQ群、论坛上提问的决窍
  2. 使用Spring整合Quartz轻松完成定时任务
  3. 十年再出发!阿里云智能总裁张建锋演讲全记录
  4. springboot Autowired BeanNotOfRequiredTypeException
  5. 操作系统宕机,MySQL数据找回记录
  6. vector<int> v, vector<int> v(n) 与vector<int> v[n]的区别
  7. JAVA中的“抽象接口”
  8. SVG.属性(各种)
  9. 01. 慎重选择容器类型
  10. python include目录,python pip指定库目录和include目录
  11. 创造思维方法训练_数学思维方法训练课程:每日一题11.23
  12. 《大话数据结构》学习笔记
  13. IDEA如何执行Maven命令总结
  14. 清明节如何计算(一千年清明节计算)
  15. vue结合elmentui实现前端分页
  16. c语言实训总结报告综合,c语言综合性实验总结
  17. AutoCAD打开慢的解决方案
  18. js中undefined怎么判断
  19. css去掉按钮默认样式教程_50个针对设计师CSS3按钮教程
  20. raft2020年更新_Raft6月1日更新了什么 Raft6月1日更新内容介绍

热门文章

  1. 深度学习领域,你心目中 idea 最惊艳的论文是哪篇?
  2. c语言编程最大公约数教程说明,C语言:最大公约数。
  3. 问老板个事情,ta说“一会找你”,是敷衍我吗?
  4. pentaho report designer笔记
  5. Euler formula
  6. 部署大宗商品撮合交易平台,实现高效交易与资源信息对接
  7. Flask租房项目总结
  8. SQL Server练习
  9. OTA升级的实现原理
  10. ABAP SPLITTER技术总结及使用技巧