使用FPGA部署运行卷积网络
典型的级数分类网络包括一个卷积层序列,后面是一个或多个全连接层。最近的研究结果表明,直接使用卷积层激活比从后续的全连接层激活获得更好的特征提取和识别性能。
为了理解和调试卷积网络,运行和可视化数据是一个有用的工具。这个例子展示了如何使用FPGA部署,运行和调试卷积网络。
先决条件
Xilinx™Zynq™ZCU102检测试剂盒
深度学习HDL工具箱™支持包Xilinx FPGA和S金宝appoC
深度学习工具箱™
深度学习HDL工具箱™
Resnet-50网络的深度学习工具箱™模型
Resnet-50网络
ResNet-50是一个50层的卷积神经网络。这个预先训练的网络可以将图像分类为1000个对象类别(如键盘、鼠标、铅笔等)。该网络已经为广泛的图像学习了丰富的特征表示。该网络的图像输入大小为224 * 224。本例使用ResNet50作为起点。
加载Resnet-50网络
加载ResNet-50网络。
Rnet = resnet50;
为了可视化Resnet-50网络的结构,在MATLAB®命令提示符下,输入:
analyzeNetwork (rnet)
创建一个仅卷积网络
仅卷积网络是通过选择ResNet-50网络的一个子集来创建的。该子集仅包括ResNet50网络的前五层,这些层本质上是卷积的。
要创建只卷积的网络,输入:
图层= rnet.Layers(1:5);outLayer = regressionLayer(“名字”,“输出”);layers(end+1) = outLayer;snet =装配网络(层);
创建目标对象
要在FPGA上部署网络,需要创建一个具有自定义名称和接口的目标对象,用于将目标设备连接到主机。接口选项为JTAG和Ethernet。要使用JTAG,请安装Xilinx™Vivado™Design Suite 2020.2。要设置Xilinx Vivado工具路径,输入:
%hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'D:/share/apps/HDLTools/Vivado/2020.2- mb -0/Win/Vivado/2020.2\bin\ Vivado .bat');
hTarget = dlhdl。目标(“Xilinx”,“界面”,“以太网”);
创建工作流对象
属性的对象dlhdl。工作流
类。创建对象时,指定网络和位流名称。指定保存的预训练的纯卷积网络,snet
,作为网络。请确保位流名称与数据类型和目标FPGA板匹配。本例中目标FPGA板为Xilinx ZCU102 SOC板。位流使用单一数据类型。使用dlhdl。工作流
对象部署既包括卷积层又包括全连接层或只包括卷积层的网络。
hW = dlhdl。工作流(“网络”snet,“比特流”,“zcu102_single”,“目标”, hTarget);
编译卷积网络
命令的compile函数编译仅卷积的网络dlhdl。工作流
对象。
hW.compile
dn = hW.compile
###优化系列网络:融合“nnet.cnn.layer.BatchNormalizationLayer”到“nnet.cnn.layer.Convolution2DLayer”offset_name offset_address allocated_space _______________________ ______________ ________________“InputDataOffset”“0x00000000”“24.0 MB”“OutputResultOffset”“0x01800000”“24.0 MB”“SystemBufferOffset”“0x03000000”“28.0 MB”“InstructionDataOffset”“0x04c00000”“4.0 MB”“ConvWeightDataOffset”“0x05000000”“4.0 MB”“EndOffset”“0x05400000”“Total: 84.0 MB”
dn =带字段的结构:操作员:[1×1 struct] LayerConfigs: [1×1 struct] NetConfigs: [1×1 struct]
编程位流到FPGA和下载网络权值
要在Xilinx ZCU102硬件上部署网络,请运行dlhdl。工作流
对象。该函数利用编译函数的输出,通过编程文件对FPGA板进行编程。该函数还下载网络权重和偏差。部署功能对FPGA设备进行编程,显示进度消息和部署网络所需的时间。
hW.deploy
FPGA位流编程已经跳过,因为相同的位流已经加载到目标FPGA上。深度学习网络编程已经跳过,因为目标FPGA上已经加载了相同的网络。
加载示例
加载并显示图像,将其用作系列网络的输入图像。
I = imread(“daisy.jpg”);imshow(我)
运行预测
的预测函数dlhdl。工作流
对象。
[P, speed] = hW.predict(单(I),“配置文件”,“上”);
###已完成输入激活。###运行单输入激活。
Deep Learning Processor Profiler性能结果LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 2813005 0.01279 1 2813015 78.2 conv_module 2813005 0.01279 conv1 2224168 0.01011 max_pooling2d_1 588864 0.00268 * DL处理器的时钟频率为:220MHz
结果数据作为一个3-D数组返回,其中包含横跨64个特征图像的3维索引。
sz = size(P)
深圳=1×356 56 64
为了在一张图像中可视化所有64个特征,数据被重新塑造为四维,这是适当的输入到imtile
函数
R =重塑(P, [sz(1) sz(2) 1 sz(3)]);sz = size(R)
深圳=1×456 56 1 64
第三个维度的输入imtile
函数表示图像颜色。将第三个维度设置为大小1,因为本例中的激活信号是标量,不包括颜色。第四个维度对通道进行索引。
的输入imtile
使用mat2gray
.所有值都按比例缩放,使最小激活值为0,最大激活值为1。
J = imtile(mat2gray(R),“GridSize”, [8 8]);
之所以选择8x8的网格大小,是因为有64个特征要显示。
imshow (J)
该图像显示了64个特性中的每一个的激活数据。明亮的特征表明强烈的激活。
只有卷积层的网络输出与有卷积层和全连通层的网络输出不同。卷积层用于减少输入图像的大小,同时保持获得良好预测所需的特征。仅卷积层网络用于研究特征提取。早期的卷积层用于提取低级特征,如边缘、颜色、梯度等。之后的卷积层用于提取高级特征,如图案、曲线、线条等。然后可以使用这些高级特性来识别对象。
另请参阅
dlhdl。工作流
|dlhdl。目标
|激活
|编译
|部署
|预测