0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在TensorFlow2里使用Keras API创建一个自定义CNN网络?

电子工程师 来源:XILINX技术社区 作者:张超 2021-04-15 11:36 次阅读

概述

本示例工程中我们会在 TensorFlow2 下使用 Keras API 创建一个自定义 CNN 网络,在 Vitis-AI 1.3 环境下编译成 Xilinx DPU 上运行的模型文件,并在 Xilinx zynqMP 上部署运行。

该示例工程应在 Vitis-AI1.3 Docker,vitis-ai-tensorflow2conda 环境中运行。

有关Mnist手写数字数据集,请参见http://yann.lecun.com/exdb/mnist/。

在该例程中我们会演示以下的步骤:

使用 TensorFlow2 训练和评估小型自定义卷积神经网络

对浮点模型进行量化 (quantization)

对量化模型进行评估

使用校准数据集对训练后的模型进行微调 (finetuning)

编译量化和微调的模型,以创建 .xmodel 文件,准备在 DPU 加速器 IP 上执行在 zynqMP 评估板上下载并运行该模型

代码说明

可从下面的 github 页面获得源码。

https://github.com/lobster1989/Mnist-classification-Vitis-AI-1.3-TensorFlow2

Python 及 Shell 脚本源码说明如下:

load_data.py:下载 Mnist 数据集;

generate_images.py:从 Keras 在线数据集生成本地图像文件;

train.py:创建和训练用于 Mnist 分类的简单 CNN 模型, 经过训练的浮点模型将被保存到本地;

quantize.py:使用 VitisQuantizer 量化前一个步骤保存的浮点模型,量化后的模型将被保存到本地;

eval_quantized.py:评估量化模型的 accuracy;

finetune.py:利用 Vitis-AI 进行模型微调(仅作演示,后续编译部署的为 quantize 步骤保存的模型);

compile_zcu102.sh/compile_zcu104.sh:启动 vai_c_tensorflow2 命令以将量化或微调的模型编译为供 DPU 运行的 .xmodel 文件。两个文件分别对应目标为 zcu102 和 zcu104 开发板;

make_target_zcu102.sh/make_target_zcu104.sh:将.xmodel和图像复制到 。/target_zcu10x 文件夹中,准备好将其复制到 zcu102/zcu104 评估板的 SD 卡中。

模型创建/量化/编译

在运行此部分之前,我们应在 Vitis-AI docker 环境下激活 vitis-ai-tensorflow2anaconda 环境。有关更多详细信息,请参阅最新版本的 UG1414。

(vitis-ai-tensorflow2) Vitis-AI /workspace/myproj/tf2-mnist-end-to-end 》 python train.py

Load Mnist dataset.。

Create custom cnn.。

Model: “mnist_customcnn_model”

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

input_1 (InputLayer) [(None, 28, 28, 1)] 0

_________________________________________________________________

conv2d (Conv2D) (None, 26, 26, 32) 320

_________________________________________________________________

max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0

_________________________________________________________________

conv2d_1 (Conv2D) (None, 11, 11, 64) 18496

_________________________________________________________________

max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0

_________________________________________________________________

conv2d_2 (Conv2D) (None, 3, 3, 64) 36928

_________________________________________________________________

flatten (Flatten) (None, 576) 0

_________________________________________________________________

dense (Dense) (None, 64) 36928

_________________________________________________________________

dense_1 (Dense) (None, 10) 650

=================================================================

Total params: 93,322

Trainable params: 93,322

Non-trainable params: 0

_________________________________________________________________

Fit on dataset.。

Epoch 1/10

782/782 [==============================] - 13s 16ms/step - loss: 0.1843 - accuracy: 0.9427 - val_loss: 0.0701 - val_accuracy: 0.9813

Epoch 2/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0529 - accuracy: 0.9835 - val_loss: 0.0543 - val_accuracy: 0.9855

Epoch 3/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0346 - accuracy: 0.9894 - val_loss: 0.0472 - val_accuracy: 0.9877

Epoch 4/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0252 - accuracy: 0.9929 - val_loss: 0.0463 - val_accuracy: 0.9878

Epoch 5/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0188 - accuracy: 0.9945 - val_loss: 0.0494 - val_accuracy: 0.9896

Epoch 6/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0147 - accuracy: 0.9956 - val_loss: 0.0513 - val_accuracy: 0.9901

Epoch 7/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0121 - accuracy: 0.9966 - val_loss: 0.0452 - val_accuracy: 0.9920

Epoch 8/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0096 - accuracy: 0.9973 - val_loss: 0.0542 - val_accuracy: 0.9906

Epoch 9/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0088 - accuracy: 0.9976 - val_loss: 0.0640 - val_accuracy: 0.9893

Epoch 10/10

782/782 [==============================] - 5s 7ms/step - loss: 0.0073 - accuracy: 0.9978 - val_loss: 0.0709 - val_accuracy: 0.9893

Save trained model to./models/float_model.h5.

Evaluate model on test dataset.。

157/157 [==============================] - 1s 3ms/step - loss: 0.0426 - accuracy: 0.9911

loss: 0.043

acc: 0.991

(vitis-ai-tensorflow2) Vitis-AI /workspace/myproj/tf2-mnist-end-to-end 》 python quantize.py

Load float model.。

Load Mnist dataset.。

Run quantization.。

[INFO] Start CrossLayerEqualization.。.

10/10 [==============================] - 0s 32ms/step

[INFO] CrossLayerEqualization Done.

[INFO] Start Quantize Calibration.。.

157/157 [==============================] - 12s 77ms/step

[INFO] Quantize Calibration Done.

[INFO] Start Generating Quantized Model.。.

[Warning] Skip quantize pos adjustment for layer quant_dense, its quantize pos is [i=None, w=8.0, b=9.0, o=3.0]

[INFO] Generating Quantized Model Done.

Saved quantized model as 。/models/quantized_model.h5

(vitis-ai-tensorflow2) Vitis-AI /workspace/myproj/tf2-mnist-end-to-end 》 python eval_quantized.py

Load quantized model.。

WARNINGNo training configuration found in the save file, so the model was *not* compiled. Compile it manually.

Load Mnist dataset.。

Compile model.。

Evaluate model on test Dataset

157/157 [==============================] - 4s 22ms/step - loss: 0.0417 - accuracy: 0.9913

loss: 0.042

acc: 0.991

(vitis-ai-tensorflow2) Vitis-AI /workspace/myproj/tf2-mnist-end-to-end 》 python finetune.py

Load float model.。

Load Mnist dataset.。

Create quantize training model.。

[INFO] Start CrossLayerEqualization.。.

10/10 [==============================] - 0s 33ms/step

[INFO] CrossLayerEqualization Done.

Compiling model.。

Fit on Dataset.。

Epoch 1/10

782/782 [==============================] - 48s 61ms/step - loss: 0.0077 - accuracy: 0.9978 - val_loss: 0.0738 - val_accuracy: 0.9882

Epoch 2/10

782/782 [==============================] - 39s 50ms/step - loss: 0.0062 - accuracy: 0.9980 - val_loss: 0.0845 - val_accuracy: 0.9888

Epoch 3/10

782/782 [==============================] - 40s 51ms/step - loss: 0.0058 - accuracy: 0.9983 - val_loss: 0.0810 - val_accuracy: 0.9885

Epoch 4/10

782/782 [==============================] - 40s 51ms/step - loss: 0.0061 - accuracy: 0.9982 - val_loss: 0.0744 - val_accuracy: 0.9902

Epoch 5/10

782/782 [==============================] - 40s 51ms/step - loss: 0.0048 - accuracy: 0.9984 - val_loss: 0.0834 - val_accuracy: 0.9911

Epoch 6/10

782/782 [==============================] - 39s 50ms/step - loss: 0.0047 - accuracy: 0.9986 - val_loss: 0.0807 - val_accuracy: 0.9893

Epoch 7/10

782/782 [==============================] - 39s 50ms/step - loss: 0.0039 - accuracy: 0.9987 - val_loss: 0.0894 - val_accuracy: 0.9903

Epoch 8/10

782/782 [==============================] - 39s 50ms/step - loss: 0.0034 - accuracy: 0.9989 - val_loss: 0.0863 - val_accuracy: 0.9904

Epoch 9/10

782/782 [==============================] - 39s 49ms/step - loss: 0.0042 - accuracy: 0.9989 - val_loss: 0.1043 - val_accuracy: 0.9893

Epoch 10/10

782/782 [==============================] - 39s 50ms/step - loss: 0.0044 - accuracy: 0.9986 - val_loss: 0.0994 - val_accuracy: 0.9908

Saved finetuned model as 。/models/finetuned_model.h5

Evaluate model on test Dataset.。

157/157 [==============================] - 1s 7ms/step - loss: 0.0675 - accuracy: 0.9920

loss: 0.068

acc: 0.992

(vitis-ai-tensorflow2) Vitis-AI /workspace/myproj/tf2-mnist-end-to-end 》 bash -x compile_zcu102.sh

+ ARCH=/opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU102/arch.json

+ OUTDIR=。/compiled_model

+ NET_NAME=customcnn

+ MODEL=。/models/finetuned_model.h5

+ echo -----------------------------------------

-----------------------------------------

+ echo ‘COMPILING MODEL FOR ZCU102.。’

COMPILING MODEL FOR ZCU102.。

+ echo -----------------------------------------

-----------------------------------------

+ compile

+ tee compile.log

+ vai_c_tensorflow2 --model 。/models/finetuned_model.h5 --arch /opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU102/arch.json --output_dir 。/compiled_model --net_name customcnn

/opt/vitis_ai/conda/envs/vitis-ai-tensorflow2/lib/python3.7/site-packages/xnnc/translator/tensorflow_translator.py H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.

value = param.get(group).get(ds).value

[INFO] parse raw model :100%|██████████| 10/10 [00:00《00:00, 16871.70it/s]

[INFO] infer shape (NHWC) :100%|██████████| 26/26 [00:00《00:00, 2956.30it/s]

[INFO] generate xmodel :100%|██████████| 26/26 [00:00《00:00, 5561.60it/s]

[INFO] Namespace(inputs_shape=None, layout=‘NHWC’, model_files=[‘。/models/finetuned_model.h5’], model_type=‘tensorflow2’, out_filename=‘。/compiled_model/customcnn_org.xmodel’, proto=None)

[INFO] tensorflow2 model: models/finetuned_model.h5

[OPT] No optimization method available for xir-level optimization.

[INFO] generate xmodel: /workspace/myproj/tf2-mnist-end-to-end/compiled_model/customcnn_org.xmodel

[UNILOG][INFO] The compiler log will be dumped at “/tmp/vitis-ai-user/log/xcompiler-20210325-093926-3120”

[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA0_B4096_MAX_BG2

[UNILOG][INFO] Compile mode: dpu

[UNILOG][INFO] Debug mode: function

[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA0_B4096_MAX_BG2

[UNILOG][INFO] Graph name: mnist_customcnn_model, with op num: 42

[UNILOG][INFO] Begin to compile.。.

[UNILOG][INFO] Total device subgraph number 3, DPU subgraph number 1

[UNILOG][INFO] Compile done.

[UNILOG][INFO] The meta json is saved to “/workspace/myproj/tf2-mnist-end-to-end/。/compiled_model/meta.json”

[UNILOG][INFO] The compiled xmodel is saved to “/workspace/myproj/tf2-mnist-end-to-end/。/compiled_model/customcnn.xmodel”

[UNILOG][INFO] The compiled xmodel‘s md5sum is 764142e83d074ea9470b9eb9d0757f68, and been saved to “/workspace/myproj/tf2-mnist-end-to-end/。/compiled_model/md5sum.txt”

**************************************************

* VITIS_AI Compilation - Xilinx Inc.

**************************************************

+ echo -----------------------------------------

-----------------------------------------

+ echo ’MODEL COMPILED‘

MODEL COMPILED

+ echo -----------------------------------------

-----------------------------------------

(vitis-ai-tensorflow2) Vitis-AI /workspace/myproj/tf2-mnist-end-to-end 》 bash -x make_target_zcu102.sh

+ echo -----------------------------------------

-----------------------------------------

+ echo ’MAKE TARGET ZCU102 STARTED.。‘

MAKE TARGET ZCU102 STARTED.。

+ echo -----------------------------------------

-----------------------------------------

+ TARGET_ZCU102=。/target_zcu102

+ COMPILE_ZCU102=。/compiled_model

+ APP=。/application

+ NET_NAME=customcnn

+ rm -rf 。/target_zcu102

+ mkdir -p 。/target_zcu102/model_dir

+ cp 。/application/app_mt.py 。/target_zcu102

+ echo ’ Copied application to TARGET_ZCU102 folder‘

Copied application to TARGET_ZCU102 folder

+ cp 。/compiled_model/customcnn.xmodel 。/target_zcu102/model_dir/。

+ echo ’ Copied xmodel file(s) to TARGET_ZCU102 folder‘

Copied xmodel file(s) to TARGET_ZCU102 folder

+ mkdir -p 。/target_zcu102/images

+ python generate_images.py --dataset=mnist --image_dir=。/target_zcu102/images --image_format=jpg --max_images=10000

2021-03-25 0934.445257: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1

Command line options:

--dataset : mnist

--subset : test

--image_dir : 。/target_zcu102/images

--image_list :

--label_list :

--image_format : jpg

--max_images : 10000

+ echo ’ Copied images to TARGET_ZCU102 folder‘

Copied images to TARGET_ZCU102 folder

+ echo -----------------------------------------

-----------------------------------------

+ echo ’MAKE TARGET ZCU102 COMPLETED‘

MAKE TARGET ZCU102 COMPLETED

+ echo -----------------------------------------

-----------------------------------------

在 ZynqMP 评估板上运行

进行电路板设置。

之后,将 target_zcu10x 目录中的所有文件复制到 SD 卡。从 SD 卡启动 ZCU10x(下面实例运行的是 zcu104),运行 app_mt.py。结果显示,实际运行模型的精度为 99.13%.

root@xilinx-zcu104-2020_2:~/target_zcu104# python3 app_mt.py --threads 4

Command line options:

--image_dir : images

--threads : 4

--model : model_dir/customcnn.xmodel

Pre-processing 10000 images.。.

Starting 4 threads.。.

Throughput=5622.61 fps, total frames = 10000, time=1.7785 seconds

Correct:9913, Wrong:87, Accuracy:0.9913

原文标题:开发者分享 | Vitis-AI 1.3/TensorFlow2 环境下使用自定义 CNN 模型进行 Mnist 分类

文章出处:【微信公众号:XILINX技术社区】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    1379

    浏览量

    60983
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47667

原文标题:开发者分享 | Vitis-AI 1.3/TensorFlow2 环境下使用自定义 CNN 模型进行 Mnist 分类

文章出处:【微信号:gh_2d1c7e2d540e,微信公众号:XILINX开发者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用BGM210L创建自定义PCB,是否可以与GPIO引脚共享调试引脚?

    你好 我想使用 BGM210L 创建自定义 PCB,并在此自定义 PCB 上实现调试接口(SWCLK、SWDIO 等)。 由于只有几个引
    发表于 01-16 08:12

    基于TensorFlowKeras的图像识别

    TensorFlowKeras最常见的用途之一是图像识别/分类。通过本文,您将了解如何使用Keras达到这一目的。定义如果您不了解图像识别的基本概念,将很难完全理解本文的内容。因此在
    的头像 发表于 01-13 08:27 373次阅读
    基于<b class='flag-5'>TensorFlow</b>和<b class='flag-5'>Keras</b>的图像识别

    博途用户自定义库的使用

    博途官方提供了很多库,比如:基本函数库、通信库、安全库、驱动库等等,用户可以使用库中的函数/函数块来完成具体的控制任务。除了官方的库,我们也可以创建自己的库(用户自定义库)。比如,把项目
    的头像 发表于 12-25 10:08 286次阅读
    博途用户<b class='flag-5'>自定义</b>库的使用

    怎样为显示器创建自定义分辨率呢?

    您可以为大多数显示器创建自定义分辨率和刷新率。这可以解决可能不使用标准 Windows 分辨率的显示器,或更正可能导致显示器兼容性问题的无效显示器 EDID。
    的头像 发表于 11-16 09:41 1687次阅读
    怎样为显示器<b class='flag-5'>创建</b><b class='flag-5'>自定义</b>分辨率呢?

    何在Matlab中自定义Message

    自定义Message 当我们的 message 消息比较复杂时,通常要用到自定义的 message 消息,MATLAB 2020b以上的版本自带了ROS Toolbox Interface
    的头像 发表于 11-15 18:12 408次阅读
    如<b class='flag-5'>何在</b>Matlab中<b class='flag-5'>自定义</b>Message

    Android端自定义铃声 MobPush对安卓端自定义铃声的教程

    如何为APP推送设置独特的通知铃声呢?本次带来的是MobPush对安卓端自定义铃声的教程,快来看看吧~
    的头像 发表于 10-21 15:34 810次阅读
    Android端<b class='flag-5'>自定义</b>铃声 MobPush对安卓端<b class='flag-5'>自定义</b>铃声的教程

    OpenHarmony自定义构建函数:@Builder装饰器

    ()函数语法规则,开发者可以将重复使用的UI元素抽象成方法,在build方法调用。 为了简化语言,我们将@Builder装饰的函数也称为“自定义构建函数”。 说明: 从
    发表于 09-26 16:36

    OpenHarmony自定义组件介绍

    使用@Entry装饰自定义组件。@Entry可以接受可选的LocalStorage的参数。 说明: 从
    发表于 09-25 15:36

    OpenHarmony应用开发之自定义弹窗

    本文转载自《OpenHarmony应用开发之自定义弹窗》,作者:zhushangyuan_ ​ 应用场景 在应用的使用和开发中,弹窗是很常见的场景,自定义弹窗又因为极高的自由度得以
    发表于 09-06 14:40

    labview超快自定义控件制作和普通自定义控件制作

    labview超快自定义控件制作和普通自定义控件制作
    发表于 08-21 10:32 5次下载

    Keras搭建神经网络般步骤

    1 keras是什么? Keras用 Python 编写的高级神经网络 API,它能够
    发表于 08-18 07:35

    keras顺序模型与函数式模型

    模型 顺序模型允许逐层创建模型以解决许多问题,但是有时我们需要创建更加复杂的模型,比如具有共享图层或多输入多输出的模型,这时我们可以使用keras提供的函数式API模型,它
    发表于 08-18 06:01

    教程 2:添加特征-自定义配置文件创建

    教程 2:添加特征 - 自定义配置文件创建
    发表于 07-06 18:50 0次下载
    教程 2:添加特征-<b class='flag-5'>自定义</b>配置文件<b class='flag-5'>创建</b>

    labview自定义控件

    labview自定义精美控件
    发表于 05-15 16:46 9次下载

    用于改进应用的自定义逻辑外设

    PIC® 和 AVR® 微控制器 (MCU) 上的自定义逻辑外设是功能强大的工具,可用于创建独立于 CPU 运行的分立逻辑小块。PIC 微控制器具有可配置逻辑单元 (CLC),而 AVR 微控制器
    的头像 发表于 05-06 09:51 606次阅读
    用于改进应用的<b class='flag-5'>自定义</b>逻辑外设