• [技术干货] MindSpore简介
    MindSpore可以做模型的自动切分这一点让人印象深刻。当然,还有很多特点,比如自动微分、支持动态图+静态图,等等。如果希望了解更多,请看MindSpore官网:MindSpore​www.mindspore.cn/对于个人来讲,去年便对MindSpore有简单了解,做过一些其与TensorFlow、PyTorch的对比分析。因为此前尚未开源,只能基于公开的文档做调研而已。而三月底,在HDC大会时,华为正式开源了MindSpore的源码和相应的文档。因而有机会实际拿来运行看看,本文将介绍如何在Windows平台安装和搭建MindSpore,同时训练一个小的网络(LeNet)。安装MindSpore截至今天,MindSpore官网建议的安装操作系统为EulerOS和Ubuntu,并不包括Windows。而不幸的是我的这台Lenovo游戏主机是Windows 10的系统。仔细了下文档,发现实际上MindSpore是支持Windows平台的[1],只不过只能以CPU的模式运行(暂时不支持Windows平台的GPU)。如果希望尝试MindSpore对GPU的支持,需要使用Ubuntu系列或者华为的EulerOS(这也不是本文的重点)。下面进入安装的正题。安装Anaconda非常推荐使用Anaconda作为Python虚拟环境的管理。你可以去Anaconda官网下载,一路Next即可。如果遇到问题,可适当参考这里。由于Anaconda的安装过程简单直观,这里不详述了。创建MindSpore的Python Env目前MindSpore仅仅支持Python 3.7.5,下面创建的pyhton env就叫做mindspore:conda create -n mindspore python=3.7.5安装MindSpore下载MindSpore的whl文件,下载地址见这里,目前只有一个0.1.0的版本mindspore-0.1.0-cp37-cp37m-win_amd64.whl在mindspore这个python env里执行:conda activate mindspore # 此时你应该在mindspore-0.1.0-cp37-cp37m-win_amd64.whl这个文件的目录里pip install mindspore-0.1.0-cp37-cp37m-win_amd64.whl注意,这里很多同学反应安装过程很慢,甚至有失败的情况,基本都是网络惹得祸。因为安装上面的whl文件时会按照一些依赖的libraries,如果你的pip是默认源的话,在国内的网络下载时可能遇到问题的。一个解决办法是重试(yes, just retry),另一个办法是把pip源切换为国内的源,比如清华源。具体方法见这里:Tsinghua Open Source Mirror​mirror.tuna.tsinghua.edu.cn/help/pypi/正在上传…重新上传取消​一个临时的办法可以是:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mindspore-0.1.0-cp37-cp37m-win_amd64.whl验证Spore安装是否成功python>>> import mindspore as ms>>> print(ms.__version__)# 如果成功,上面应该打印 0.1.0训练一个LeNet华为官方已经在其MindSpore Doc这个Repo里内置了一些examples,比如LeNet。直接Fork吧:git clone https://github.com/mindspore-ai/docs.git如果你和我一样懒,仅仅下载lenet.py也可以,路径如下:https://github.com/mindspore-ai/docs/blob/master/tutorials/tutorial_code/lenet.py训练LeNet因为这个代码里默认使用的训练设备为Ascend,所以需要手动设置一下--device_target为CPU:python lenet.py --device_target CPUMindSpore用LeNet训练MNIST大约十几秒就可以跑完一个Epoch了:******Downloading the MNIST dataset******============== Starting Training ==============epoch: 1 step: 1, loss is 2.3008137epoch: 1 step: 2, loss is 2.299688epoch: 1 step: 3, loss is 2.309444epoch: 1 step: 4, loss is 2.3006275epoch: 1 step: 5, loss is 2.3028035epoch: 1 step: 6, loss is 2.302422epoch: 1 step: 7, loss is 2.3067183epoch: 1 step: 8, loss is 2.3057096epoch: 1 step: 9, loss is 2.3042586epoch: 1 step: 10, loss is 2.303799.........epoch: 1 step: 1870, loss is 0.15847126epoch: 1 step: 1871, loss is 0.12955114epoch: 1 step: 1872, loss is 0.15605931epoch: 1 step: 1873, loss is 0.28985676epoch: 1 step: 1874, loss is 0.14183074epoch: 1 step: 1875, loss is 0.05726877============== Starting Testing ============================ Accuracy:{'Accuracy': 0.9625400641025641} ==============看看Accuracy,已经到96.25%,还可以~我们观察一下这个目录,会看到同时还保存了模型文件(.ckpt和.meta)还有train、val时的pb文件,具体待后面再讲。04/25/2020  12:21 PM           494,155 checkpoint_lenet-1_1875.ckpt04/25/2020  12:20 PM            15,033 checkpoint_lenet-graph.meta04/25/2020  02:36 PM             4,831 ms_output_0eval.pb04/25/2020  02:36 PM            15,878 ms_output_0train.pb避坑指南也许在上面你会遇到MNIST数据集下载的问题。以我自己为例,在电信的宽带下载MNIST几乎是龟速,实在没法忍,想起此前在其他Repo下载过这个数据集的几个gz文件。于是copy进lenet.py里定义的路径:train_path = "./MNIST_Data/train/"test_path = "./MNIST_Data/test/"需要注意的是需要分别copy train-*到./MNIST_Data/train, t10k-*到./MNIST_Data/test如果你之前没下载过,你可以直接在这里下载下面这个link的MNIST_DATA的压缩包,解压到lenet.py的同级目录即可:https://gitee.com/loveunk/mindspore/blob/master/example/_lenet_demo/MNIST_Data.zip————————————————原文链接:https://blog.csdn.net/weixin_54227557/article/details/121237191
  • [问题求助] 【Mindstudio】【模型转换】将tensorflow模型转化为om模型时报错
    先将darknet的yolov3模型转化为tensorflow格式,再使用模型转换功能时出错,报错截图如下json文件内容{"convertConfig":{"advancedArgs":"","aippBtnSelection":[],"aippData":[],"aippMode":"static","aippSelection":true,"autoTuneBtnSeleted":false,"autoTuneMode":"","batchList":[],"batchNum":"0","calData":[],"closeFusionRule":"false","customOpsPath":"","dynamicBatch":false,"dynamicBatchContent":"","dynamicImgSize":false,"dynamicImgSizeContent":"","encryptBtnSelection":true,"history":false,"historyItemName":"","inputFormat":"NHWC","inputFormatChooseEnable":true,"inputShape":[{"name":"input/input_data","number":"1","channel":"608","width":"608","height":"3","inputShape":"1,3,608,608","inputIndex":"0","inputType":"FP32","addByUser":false,"imagesFile":""}],"inputType":"FP32","inputTypeChanged":false,"markedNodes":[],"modelFilePath":"/home/hyx/convert/test/yolov3_coco.pb","modelName":"yolov3_NHWC","modelType":"TENSORFLOW","needAdvancedArgs":false,"outNodes":[],"outNodesItem":[],"outputFolderPath":"/home/hyx/modelzoo/yolov3_NHWC","outputSoc":"Ascend310","outputType":"FP32","outputTypeSwitch":false,"pluginPath":"","quantParamFilePath":"","targetType":"DEVICE","weightFilePath":""},"name":"yolov3_NHWC_config"}
  • [自动学习] 【OBS产品】【Moxing功能】ModuleNotFoundError: No module named 'moxing'
    【功能模块】moxing的导入问题【操作步骤&问题现象】1、import moxing as mox时报错2、网上的回答太笼统!!!【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 在树莓派运行SSD-Mobilenet-V2项目
    ## TensorFlow Lite目标检测模型训练与部署### 1\. 模型训练与部署方案介绍本指南提供了有关如何在 Raspberry Pi 上设置 TensorFlow Lite 并使用它来运行对象检测模型的分步说明。它适用于运行 Rasbpian Buster 或 Rasbpian Stretch 的 Raspberry Pi 3 和 Raspberry Pi 4。若你的树莓派还没有装好系统,可以参考[此文档](https://developer.huaweicloud.com/develop/aigallery/article/detail?id=878d75d5-2fe8-4728-b3a9-b5fe26e4b574)。本指南采用ssd_mobilenet_v2_quantized_300x300_coco模型和扑克9-A数据集训练,训练完成后得到的模型可以在树莓派上得到检测扑克9-A达到1.2帧。TensorFlow Lite (TFLite) 模型的运行速度比 Raspberry Pi 上的常规 TensorFlow 模型快得多。使用 SSDLite 模型,树莓派 3 表现相当不错,实现了高于 1FPS 的帧率。这对于大多数实时对象检测应用程序来说已经足够快了。您还可以通过将冻结的推理图添加到 object_detection 目录并更改脚本中的模型路径来使用您自己训练的模型。注意:如果您打算在 Pi 上长时间运行此程序(超过 5 分钟),请确保在 Pi 的主 CPU 上安装散热器!所有的处理都会导致 CPU 热运行。如果没有散热器,它会因高温而关闭。### 2\. 华为云ModelArts AI开发平台介绍ModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。“一站式”是指AI开发的各个环节,包括数据处理、算法开发、模型训练、模型部署都可以在ModelArts上完成。从技术上看,ModelArts底层支持各种异构计算资源,开发者可以根据需要灵活选择使用,而不需要关心底层的技术。同时,ModelArts支持Tensorflow、PyTorch、MXNet等主流开源的AI开发框架,也支持开发者使用自研的算法框架,匹配您的使用习惯。ModelArts的理念就是让AI开发变得更简单、更方便。面向不同经验的AI开发者,提供便捷易用的使用流程。例如,面向业务开发者,不需关注模型或编码,可使用自动学习流程快速构建AI应用;面向AI初学者,不需关注模型开发,使用预置算法构建AI应用;面向AI工程师,提供多种开发环境,多种操作流程和模式,方便开发者编码扩展,快速构建模型及应用。详情可参考[AI开发平台ModelArts](https://support.huaweicloud.com/modelarts/index.html)。### 3\. 使用ModelArts前的准备工作1. 注册账号 2. 实名认证 详情可参考[ModelArts准备工作](https://developer.huaweicloud.com/develop/aigallery/article/detail?id=e1a26d3d-b359-4552-a12c-71fdcd1466a7)。### 4\. 利用ModelArts云端算力训练模型创建CodeLab Notebook点击[此处](https://console.huaweicloud.com/modelarts/?region=cn-north-4#/dashboard)进入ModelArts界面选中CodeLab,CodeLab基础操作见[此处](https://developer.huaweicloud.com/develop/aigallery/article/detail?id=03676d0a-0630-4a3f-b62c-07fba43d2857)。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/02/153913wdjxejnw2ivflngb.png)### 1. 从OBS桶中下载代码和数据到ModelArts CodeLab ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/30/1536118bs0pk5dh0xlm3eo.png) 新建一个Conda-python3 Notebook,拷贝下面代码运行。 ``` import moxing as mox mox.file.copy_parallel('obs://obs-liufan/tensorflow1/', './tensorflow1/') ``` 运行成功如下图显示,此时样例的训练数据及代码都已在CodeLab内准备就绪。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/30/154212dpvuqhlc8rqvgbe8.png)2. 进入Terminal界面 因为该训练训练环境要求TensorFlow1.15版本,需要安装相应的环境。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/30/161348zsuhjccynjoaqsg4.png) 在Terminal界面创建环境,输入以下指令: ``` conda create -y -n tf1.15 tensorflow-gpu==1.15.0 cudatoolkit=10.0 ``` 开始安装环境。整个过程大约二十五分钟。 3. 通过发出以下命令激活“TensorFlow1.15”虚拟环境 ``` source activate tf1.15 ``` 4. 进入项目目录 ``` cd work/tensorflow1/models/research ``` 5. 处理数据格式 此处的数据也可替换成自己的训练数据 ``` protoc object_detection/protos/*.proto --python_out=. ``` 6. 安装项目所有需要用到的依赖库 ``` cp object_detection/packages/tf1/setup.py . python -m pip install --use-feature=2020-resolver . pip install numpy==1.19.5 ``` 7. 进入项目训练目录 ``` cd object_detection ``` 8. 运行代码开始训练模型 脚本设置为每十分钟生成一个ckeckpoint,一旦训练完成(即损失一直低于 2,大概五十分钟左右,若想提高精度可适量延长训练时间),按 Ctrl+C 停止训练。最新的checkpoint将保存在 /object\_detection/training/models 文件夹中,我们将使用该checkpoint导出冻结的 TensorFlow Lite 图。记下training文件夹(即model.ckpt-XXXX)中model.ckpt文件的checkpoint号,后面会用到。 ``` python train.py --logtostderr --train_dir=training/models --pipeline_config_path=training/ssd_mobilenet_v2_quantized_300x300_coco.config ``` 9. 导出 TensorFlow的冻结推理图 现在训练已经完成,可以使用 export\_tflite\_ssd\_graph.py 脚本导出模型以转换为 TensorFlow。 注意,命令中的 XXXX 应该替换为 /object\_detection/training 文件夹中编号最高的 model.ckpt 文件的编号。 ``` python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/ssd_mobilenet_v2_quantized_300x300_coco.config --trained_checkpoint_prefix training/models/model.ckpt-XXXX --output_directory inference_graph/ckpt ``` 1. 导出 TensorFlow Lite 的模型 注意,命令中的 XXXX 应该替换为 /object\_detection/training 文件夹中编号最高的 model.ckpt 文件的编号。 发出这个命令来导出 TensorFlow Lite 的模型: ``` python export_tflite_ssd_graph.py --pipeline_config_path training/ssd_mobilenet_v2_quantized_300x300_coco.config --trained_checkpoint_prefix training/models/model.ckpt-XXXX --output_directory TFLite_model add_postprocessing_op True ``` 命令执行后,/object_detection/TFLite_model/ckpt 文件夹中应该有两个新文件:tflite_graph.pb 和 tflite_graph.pbtxt。 至此,新的推理图已经过训练并导出。此推理图的架构和网络操作与 TensorFlow Lite 的框架兼容。但是,该图仍然需要转换为实际的 TensorFlow Lite 模型。我们将在下一步操作中执行此操作。 ### 5\. 模型转换优化1.TensorFlow Lite FlatBuffer 文件可以传送到客户端设备,通常是移动设备,由 TensorFlow Lite 解释器在设备上处理它们。该流程如下图所示。详情可参考[TensorFlow Lite 转换器工作流程](https://github.com/tensorflow/tensorflow/blob/Config/tensorflow/lite/toco/README.md) ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/15/152148ap0zsaqoyulvyfhu.png) ``` tflite_convert --output_file=TFLite_model/detect.tflite --graph_def_file=TFLite_model/tflite_graph.pb --input_arrays=normalized_input_image_tensor --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' --input_shape=1,300,300,3 --allow_custom_ops ``` 2.创建新标签图TensorFlow Lite 使用与经典 TensorFlow 不同的标签映射格式。经典的 TensorFlow 标签图格式如下所示(您可以在 /object_detection/data/mscoco_label_map.pbtxt 文件中看到一个示例):```item { name: "/m/01g317" id: 1 display_name: "person" } item { name: "/m/0199g" id: 2 display_name: "bicycle" } item { name: "/m/0k4j" id: 3 display_name: "car" } item { name: "/m/04_sv" id: 4 display_name: "motorcycle" } 等...```但是,[示例 TensorFlow Lite 对象检测模型](https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip)提供的标签图如下所示:```person bicycle car motorcycle 等...```TensorFlow Lite 格式不像经典的 TensorFlow 标签映射格式那样明确说明每个类的名称和 ID 号,而是只列出每个类。为了与 Google 提供的示例保持一致,本指南使用 TensorFlow Lite 标签映射格式。我们需要创建一个与 TensorFlow Lite 风格相匹配的新标签图。打开文本编辑器并按分类编号列出每个类。然后,将文件保存为 TFLite_model 文件夹中的“labelmap.txt”。例如,我的扑克牌检测器的 labelmap.txt 文件如下所示:![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202112/15/152237exjnj9q22woyk7r1.png)现在模型已经准备好了,我们将在下一步开始将模型部署在树莓派上。### 5\. 部署云端模型到树莓派在 Raspberry Pi 上设置 TensorFlow Lite 比常规 TensorFlow 容易许多,这些是设置 TensorFlow Lite 所需的步骤:- 1.更新树莓派- 2.下载此存储库并创建虚拟环境- 3.安装 TensorFlow 和 OpenCV- 4.设置 TensorFlow Lite 检测模型- 5.运行 TensorFlow Lite 模型#### 步骤1 更新树莓派首先,Raspberry Pi 需要完全更新。打开终端并发出:```sudo apt-get updatesudo apt-get dist-upgrade```根据您更新 Pi 的时间,更新可能需要一分钟到一小时之间的任何时间。#### 步骤2 下载此存储库并创建虚拟环境接下来,通过发出以下命令克隆此 GitHub 存储库。该存储库包含我们将用来运行 TensorFlow Lite 的脚本。```git clone https://github.com/EdjeElectronics/TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi.git```这会将所有内容下载到名为 TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi 的文件夹中。这有点长,所以将文件夹重命名为“tflite1”,然后 进入:```mv TensorFlow-Lite-Object-Detection-on-Android-and-Raspberry-Pi tflite1cd tflite1```我们将在此 /home/pi/tflite1 目录中处理本指南的其余部分。接下来是创建一个名为“tflite1-env”的虚拟环境。使用虚拟环境可以防止可能已安装在您的 Pi 上的软件包库版本之间发生任何冲突。将 TensorFlow 安装在自己的环境中可以让我们避免版本冲突。通过发出以下命令安装 virtualenv:```sudo pip3 install virtualenv```然后,通过发出以下命令创建“tflite1-env”虚拟环境:```python3 -m venv tflite1-env```这将在 tflite1 目录中创建一个名为 tflite1-env 的文件夹。tflite1-env 文件夹将保存此环境的所有包库。接下来,通过发出以下命令激活环境:```source tflite1-env/bin/activate````source tflite1-env/bin/activate`每次打开新的终端窗口时,您都需要从 /home/pi/tflite1 目录中发出命令以重新激活环境。#### 步骤3 安装 TensorFlow Lite 依赖项和 OpenCV接下来,我们将安装 TensorFlow、OpenCV 以及这两个包所需的所有依赖项。运行 TensorFlow Lite 不需要 OpenCV,但此存储库中的对象检测脚本使用它来抓取图像并在其上绘制检测结果。运行下面这个 shell 脚本,它会自动下载并安装所有的包和依赖项。通过发出以下命令来运行它:```bash get_pi_requirements.sh```这会下载大约 400MB 的安装文件,因此需要一段时间。在它工作的时候去喝杯咖啡吧!如果您想查看已安装的所有内容,只需打开 get\_pi\_dependencies.sh 即可查看软件包列表。**注意:如果您在运行`bash get_pi_requirements.sh`命令时遇到错误,可能是因为您的 Internet 连接超时,或者因为下载的包数据已损坏。如果出现错误,请尝试重新运行该命令几次。****另一个注意事项:shell 脚本会自动安装最新版本的 TensorFlow。如果您想安装特定版本,`pip3 install tensorflow==X.XX`请在运行脚本后发出(其中 X.XX 替换为您要安装的版本)。这将使用指定版本覆盖现有安装。**### 步骤4 设置 TensorFlow Lite 检测模型接下来,我们将设置将与 TensorFlow Lite 一起使用的检测模型。本指南展示了如何下载由 Google 提供的示例 TFLite 模型,或者如何使用您按照以上步骤自行训练的模型。检测模型有两个与之关联的文件:detect.tflite 文件(模型本身)和 labelmap.txt 文件(为模型提供标签图)。将detect.tflite 和labelmap.txt 都保存在文件夹中。这也是 Google 的可下载示例 TFLite 模型的组织方式。##### 选项 1. 使用 Google 的示例 TFLite 模型Google 提供了一个样本量化的 SSDLite-MobileNet-v2 对象检测模型,该模型在 MSCOCO 数据集上训练并转换为在 TensorFlow Lite 上运行。它可以检测和识别80种不同的常见物体,例如人、汽车、杯子等。通过发出以下命令下载示例模型(可以在[TensorFlow 官方网站的对象检测页面上找到](https://www.tensorflow.org/lite/models/object_detection/overview)):```wget https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip```通过发出(此命令自动创建文件夹)将其解压缩到名为“Sample\_TFLite\_model”的文件夹中:```unzip coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip -d Sample_TFLite_model```好的,示例模型已准备就绪!##### 选项 2:使用您自己的自定义训练模型您还可以通过将模型文件夹移动到 /home/pi/tflite 目录来使用自定义对象检测模型。如果您按照以上步骤在**ModelArts**训练和转换 TFLite 模型,您应该有一个名为“TFLite\_model”的文件夹,其中包含一个 detect.tflite 和 labelmap.txt 文件。(它还会有一个 tflite\_graph.pb 和 tflite\_graph.pbtxt 文件,TensorFlow Lite 不需要这些文件,但可以留在文件夹中。)您可以简单地将该文件夹通过浏览器中的**ModelArts**下载到树莓派,将然后将该文件夹移动到 /home/pi/tflite1 目录中。现在您的自定义模型已准备就绪!#### 步骤5 运行 TensorFlow Lite 模型!是时候看看 TFLite 对象检测模型的实际效果了!首先,通过关闭您不使用的任何应用程序来释放内存和处理能力。另外,请确保您已插入网络摄像头或 Picamera。通过从 /home/pi/tflite1 目录中发出以下命令来运行实时网络摄像头检测脚本。(在运行命令之前,通过检查 (tflite1-env) 出现在命令提示符前面来确保 tflite1-env 环境处于活动状态。)TFLite_detection_webcam.py 脚本将与 Picamera 或 USB 网络摄像头一起使用。```python3 TFLite_detection_webcam.py --modeldir=Sample_TFLite_model```如果您的模型文件夹的名称与“Sample_TFLite_model”不同,请改用该名称。初始化片刻后,将出现一个窗口,显示网络摄像头源。检测到的对象将实时显示边界框和标签。确保在运行脚本时使用python3而不是python。### 6\. 模型测试初始化片刻后,将出现一个窗口,显示网络摄像头源。检测到的对象将实时显示边界框和标签。在树莓派上部署的预测帧率大约为1.2,效果如下:
  • [问题求助] 【AMCT】根据样例量化tensorflow yolov3模型失败
    系统环境:虚拟机 ubuntu18.04cann:5.0.3 alpha3amct:amct_tensorflow-2.2.18-py3-none-linux_x86_64.whlpython:3.7.5protobuf:3.13.0numpy:1.21.2 模型:https://www.hiascend.com/zh/software/modelzoo/detail/C/210261e64adc42d2b3d84c447844e4c7 下的 YOLOv3_TensorFlow_1.5_model\single\pb\yolov3_tensorflow_1.5.pb模型执行样例:https://gitee.com/ascend/samples/blob/master/python/level1_single_api/9_amct/amct_tensorflow/yolo_v3运行命令:python3.7 ./src/yolo_v3_calibration.py结果:
  • [问题求助] 关于tensorflow训练为.pb文件的方法
    请问如何用tensorflow训练成hilens kit要求的.pb模型?可以提供一下hilens studio中模板里面的.pb文件原始的tensorflow训练代码吗?
  • [技术干货] TensorFlow--使用MindXDL提供的securityservice组件进行模型保护的AI框架示例
    参考代码链接https://gitee.com/shufanasia/examples
  • [应用开发] 【Atlas300产品】【OMG模型转换失败】借助tensorflow.sactter_nd实现one_hot模型转换失败
    【OMG模型转换失败】借助tensorflow.sactter_nd实现one_hot模型转换失败日志如下: FMK:2021-12-06-04:04:29.427.938 Parse:framework/domi/omg/../omg/parser/tensorflow/tensorflow_parser.cpp:839:"TF op node name = one_hot/indices." HIAIENGINE:2021-12-06-04:04:29.429.021 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/indices" HIAIENGINE:2021-12-06-04:04:29.429.045 SetWeights:cce/graph/./utils/op_desc_utils.cpp:431:"const op weight size 0 should be 1" FMK:2021-12-06-04:04:29.429.066 Parse:framework/domi/omg/../omg/parser/tensorflow/tensorflow_parser.cpp:839:"TF op node name = one_hot/depth." HIAIENGINE:2021-12-06-04:04:29.430.118 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/depth" HIAIENGINE:2021-12-06-04:04:29.430.141 SetWeights:cce/graph/./utils/op_desc_utils.cpp:431:"const op weight size 0 should be 1" FMK:2021-12-06-04:04:29.430.162 Parse:framework/domi/omg/../omg/parser/tensorflow/tensorflow_parser.cpp:839:"TF op node name = one_hot/on_value." HIAIENGINE:2021-12-06-04:04:29.431.339 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/on_value" HIAIENGINE:2021-12-06-04:04:29.431.373 SetWeights:cce/graph/./utils/op_desc_utils.cpp:431:"const op weight size 0 should be 1" FMK:2021-12-06-04:04:29.431.394 Parse:framework/domi/omg/../omg/parser/tensorflow/tensorflow_parser.cpp:839:"TF op node name = one_hot/off_value." HIAIENGINE:2021-12-06-04:04:29.432.503 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/off_value" HIAIENGINE:2021-12-06-04:04:29.432.524 SetWeights:cce/graph/./utils/op_desc_utils.cpp:431:"const op weight size 0 should be 1" FMK:2021-12-06-04:04:29.432.557 Parse:framework/domi/omg/../omg/parser/tensorflow/tensorflow_parser.cpp:839:"TF op node name = one_hot." HIAIENGINE:2021-12-06-04:04:29.433.855 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/indices" FMK:2021-12-06-04:04:29.433.927 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:218:"Convert NodeDef one_hot/indices to Weight." FMK:2021-12-06-04:04:29.434.003 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:263:"Convert NodeDef one_hot/indices to Weight Successfully." HIAIENGINE:2021-12-06-04:04:29.434.057 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/depth" FMK:2021-12-06-04:04:29.434.102 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:218:"Convert NodeDef one_hot/depth to Weight." FMK:2021-12-06-04:04:29.434.159 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:263:"Convert NodeDef one_hot/depth to Weight Successfully." HIAIENGINE:2021-12-06-04:04:29.434.206 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/on_value" FMK:2021-12-06-04:04:29.434.249 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:218:"Convert NodeDef one_hot/on_value to Weight." FMK:2021-12-06-04:04:29.434.305 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:263:"Convert NodeDef one_hot/on_value to Weight Successfully." HIAIENGINE:2021-12-06-04:04:29.434.351 MutableWeights:cce/graph/./utils/op_desc_utils.cpp:392:"const op has no weight, op name:one_hot/off_value" FMK:2021-12-06-04:04:29.434.393 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:218:"Convert NodeDef one_hot/off_value to Weight." FMK:2021-12-06-04:04:29.434.447 ConvertWeight:framework/domi/omg/../omg/parser/tensorflow/tensorflow_op_parser.cpp:263:"Convert NodeDef one_hot/off_value to Weight Successfully."[ERROR] FMK:2021-12-06-04:04:29.434.544 CustomParseWeights:framework/domi/omg/../omg/parser/tensorflow/tensorflow_one_hot_parser.cpp:141:"nomasuppression weight must be 0-D, 1."[ERROR] FMK:2021-12-06-04:04:29.434.571 AddNode:framework/domi/omg/../omg/parser/tensorflow/tensorflow_parser.cpp:240:"Parse Weights for node one_hot failed"[ERROR] FMK:2021-12-06-04:04:29.465.374 Generate:framework/domi/omg/omg.cpp:759:"OMG model parse ret fail. Error Code:0x3000001(Parameter's invalid!)"[ERROR] FMK:2021-12-06-04:04:29.502.576 main:framework/domi/omg_main/main.cpp:804:"OMG Generate execute failed!!"
  • [其他] 使用TensorFlow2对识别验证码
    验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水、发垃圾广告等等 。数据集来源:https://www.kaggle.com/fournierp/captcha-version-2-images图片是5个字母的单词,可以包含数字。这些图像应用了噪声(模糊和一条线)。它们是200 x 50 PNG。我们的任务是尝试制作光学字符识别算法的模型。在数据集中存在的验证码png图片,对应的标签就是图片的名字import osimport numpy as npimport pandas as pdimport cv2import matplotlib.pyplot as pltimport seaborn as sns# imgaug 图片数据增强import imgaug.augmenters as iaaimport tensorflow as tf# Conv2D MaxPooling2D Dropout Flatten Dense BN GAPfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Layer, BatchNormalization, GlobalAveragePooling2D from tensorflow.keras.optimizers import Adamfrom tensorflow.keras import Model, Input from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau# 图片处理器from tensorflow.keras.preprocessing.image import ImageDataGeneratorimport plotly.express as pximport plotly.graph_objects as goimport plotly.offline as pyopyo.init_notebook_mode()对数据进行一个简单的分析,统计图像中大约出现了什么样的符号。# 数据路径DIR = '../input/captcha-version-2-images/samples/samples'# 存储验证码的标签captcha_list = []characters = {}for captcha in os.listdir(DIR): captcha_list.append(captcha) # 每张验证码的captcha_code captcha_code = captcha.split(".")[0] for i in captcha_code: # 遍历captcha_code characters = characters.get(i, 0) +1symbols = list(characters.keys())len_symbols = len(symbols)print(f'图像中只使用了{len_symbols}符号')plt.bar(*zip(*characters.items()))plt.title('Frequency of symbols')plt.show()如何提取图像的数据建立X,y??# 如何提取图像 建立 model X 的shape 1070 * 50 * 200 * 1 # y的shape 5 * 1070 * 19 for i, captcha in enumerate(captcha_list): captcha_code = captcha.split('.')[0] # cv2.IMREAD_GRAYSCALE 灰度图 captcha_cv2 = cv2.imread(os.path.join(DIR, captcha),cv2.IMREAD_GRAYSCALE) # 缩放 captcha_cv2 = captcha_cv2 / 255.0 # print(captcha_cv2.shape) (50, 200) # 将captcha_cv2的(50, 200) 切换成(50, 200, 1) captcha_cv2 = np.reshape(captcha_cv2, img_shape) # (5,19) targs = np.zeros((len_captcha, len_symbols)) for a, b in enumerate(captcha_code): targs[a, symbols.index(b)] = 1 X = captcha_cv2 y[:, i] = targsprint("shape of X:", X.shape)print("shape of y:", y.shape)输出如下print("shape of X:", X.shape)print("shape of y:", y.shape)通过Numpy中random 随机选择数据,划分训练集和测试集# 生成随机数from numpy.random import default_rngrng = default_rng(seed=1)test_numbers = rng.choice(1070, size=int(1070*0.3), replace=False)X_test = X[test_numbers]X_full = np.delete(X, test_numbers,0)y_test = y[:,test_numbers]y_full = np.delete(y, test_numbers,1)val_numbers = rng.choice(int(1070*0.7), size=int(1070*0.3), replace=False)X_val = X_full[val_numbers]X_train = np.delete(X_full, val_numbers,0)y_val = y_full[:,val_numbers]y_train = np.delete(y_full, val_numbers,1)在此验证码数据中,容易出现过拟合的现象,你可能会想到添加更多的新数据、 添加正则项等, 但这里使用数据增强的方法,特别是对于机器视觉的任务,数据增强技术尤为重要。常用的数据增强操作:imgaug库。imgaug是提供了各种图像增强操作的python库 https://github.com/aleju/imgaug。imgaug几乎包含了所有主流的数据增强的图像处理操作, 增强方法详见github# Sequential(C, R) 尺寸增加了5倍,# 选取一系列子增强器C作用于每张图片的位置,第二个参数表示是否对每个batch的图片应用不同顺序的Augmenter list # rotate=(-8, 8) 旋转# iaa.CropAndPad 截取(crop)或者填充(pad),填充时,被填充区域为黑色。# px: 想要crop(negative values)的或者pad(positive values)的像素点。# (top, right, bottom, left)# 当pad_mode=constant的时候选择填充的值aug =iaa.Sequential([iaa.CropAndPad( px=((0, 10), (0, 35), (0, 10), (0, 35)), pad_mode=['edge'], pad_cval=1),iaa.Rotate(rotate=(-8,8))])X_aug_train = Noney_aug_train = y_trainfor i in range(40): X_aug = aug(images = X_train) if X_aug_train is not None: X_aug_train = np.concatenate([X_aug_train, X_aug], axis = 0) y_aug_train = np.concatenate([y_aug_train, y_train], axis = 1) else: X_aug_train = X_aug让我们看看一些数据增强的训练图像。fig, ax = plt.subplots(nrows=2, ncols =5, figsize = (16,16))for i in range(10): index = np.random.randint(X_aug_train.shape[0]) ax.imshow(X_aug_train,cmap='gray')这次使用函数式API创建模型,函数式API是创建模型的另一种方式,它具有更多的灵活性,包括创建更为复杂的模型。需要定义inputs和outputs#函数式API模型创建captcha = Input(shape=(50,200,channels))x = Conv2D(32, (5,5),padding='valid',activation='relu')(captcha)x = MaxPooling2D((2,2),padding='same')(x)x = Conv2D(64, (3,3),padding='same',activation='relu')(x)x = MaxPooling2D((2,2),padding='same')(x)x = Conv2D(128, (3,3),padding='same',activation='relu')(x)maxpool = MaxPooling2D((2,2),padding='same')(x)outputs = []for i in range(5): x = Conv2D(256, (3,3),padding='same',activation='relu')(maxpool) x = MaxPooling2D((2,2),padding='same')(x) x = Flatten()(x) x = Dropout(0.5)(x) x = BatchNormalization()(x) x = Dense(64, activation='relu')(x) x = Dropout(0.5)(x) x = BatchNormalization()(x) x = Dense(len_symbols , activation='softmax' , name=f'char_{i+1}')(x) outputs.append(x) model = Model(inputs = captcha , outputs=outputs)# ReduceLROnPlateau更新学习率reduce_lr = ReduceLROnPlateau(patience =3, factor = 0.5,verbose = 1)model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.0005), metrics=["accuracy"])# EarlyStopping用于提前停止训练的callbacks。具体地,可以达到当训练集上的loss不在减小earlystopping = EarlyStopping(monitor ="val_loss", mode ="min", patience = 10, min_delta = 1e-4, restore_best_weights = True) history = model.fit(X_train, [y_train for i in range(5)], batch_size=32, epochs=30, verbose=1, validation_data = (X_val, [y_val for i in range(5)]), callbacks =[earlystopping,reduce_lr])下面对model进行一个测试和评估。score = model.evaluate(X_test,[y_test[0], y_test[1], y_test[2], y_test[3], y_test[4]],verbose=1)metrics = ['loss','char_1_loss', 'char_2_loss', 'char_3_loss', 'char_4_loss', 'char_5_loss', 'char_1_acc', 'char_2_acc', 'char_3_acc', 'char_4_acc', 'char_5_acc']for i,j in zip(metrics, score): print(f'{i}: {j}')具体输出如下:11/11 [==============================] - 0s 11ms/step - loss: 0.7246 - char_1_loss: 0.0682 - char_2_loss: 0.1066 - char_3_loss: 0.2730 - char_4_loss: 0.2636 - char_5_loss: 0.0132 - char_1_accuracy: 0.9844 - char_2_accuracy: 0.9657 - char_3_accuracy: 0.9408 - char_4_accuracy: 0.9626 - char_5_accuracy: 0.9938loss: 0.7246273756027222char_1_loss: 0.06818050146102905char_2_loss: 0.10664034634828568char_3_loss: 0.27299806475639343char_4_loss: 0.26359987258911133char_5_loss: 0.013208594173192978char_1_acc: 0.9844236969947815char_2_acc: 0.9657320976257324char_3_acc: 0.940809965133667char_4_acc: 0.9626168012619019char_5_acc: 0.9937694668769836字母1到字母5的精确值都大于绘制loss和scoremetrics_df = pd.DataFrame(history.history)columns = [col for col in metrics_df.columns if 'loss' in col and len(col)>8]fig = px.line(metrics_df, y = columns)fig.show()plt.figure(figsize=(15,8))plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('model loss')plt.ylabel('loss')plt.xlabel('epoch')plt.legend(['train', 'val'], loc='upper right',prop={'size': 10})plt.show()# 预测数据def predict(captcha): captcha = np.reshape(captcha , (1, 50,200,channels)) result = model.predict(captcha) result = np.reshape(result ,(5,len_symbols)) # 取出最大预测中的输出 label = ''.join([symbols[np.argmax(i)] for i in result]) return label predict(X_test[2])# 25277下面预测所有的数据actual_pred = []for i in range(X_test.shape[0]): actual = ''.join([symbols for i in (np.argmax(y_test[:, i],axis=1))]) pred = predict(X_test) actual_pred.append((actual, pred))print(actal_pred[:10])输出如下[('n4b4m', 'n4b4m'), ('42nxy', '42nxy'), ('25257', '25277'), ('cewnm', 'cewnm'), ('w46ep', 'w46ep'), ('cdcb3', 'edcb3'), ('8gf7n', '8gf7n'), ('nny5e', 'nny5e'), ('gm2c2', 'gm2c2'), ('g7fmc', 'g7fmc')]sameCount = 0diffCount = 0letterDiff = {i:0 for i in range(5)}incorrectness = {i:0 for i in range(1,6)}for real, pred in actual_pred: # 预测和输出相同 if real == pred: sameCount += 1 else: # 失败 diffCount += 1 # 遍历 incorrectnessPoint = 0 for i in range(5): if real != pred: letterDiff += 1 incorrectnessPoint += 1 incorrectness += 1x = ['True predicted', 'False predicted']y = [sameCount, diffCount]fig = go.Figure(data=[go.Bar(x = x, y = y)])fig.show()在预测数据中,一共有287个数据预测正确。在这里,我们可以看到出现错误到底是哪一个index。x1 = ["Character " + str(x) for x in range(1, 6)] fig = go.Figure(data=[go.Bar(x = x1, y = list(letterDiff.values()))])fig.show()为了计算每个单词的错误数,绘制相关的条形图。x2 = [str(x) + " incorrect" for x in incorrectness.keys()]y2 = list(incorrectness.values())fig = go.Figure(data=[go.Bar(x = x2, y = y2)])fig.show()下面绘制错误的验证码图像,并标准正确和错误的区别。fig, ax = plt.subplots(nrows = 8, ncols=4,figsize = (16,20))count = 0for i, (actual , pred) in enumerate(actual_pred): if actual != pred: img = X_test try: ax[count//4][count%4].imshow(img, cmap = 'gray') ax[count//4][count%4].title.set_text(pred + ' - ' + actual) count += 1 except: pass
  • [其他] Tensorflow多节点作业下载数据到/cache显示No space left解决办法
    问题现象创建训练作业,Tensorflow多节点作业下载数据到/cache显示:“No space left”。原因分析TensorFlow多节点任务会启动parameter server(简称ps)和worker两种角色,ps和worker会被调度到相同的机器上。由于训练数据对于ps没有用,因此在代码中ps相关的逻辑不需要下载训练数据。​如果ps也下载数据到“/cache”实际下载的数据会翻倍。​例如只下载了2.5TB的数据,程序就显示空间不够而失败,因为/cache只有4TB的可用空间。处理方法在使用Tensorflow多节点作业下载数据时,正确的下载逻辑如下:import argparseparser = argparse.ArgumentParser()parser.add_argument("--job_name", type=str, default="")args = parser.parse_known_args()if args[0].job_name != "ps": copy..............................
  • [其他] 使用TensorFlow2对阿拉伯语手写字符数据集进行识别
    使用 TensorFlow (Keras API) 实现一个用于多分类任务的深度学习模型,该任务需要对阿拉伯语手写字符数据集进行识别。数据集下载地址:https://www.kaggle.com/mloey1/ahcd1数据集介绍该数据集由 60 名参与者书写的16,800 个字符组成,年龄范围在 19 至 40 岁之间,90% 的参与者是右手。每个参与者在两种形式上写下每个字符(从“alef”到“yeh”)十次,如图 7(a)和 7(b)所示。表格以 300 dpi 的分辨率扫描。使用 Matlab 2016a 自动分割每个块以确定每个块的坐标。该数据库分为两组:训练集(每类 13,440 个字符到 480 个图像)和测试集(每类 3,360 个字符到 120 个图像)。数据标签为1到28个类别。在这里,所有数据集都是CSV文件,表示图像像素值及其相应标签,并没有提供对应的图片数据。导入模块import numpy as npimport pandas as pd#允许对dataframe使用display()from IPython.display import display# 导入读取和处理图像所需的库import csvfrom PIL import Imagefrom scipy.ndimage import rotate读取数据# 训练数据imagesletters_training_images_file_path = "../input/ahcd1/csvTrainImages 13440x1024.csv"# 训练数据labelsletters_training_labels_file_path = "../input/ahcd1/csvTrainLabel 13440x1.csv"# 测试数据images和labelsletters_testing_images_file_path = "../input/ahcd1/csvTestImages 3360x1024.csv"letters_testing_labels_file_path = "../input/ahcd1/csvTestLabel 3360x1.csv"# 加载数据training_letters_images = pd.read_csv(letters_training_images_file_path, header=None)training_letters_labels = pd.read_csv(letters_training_labels_file_path, header=None)testing_letters_images = pd.read_csv(letters_testing_images_file_path, header=None)testing_letters_labels = pd.read_csv(letters_testing_labels_file_path, header=None)print("%d个32x32像素的训练阿拉伯字母图像。" %training_letters_images.shape[0])print("%d个32x32像素的测试阿拉伯字母图像。" %testing_letters_images.shape[0])training_letters_images.head()13440个32x32像素的训练阿拉伯字母图像。3360个32x32像素的测试阿拉伯字母图像。查看训练数据的headnp.unique(training_letters_labels)array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], dtype=int32)下面需要将csv值转换为图像,我们希望展示对应图像的像素值图像。def convert_values_to_image(image_values, display=False): image_array = np.asarray(image_values) image_array = image_array.reshape(32,32).astype('uint8') # 原始数据集被反射,因此我们将使用np.flip翻转它,然后通过rotate旋转,以获得更好的图像。 image_array = np.flip(image_array, 0) image_array = rotate(image_array, -90) new_image = Image.fromarray(image_array) if display == True: new_image.show() return new_imageconvert_values_to_image(training_letters_images.loc[0], True)这是一个字母f。下面,我们将进行数据预处理,主要进行图像标准化,我们通过将图像中的每个像素除以255来重新缩放图像,标准化到[0,1]training_letters_images_scaled = training_letters_images.values.astype('float32')/255training_letters_labels = training_letters_labels.values.astype('int32')testing_letters_images_scaled = testing_letters_images.values.astype('float32')/255testing_letters_labels = testing_letters_labels.values.astype('int32')print("Training images of letters after scaling")print(training_letters_images_scaled.shape)training_letters_images_scaled[0:5]输出如下Training images of letters after scaling(13440, 1024)从标签csv文件我们可以看到,这是一个多类分类问题。下一步需要进行分类标签编码,建议将类别向量转换为矩阵类型。输出形式如下:将1到28,变成0到27类别。从“alef”到“yeh”的字母有0到27的分类号。to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示在这里,我们将使用keras的一个热编码对这些类别值进行编码。一个热编码将整数转换为二进制矩阵,其中数组仅包含一个“1”,其余元素为“0”。from keras.utils import to_categorical# one hot encodingnumber_of_classes = 28training_letters_labels_encoded = to_categorical(training_letters_labels-1, num_classes=number_of_classes)testing_letters_labels_encoded = to_categorical(testing_letters_labels-1, num_classes=number_of_classes)下面将输入图像重塑为32x32x1,因为当使用TensorFlow作为后端时,Keras CNN需要一个4D数组作为输入,并带有形状(nb_samples、行、列、通道)其中 nb_samples对应于图像(或样本)的总数,而行、列和通道分别对应于每个图像的行、列和通道的数量。# reshape input letter images to 32x32x1training_letters_images_scaled = training_letters_images_scaled.reshape([-1, 32, 32, 1])testing_letters_images_scaled = testing_letters_images_scaled.reshape([-1, 32, 32, 1])print(training_letters_images_scaled.shape, training_letters_labels_encoded.shape, testing_letters_images_scaled.shape, testing_letters_labels_encoded.shape)# (13440, 32, 32, 1) (13440, 28) (3360, 32, 32, 1) (3360, 28)因此,我们将把输入图像重塑成4D张量形状(nb_samples,32,32,1),因为我们图像是32x32像素的灰度图像。#将输入字母图像重塑为32x32x1training_letters_images_scaled = training_letters_images_scaled.reshape([-1, 32, 32, 1])testing_letters_images_scaled = testing_letters_images_scaled.reshape([-1, 32, 32, 1])print(training_letters_images_scaled.shape, training_letters_labels_encoded.shape, testing_letters_images_scaled.shape, testing_letters_labels_encoded.shape)设计模型结构from keras.models import Sequentialfrom keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, BatchNormalization, Dropout, Densedef create_model(optimizer='adam', kernel_initializer='he_normal', activation='relu'): # create model model = Sequential() model.add(Conv2D(filters=16, kernel_size=3, padding='same', input_shape=(32, 32, 1), kernel_initializer=kernel_initializer, activation=activation)) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.2)) model.add(Conv2D(filters=32, kernel_size=3, padding='same', kernel_initializer=kernel_initializer, activation=activation)) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.2)) model.add(Conv2D(filters=64, kernel_size=3, padding='same', kernel_initializer=kernel_initializer, activation=activation)) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.2)) model.add(Conv2D(filters=128, kernel_size=3, padding='same', kernel_initializer=kernel_initializer, activation=activation)) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.2)) model.add(GlobalAveragePooling2D()) #Fully connected final layer model.add(Dense(28, activation='softmax')) # Compile model model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer=optimizer) return model「模型结构」第一隐藏层是卷积层。该层有16个特征图,大小为3×3和一个激活函数,它是relu。这是输入层,需要具有上述结构的图像。第二层是批量标准化层,它解决了特征分布在训练和测试数据中的变化,BN层添加在激活函数前,对输入激活函数的输入进行归一化。这样解决了输入数据发生偏移和增大的影响。第三层是MaxPooling层。最大池层用于对输入进行下采样,使模型能够对特征进行假设,从而减少过拟合。它还减少了参数的学习次数,减少了训练时间。下一层是使用dropout的正则化层。它被配置为随机排除层中20%的神经元,以减少过度拟合。另一个隐藏层包含32个要素,大小为3×3和relu激活功能,从图像中捕捉更多特征。其他隐藏层包含64和128个要素,大小为3×3和一个relu激活功能,重复三次卷积层、MaxPooling、批处理规范化、正则化和* GlobalAveragePooling2D层。最后一层是具有(输出类数)的输出层,它使用softmax激活函数,因为我们有多个类。每个神经元将给出该类的概率。使用分类交叉熵作为损失函数,因为它是一个多类分类问题。使用精确度作为衡量标准来提高神经网络的性能。model = create_model(optimizer='Adam', kernel_initializer='uniform', activation='relu')model.summary()「Keras支持在Keras.utils.vis_utils模块中绘制模型,该模块提供了使用graphviz绘制Keras模型的实用函数」import pydotfrom keras.utils import plot_modelplot_model(model, to_file="model.png", show_shapes=True)from IPython.display import Image as IPythonImagedisplay(IPythonImage('model.png'))训练模型,使用batch_size=20来训练模型,对模型进行15个epochs阶段的训练。训练结果如下所示:最后Epochs绘制损耗和精度曲线。import matplotlib.pyplot as pltdef plot_loss_accuracy(history): # Loss plt.figure(figsize=[8,6]) plt.plot(history.history['loss'],'r',linewidth=3.0) plt.plot(history.history['val_loss'],'b',linewidth=3.0) plt.legend(['Training loss', 'Validation Loss'],fontsize=18) plt.xlabel('Epochs ',fontsize=16) plt.ylabel('Loss',fontsize=16) plt.title('Loss Curves',fontsize=16) # Accuracy plt.figure(figsize=[8,6]) plt.plot(history.history['accuracy'],'r',linewidth=3.0) plt.plot(history.history['val_accuracy'],'b',linewidth=3.0) plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18) plt.xlabel('Epochs ',fontsize=16) plt.ylabel('Accuracy',fontsize=16) plt.title('Accuracy Curves',fontsize=16) plot_loss_accuracy(history)「加载具有最佳验证损失的模型」# 加载具有最佳验证损失的模型model.load_weights('weights.hdf5')metrics = model.evaluate(testing_letters_images_scaled, testing_letters_labels_encoded, verbose=1)print("Test Accuracy: {}".format(metrics[1]))print("Test Loss: {}".format(metrics[0]))输出如下:3360/3360 [==============================] - 0s 87us/stepTest Accuracy: 0.9678571224212646Test Loss: 0.11759862171020359打印混淆矩阵。from sklearn.metrics import classification_reportdef get_predicted_classes(model, data, labels=None): image_predictions = model.predict(data) predicted_classes = np.argmax(image_predictions, axis=1) true_classes = np.argmax(labels, axis=1) return predicted_classes, true_classes, image_predictionsdef get_classification_report(y_true, y_pred): print(classification_report(y_true, y_pred))y_pred, y_true, image_predictions = get_predicted_classes(model, testing_letters_images_scaled, testing_letters_labels_encoded)get_classification_report(y_true, y_pred)输出如下: precision recall f1-score support 0 1.00 0.98 0.99 120 1 1.00 0.98 0.99 120 2 0.80 0.98 0.88 120 3 0.98 0.88 0.93 120 4 0.99 0.97 0.98 120 5 0.92 0.99 0.96 120 6 0.94 0.97 0.95 120 7 0.94 0.95 0.95 120 8 0.96 0.88 0.92 120 9 0.90 1.00 0.94 120 10 0.94 0.90 0.92 120 11 0.98 1.00 0.99 120 12 0.99 0.98 0.99 120 13 0.96 0.97 0.97 120 14 1.00 0.93 0.97 120 15 0.94 0.99 0.97 120 16 1.00 0.93 0.96 120 17 0.97 0.97 0.97 120 18 1.00 0.93 0.96 120 19 0.92 0.95 0.93 120 20 0.97 0.93 0.94 120 21 0.99 0.96 0.97 120 22 0.99 0.98 0.99 120 23 0.98 0.99 0.99 120 24 0.95 0.88 0.91 120 25 0.94 0.98 0.96 120 26 0.95 0.97 0.96 120 27 0.98 0.99 0.99 120 accuracy 0.96 3360 macro avg 0.96 0.96 0.96 3360weighted avg 0.96 0.96 0.96 3360最后绘制随机几个相关预测的图片indices = np.random.randint(0, testing_letters_labels.shape[0], size=49)y_pred = np.argmax(model.predict(training_letters_images_scaled), axis=1)for i, idx in enumerate(indices): plt.subplot(7,7,i+1) image_array = training_letters_images_scaled[:,:,0] image_array = np.flip(image_array, 0) image_array = rotate(image_array, -90) plt.imshow(image_array, cmap='gray') plt.title("Pred: {} - Label: {}".format(y_pred, (training_letters_labels -1))) plt.xticks([]) plt.yticks([])plt.show()
  • [其他] 使用TensorFlow2判断细胞图像是否感染
    使用 TensorFlow (Keras API) 实现一个用于二进制分类任务的深度学习模型,该任务包括将细胞的图像标记为感染或未感染疟疾。数据集来源:https://www.kaggle.com/iarunava/cell-images-for-detecting-malaria数据集包含2个文件夹感染::13780张图片未感染:13780张图片总共27558张图片。此数据集取自NIH官方网站:https://ceb.nlm.nih.gov/repositories/malaria-datasets/环境:kaggle,天池实验室或者gogole colab都可以。导入相关模块import cv2import tensorflow as tffrom tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten, Activationfrom sklearn.model_selection import train_test_splitimport numpy as npimport matplotlib.pyplot as pltimport globimport os对于图片数据存在形状不一样的情况,因此需要使用 OpenCV 进行图像预处理。将图片变成 numpy 数组(数字格式)的形式转换为灰度,并将其调整为一个(70x70)形状。img_dir="../input/cell-images-for-detecting-malaria/cell_images" img_size=70def load_img_data(path): # 打乱数据 image_files = glob.glob(os.path.join(path, "Parasitized/*.png")) + \ glob.glob(os.path.join(path, "Uninfected/*.png")) X, y = [], [] for image_file in image_files: # 命名标签 0 for uninfected and 1 for infected label = 0 if "Uninfected" in image_file else 1 # load the image in gray scale 变成灰度图片 img_arr = cv2.imread(image_file, cv2.IMREAD_GRAYSCALE) # resize the image to (70x70) 调整图片大小 img_resized = cv2.resize(img_arr, (img_size, img_size)) X.append(img_resized) y.append(label) return X, yX, y = load_img_data(img_dir)查看X的shape。print(X.shape)X的shape为(27558, 70, 70, 1),27558表示图片的数据,70*70表示图片的长和宽像素。另外,为了帮助网络更快收敛,我们应该进行数据归一化。在sklearn 中有一些缩放方法,例如:在这里我们将除以255,因为像素可以达到的最大值是255,这将导致应用缩放后像素范围在 0 和 1 之间。X, y = load_img_data(img_dir)# reshape to (n_samples, 70, 70, 1) (to fit the NN)X = np.array(X).reshape(-1, img_size, img_size, 1)#从[0,255]到[0,1]缩放像素 帮助神经网络更快地训练X = X / 255# shuffle & split the datasetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, stratify=y)print("Total training samples:", X_train.shape)print("Total validation samples:", X_test.shape[0])使用sklearn的train_test_split()方法将数据集划分为训练集和测试集,我们使用总数据的 10% 稍后对其进行验证。在建立的模型中,我们将添加 3 个卷积层,然后Flatten是由层组成的全连接Dense层。model = Sequential()model.add(Conv2D(64, (3, 3), input_shape=X_train.shape[1:]))model.add(Activation("relu"))model.add(MaxPool2D(pool_size=(2, 2)))model.add(Conv2D(64, (3, 3)))model.add(Activation("relu"))model.add(MaxPool2D(pool_size=(2, 2)))model.add(Conv2D(64, (3, 3)))model.add(Activation("relu"))model.add(MaxPool2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(64))model.add(Activation("relu"))model.add(Dense(64))model.add(Activation("relu"))model.add(Dense(1))model.add(Activation("sigmoid"))model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])print(model.summary())由于输出是二进制的(感染或未感染),我们使用Sigmoid 函数作为输出层的激活函数。# train the model with 10 epochs, 64 batch sizemodel.fit(X_train, np.array(y_train), batch_size=64, epochs=10, validation_split=0.2)在训练数据集及其验证拆分上实现了94%的准确率。现在使用evaluate()  来评估测试数据集上的模型loss, accuracy = model.evaluate(X_test, np.array(y_test), verbose=0)print(f"Testing on {len(X_test)} images, the results are\n Accuracy: {accuracy} | Loss: {loss}")输出如下Testing on 2756 images, the results areAccuracy: 0.9404934644699097 | Loss: 0.1666732281446457该模型在测试数据中也表现OK,准确率达到94%最后,我们将通过保存我们的模型来结束所有这个过程。model.save("model.h5")
  • [其他] 深度学习框架TensorFlow
        TensorFlow是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief   。Tensorflow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究  。TensorFlow由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护,拥有包括TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud在内的多个项目以及各类应用程序接口(Application Programming Interface, API)  。自2015年11月9日起,TensorFlow依据阿帕奇授权协议(Apache 2.0 open source license)开放源代码   。    语言与系统支持TensorFlow支持多种客户端语言下的安装和运行。截至版本1.12.0,绑定完成并支持版本兼容运行的语言为C和Python,其它(试验性)绑定完成的语言为JavaScript、C++、Java、Go和Swift,依然处于开发阶段的包括C#、Haskell、Julia、Ruby、Rust和Scala
  • [其他问题] tensorflow模型迁移到ascend训练出错
    【功能模块】小白求大佬帮帮忙【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] MindSpore之张量(Tensor)分析
    对于初学深度学习的人(就比如我)一定会对张量(Tensor)感到疑惑,因为自己经常见到它但就是不知道它的具体含义。在这篇文章我们就来看一下MindSpore中的Tensor,在此之前我们先来了解一下张量是什么。从神经网络来看,神经网络中的输入、输出和变换都是用张量表示的(张量是神经网络使用的主要数据结构)。从数学具体实例来看,张量可以是一个多维数组,就像这样:标量是0维张量向量是一维张量(一维数组)矩阵是二维张量 (二维数组)n维数组是n维张量Tensor也可以被看成一种数据结构,该结构简洁而强大,非常适合进行矩阵类的数值计算。在MindSpore中Tensor是其网络运算中的基本数据结构,通常不同维度的张量表示不同的数据,前面已经说了标量是0维张量,矩阵是二维张量,而三维张量可以表示彩色图像的RGB三通道。而处理三维张量的图片数字集(MNIST),用来训练手写数字识别的模型可以说是深度学习里面的Hello world。接下来我们就来看正文吧。Tensor的构造首先导入需要的相应的模块和对外接口api:import numpy as np #导入科学计算模块numpyfrom mindspore import Tensor, context #导入Tensor模块与配置环境的context模块from mindspore import dtype as mstype #导入dtype模块,该模块包含了相应的数据转化context.set_context(mode=context.GRAPH_MODE, device_target="CPU")#mode为样例运行使用的模式,这里选用的是图模式,device_target为选择实际的配置硬件信息,可以选择CPU,GPU,也可以选择华为自研的Ascend AI处理器上(Ascend)构造的基本形式是:tensor=Tensor(data,dtype)参数data是指传入要将它构造成张量的数据类型,可以传入Tensor,int,float,bool,Numpy.array等,dtype是指构造的张量的数据类型,初始化时可以指定dtype也可以不指定dtype,在不指定的情况下,初始值的数据类型将默认转化为mindspore.dtype中的相关类型,即初始值int,float,bool分别生成mindspore.int32,mindspore.float64,mindspore.bool_的0维Tensor,其它的初始值也有类似的转化方法,具体有关mindspore.dtype的详情可看阳斯杰同学对于dtype的解读,下面我们通过有关代码看一下具体的构造:x = Tensor(np.array([[1, 2], [3, 4]]), mstype.int32)y = Tensor(1.0, mstype.int32)z = Tensor(2, mstype.int32)m = Tensor(True, mstype.bool_)n = Tensor((1, 2, 3), mstype.int16)p = Tensor([4.0, 5.0, 6.0], mstype.float64)q = Tensor(p, mstype.float64)print(x, "\n\n", y, "\n\n", z, "\n\n", m, "\n\n", n, "\n\n", p, "\n\n", q)可以看到在上面的构造中,我们都指定了dtype的具体类型,因为这样可以加强我们对数据类型的概念,在熟练掌握之后我们就可以使用默认的。其中张量y是将1.0(float)转化为int32(1),张量q中传入的初始值p是也是一个张量,然后再给这个张量指定数据类型为float64。Tensor的运算Tensor的运算包括算数运算(即加,减,乘等等)与逻辑运算(>,<,>=,<=等等),我们在神经网络的构建计算过程中往往会牵扯到高阶矩阵即多维张量,在这个过程中我们用到的多的运算基本上是加,减,乘,幂次等,除法,取余等比较少用。由于加法,减法和正常的加减区别不大,就是对应元素的相加减,所以这里我们只展示一下张量的乘法:代码:x=Tensor(np.array([[1,2],[3,4]]),mstype.int32)y=Tensor(np.array([[5,6],[7,8]]),mstype.int32)output_mul=x*yprint(output_mul)运行结果:[[ 5 12] [21 32]]其实这里就是两个2x2矩阵的相乘,但我们需要注意的是在神经网络的运算中往往会有很多层矩阵的嵌套乘法,在这个过程中我们就需要注意到两个相乘张量之间的维度关系,(axb和bxc的张量才能相乘),带入上面样例中的话a=b=c=2。所以为了所写程序的正确性,我们来看一下张量的属性。Tensor的属性在上文中其实我已经讲到了张量的两个属性:形状(shape)(x.shape,返回一个元组tuple),数据类型(dtype)(x.dtype)。张量也还有一些其它的比较重要的属性,如:转置张量:Tensor的转置,也是一个Tensor。 (x.T)单个元素大小: Tensor中每一个元素占用字节数,是一个整数。 (x.itemsize)占用字节数量: Tensor占用的总字节数,是一个整数。 (x.nbytes)维数: Tensor的秩,也就是len(tensor.shape),是一个整数。 (x.ndim)元素个数: Tensor中所有元素的个数,是一个整数。 (x.size)每一维步长: Tensor中每一维中进行遍历所需要经过的字节数。 (x.strides)大家可以自己定义一个张量,然后去打印出它的各个属性,以便自己更加深刻直观的理解。 本篇文章到这里就差不多结束了,但MindSpore中张量的知识还有很多,远不止于此,大家可前往官方http://mindspore.cn观看相关文档,我也在上面借鉴了很多内容。上面还有一些张量的方法,以及一些特殊张量的表示等。 由于本人知识有限,若有错误,还请多多包涵与指教!原文链接:https://forum.trustie.net/forums/3460/detail
总条数:358 到第
上滑加载中