主要内容

利用FPGA部署运行Convolution-Only网络

典型的系列分类网络包括一个序列卷积层后面跟着一个或多个完全连接层。最近的研究结果表明,实现更好的性能特征提取和识别利用卷积层直接激活,而不是那些从随后的完全连接层。

理解和调试卷积网络运行和可视化数据是一个有用的工具。这个例子显示了如何部署、运行和调试convolution-only网络通过使用FPGA部署。

先决条件

  • Xilinx™Zynq™ZCU102评估工具

  • 深度学习HDL工具箱™支持包Xilinx FPGA和S金宝appoC

  • 深度学习工具箱™

  • 深度学习HDL工具箱™

  • 深度学习工具箱™模型Resnet-50网络

Resnet-50网络

ResNet-50卷积神经网络是50层深。这个pretrained网络可以分类图像到1000年对象类别(如键盘、鼠标、铅笔,和更多)。网络已经学会丰富广泛的图像特征表示。的网络图像输入大小224 - 224。这个示例使用ResNet50作为起点。

负载Resnet-50网络

加载ResNet-50网络。

rnet = resnet50;

可视化的结构Resnet-50网络,在MATLAB®命令提示符,输入:

analyzeNetwork (rnet)

只创建一个卷积网络

一个卷积网络是由选择的一个子集ResNet-50网络。的子集只包含第一个五层ResNet50卷积性质的网络。

只创建卷积网络,输入:

层= rnet.Layers (1:5);支出= regressionLayer (“名字”,“输出”);层(端+ 1)=支出;snet = assembleNetwork(层);

创建目标对象

部署网络的FPGA,创建一个目标对象和一个自定义的名字和一个接口来连接你的目标主机设备。JTAG接口选项和以太网。利用JTAG、安装Xilinx™Vivado™2019.2设计套件。设置Xilinx Vivado刀具轨迹,输入:

% hdlsetuptoolpath (“ToolName”、“Xilinx Vivado”、“路径”,“D: /分享/应用程序/ HDLTools / Vivado / 2019.2 -mw-0 /赢/ Vivado / 2019.2 \ bin \ vivado.bat ');
hTarget = dlhdl.Target (“Xilinx”,“界面”,“以太网”);

创建工作流对象

创建一个对象dlhdl.Workflow类。当您创建对象,指定网络和比特流的名字。指定保存pretrained卷积只有网络,snet,如网络。确保比特流名称匹配的数据类型和FPGA板你的目标。在这个例子中,目标FPGA板Xilinx ZCU102 SOC。比特流使用一个数据类型。使用dlhdl.Workflow对象部署网络包括卷积和卷积完全连接层或层。

hW = dlhdl.Workflow (“网络”snet,“比特流”,“zcu102_single”,“目标”,hTarget);

编译只卷积网络

编译只卷积网络运行的编译功能dlhdl.Workflow对象。

hW.compile

dn = hW.compile
# # #系列优化网络:融合“nnet.cnn.layer.BatchNormalizationLayer”到“nnet.cnn.layer.Convolution2DLayer”offset_name offset_address allocated_space ___________ _______________________ * * *“InputDataOffset”“0 x00000000”“24.0 MB”“OutputResultOffset”“0 x01800000”“24.0 MB”“SystemBufferOffset”“0 x03000000”“28.0 MB”“InstructionDataOffset”“0 x04c00000”“4.0 MB”“ConvWeightDataOffset”“0 x05000000”“4.0 MB”“EndOffset”“0 x05400000”“总:84.0 MB”
dn =结构体字段:运营商:[1×1 struct] LayerConfigs: [1×1 struct] NetConfigs: [1×1 struct]

程序比特流到FPGA和下载网络权重

部署网络在Xilinx ZCU102硬件,运行部署的功能dlhdl.Workflow对象。这个函数使用编译函数程序的输出FPGA板通过编程文件。函数也下载网络权重和偏见。部署功能程序FPGA器件,显示进度信息,所花费的时间部署网络。

hW.deploy
# # # FPGA比特流编程已经跳过了相同的比特流已经加载目标FPGA。# # #深度学习网络编程被跳过为同一个网络已经加载目标FPGA。

加载示例图片

加载和显示一个图像作为一个输入图像系列网络。

我= imread (“daisy.jpg”);imshow(我)

运行预测

执行的预测功能dlhdl.Workflow对象。

[P]速度= hW.predict(单(我),“配置文件”,“上”);
# # #写完输入激活。# # #运行单个输入激活。
深度学习处理器分析器性能结果LastLayerLatency(周期)LastLayerLatency总延迟(秒)FramesNum帧/ s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -网络2813005 0.01279 - 1 2813005 78.2 conv1 conv_module 2813005 0.01279 2224168 0.01011 588864年max_pooling2d_1 0.00268 * DL处理器的时钟频率:220 mhz

结果数据作为一个三维数组,返回第三维索引整个64特征图像。

深圳=大小(P)
深圳=1×356 56 64

可视化64所有功能在一个单一的形象,重塑数据分为四个维度,这是适当的输入imtile函数

R =重塑(P,深圳(1)深圳(2)1深圳(3)]);深圳=大小(右)
深圳=1×456 56 64

第三维的输入imtile函数代表了图像的颜色。设置三维尺寸1因为激活信号在这个例子中是标量,不包括颜色。第四维度的索引通道。

的输入imtile归一化使用mat2gray。所有值扩展的最小激活是0,最大激活是1。

J = imtile (mat2gray (R),“GridSize”[8]);

网格的大小选择8-by-8因为有64来显示特性。

imshow (J)

图像显示激活数据为每个64特性。明亮的特征显示出强大的激活。

卷积的输出层只有网络不同于一个网络卷积和完全连接层。卷积层是用来减少输入图像的大小,同时保持功能,这需要得到一个好的预测。卷积仅用于研究特征提取层网络。早些时候卷积层是用来提取低层次特征,如边缘、颜色、渐变等。后来卷积层用于提取高级特性,比如模式,曲线、线条等等。这些高级功能可以用来识别对象。