电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOCX文档下载
分享到微信 分享到微博 分享到QQ空间

HLS-卷积运算单元设计与SDK测试

  • 资源ID:266123132       资源大小:2.66MB        全文页数:45页
  • 资源格式: DOCX        下载积分:15金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要15金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

HLS-卷积运算单元设计与SDK测试

    HLS卷积运算单元设计与SDK测试    目录·o 一、引言o 二、概念o 三、程序o 四、优化o 五、测试o 六、补充一、引言涉及内容包括:多位宽并行,动态定点数运算,设置LOOP_TRIPCOUNT来性能分析等。二、概念1、功能定义。为了让卷积运算单元更具灵活性,在输入图层的长宽高、卷积核的大小、Stride的大小等很多功能上可设置。2、feature的内存排布。之前的池化模块的feature,是一个四维数组。而卷积核没有分块前,也是四维的。这边按问答方式对一些概念进行整理。为什么未分块前,卷积核(feature、kernel)为四维的?从下面这张图上看,卷积核可以表示为2x3x3x3,即:个数x长x宽x通道数,不同的地方将这四个参数的位置可能颠倒了下,但都只是这四个概念。下面对这四个参数做个理解,个数:表示不同卷积核的数目,对于一张完整的图(RGB都有),要提取里面的不同特征,需要多个不同的卷积核来进行提取,从之前的学习中,可以知道,卷积核本质就是特征feature,用一个特征怎么可能得到不同特征嘛,所以需要多个卷积核。长x宽:这个为卷积核的size,很好理解,是和局部特征单独运算相关的。通道数:相同卷积核的数目(权值共享),与一张完整图片中准备卷积处理的通道数相同,一般处理R、G、B通道,一个卷积核的通道数,也就为3了,同时可以得到3张feature map。在下面这张图的例子中,输入6x6,kernel为3x3,输出4x4,首先确定不是same模式,为valid模式,padding为0。只看H,有4-1=(6-3+2xpadding)/stride,则stride为1。通过在通道方向上相乘求累加后,9个点再做一次累加,得到输出feature map上的一个点。为什么分块后,卷积核(feature、kernel)为五维的?从下面这张图上看,可以把kernel上任意个数据表示为kernel: CHoutKyKxCHin/KK。CHout表示的是有多少个kernel,Ky和Kx为一个kernel的宽和长,CHin/K为在输入图层方向切了多少个子块,K为每个子块的索引。因此,本设计中,由一个四维的输入图层feature map和五维的feature(卷积核、权重),得到一个输出的feature map输出图层。3、卷积运算的full、same和vaild模式是啥?这个参考了前人的一篇文章,讲的很好,非常感谢,Add在最后边了。橙色为image,蓝色为kernel。1°full mode模式:从image和kernel刚相交,就开始做卷积运算。而其余白色的地方全部填0,这样一张橙色的image先补了两行两列的0后,如果stride为1的卷积运算后,图片反而变大了,这模式很少用。2°same mode模式:当kernel的中心K与image的边角重叠时,开始做卷积运算。这种模式下,如果stride为1的卷积运算后,输出的feature map尺寸是保持不变的(相当于输入图)。相比full mode,这模式就用的多了。该模式可以在前向传播的过程中,让特征图的大小保持不变,调参师不需要精准计算尺寸的变化,因为根本就没有变化。由于卷积核的size尺寸一般为奇数,故可以总结一个padding公式,用来计算需要补多少行列的0数据,才能满足same mode模式。具体公式为:padding_x=(kx-1)/2,padding_y=(ky-1)/2。举个例子,这里size为33,那么,padding_x=padding_y=1。3°valid mode模式:当kernel全在image里时,进行卷积运算,明显地,会丢掉一部分的数据。如何计算卷积运算后的feature map的尺寸大小?也参考了前人的博文,但网上貌似没有发现推导的过程,举几个例子应该也能总结下,这里也直接作为经验来使用了。计算的公式为:output_h =(originalSize_h+padding x 2-kernelSize_h)/stride +1。其中,originalSize_h为原始输入image的H或W,padding为填充的行或列数,kernelSize_h为kernel的size大小,stride为x或y方向上的步长。拿一道面试的题来试试手吧。(卷积向下取整,池化向上取整)input image:200×200first layer_conv:kernel size 5×5,padding 1,stride 2second layer_pooling:kernel size 3×3,padding 0,stride 1third layer_conv:kernel size 3×3,padding 1,stride 1output feature map?答:1°(200-5+21)/2+1 为99.5,取99。2°(99-3)/1+1 为97。3°(97-3+2*1)/1+1 为97。分块时为什么是沿输入图层的方向,而不是输出图层方向?为了并行地做子块的矩阵乘累加运算,得到结果(和之前FIR滤波器案例类似)。要时刻把握住,是取出输入feature map的一个子块,和权重的一个子块,来进行相乘累加的操作。三、程序1、conv_core.h文件。#ifndef _CONV_CORE_H_#define _CONV_CORE_H_#include <ap_int.h>#include <iostream>using namespace std;#define K 8/ 单个数据是16bit位宽,一个子块数据是16*K位宽,用bus表示。/ 输入图层和权重都是ap_int<16>typedef ap_int<16> dtype_dat;typedef ap_int<16*K> dtype_bus;/ 两个INT16数据相乘,得到的结果会溢出,用32位来存。根据经验,用40位来作为累加的结果位宽。typedef ap_int<32> dtype_mul;typedef ap_int<32*K> dtype_mul_bus;typedef ap_int<40> dtype_acc;/ C语言无法传可变索引的数组的,但在硬件内存中,都按照一维分布,故可以把地址传进去。/ 后续得自己计算存放的地址来取数据/ 定点化后的数据由三个小数点的参数来计算得到,INT16,小数点由四位来表示void Conv(ap_uint<16> CHin, / 输入通道数ap_uint<16> Hin, / 输入特征的高度ap_uint<16> Win, / 输入特征的宽度ap_uint<16> CHout, / 输出特征的通道数ap_uint<8> Kx, / 卷积核的宽度ap_uint<8> Ky, / 卷积核的高度ap_uint<8> Sx, / 卷积核扫描时,宽度方向的步进ap_uint<8> Sy, / 卷积核扫描时,高度方向的步进ap_uint<1> mode, / 卷积的模式,valid还是sameap_uint<1> relu_en, / 激活非线性反激活层标志dtype_bus feature_in, / 输入feature map的数据,由于C中无法使用可变数组,故使用指针,传地址来定位具体数据,四维数组按一维分布/ 之前池化使用的是固定大小的,可以按照固定数组来传,但这里数组长度是变的ap_uint<4> feature_in_precision, / 输入feature map数据小数点位置dtype_bus W, / 输入权重的数据,也是指针索引ap_uint<4> W_precision, / 输入权重数据小数点位置dtype_bus feature_out, / 输出feature map的数据,也是指针索引ap_uint<4> feature_out_precision / 输出feature map数据小数点位置);/mode: 0:VALID, 1:SAME#endif2、conv_core.cpp文件。#include "conv_core.h"/ 输入特征图四维:C/KHWK/ 输入权重值五维:CHoutKyKxCHin/KK/ 输出特征图四维:C/KHWK,均可以计算出来void Conv(ap_uint<16> CHin, / 输入通道数(输入图层方向上的数目)(卷积核与特征图参量)ap_uint<16> Hin, / 输入特征的高度(卷积核与特征图参量)ap_uint<16> Win, / 输入特征的宽度(卷积核与特征图参量)ap_uint<16> CHout, / 输出特征的通道数(卷积核参量)ap_uint<8> Kx, / 卷积核的宽度ap_uint<8> Ky, / 卷积核的高度ap_uint<8> Sx, / 卷积核扫描时,宽度方向的步进ap_uint<8> Sy, / 卷积核扫描时,高度方向的步进ap_uint<1> mode, / 卷积的模式,valid还是sameap_uint<1> relu_en, / 激活非线性反激活层标志dtype_bus feature_in, / 输入feature map的数据,由于C中无法使用可变数组,故使用指针,传地址来定位具体数据,四维数组按一维分布/ 之前池化使用的是固定大小的,可以按照固定数组来传,但这里数组长度是变的ap_uint<4> feature_in_precision, / 输入feature map数据小数点位置dtype_bus W, / 输入权重的数据,也是指针索引ap_uint<4> W_precision, / 输入权重数据小数点位置dtype_bus feature_out, / 输出feature map的数据,也是指针索引ap_uint<4> feature_out_precision / 输出feature map数据小数点位置)/mode: 0:VALID, 1:SAMEap_uint<8> pad_x,pad_y; / padding数据,表示x和y方向待填补的行列数ap_uint<16> CHin_div_K=(CHin+K-1)/K; / 输入图层方向上,切块后每个的长度ap_uint<5> out_truncate;out_truncate=feature_in_precision+W_precision-feature_out_precision;if(mode=0) / valid下不进行paddingpad_x=

注意事项

本文(HLS-卷积运算单元设计与SDK测试)为本站会员(Baige****0346)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.