博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ANNdotNET GUI工具创建CIFAR-10深度学习模型
阅读量:3524 次
发布时间:2019-05-20

本文共 5047 字,大约阅读时间需要 16 分钟。

目录


在这篇文章中,我们将为CIFAR-10数据集创建和训练深度学习模型,并了解如何使用ANNdotNET v1.2轻松实现这一点。

编辑说明

通过,用户可以创建和训练用于图像分类的深度学习模型。图像分类模块提供最少的GUI操作,以便完全准备数据集。在这篇文章中,我们将为CIFAR-10数据集创建和训练深度学习模型,并了解如何使用ANNdotNET v1.2轻松实现这一点。

为了准备数据,我们必须从官方下载CIFAR-10数据集。CIFAR-10数据集由6个二进制批处理文件提供,可以在本地计算机上提取并保留。名称中的数字10表示为10个标签创建数据集。下图显示了10CIFAR-10数据集标签,每个标签包含少量样本图像。

https://www.codeproject.com/KB/AI/1273368/2018-12-10_11-56-56.png

CIFAR-10数据集(Alex Krizhevsky2009年。)

该数据集包含60 00050 000用于培训和验证,10 000用于测试)微小彩色图像尺寸为32×32。还有更大版本的数据集CIFAR-100100个标签。我们的任务是创建深度学习模型,能够识别每个图像中的10个预定义标签中的一个。

数据准备

为了准备图像,我们需要执行以下操作:

  • 下载压缩文件(
  • 解压缩文件并将每个图像存储在10个代表图像标签的不同文件夹中
  • 每个文件夹包含一个标签的图像

下图显示了10个标签文件夹中保留的提取数据集。bird 文件夹打开并显示标记为bird 的所有图像。测试文件夹包含在模型定型后为测试模型而创建的所有图像。

https://www.codeproject.com/KB/AI/1273368/2018-12-10_12-08-02.png

为了正确保存所有图像,我们需要创建一个简单的C#控制台应用程序,它应该提取并保存所有60 000个图像。完整的C#程序可以从下载。

为了成功提取图像,我们必须看看这些图像是如何存储在二进制文件中的。从官方网站,我们可以看到有5个用于培训,1个用于测试二进制文件:data_batch_1.bindata_batch_2.bin...data_batch_5.bin,以及test_batch.bin

每个文件的格式如下,这样数组的第一个字节就是标签索引,接下来的3072个字节代表图像。每批包含10000张图像。

重要的是要知道图像以CHW格式存储,这意味着创建1d图像阵列,使得前1024个字节是红色通道值,下一个1024是绿色通道值,最后1024个是蓝色通道值。值以行主顺序存储,因此前32个字节是图像第一行的红色通道值。为了结束这一点,在实现Extractor应用程序时已经执行了所有这些信息。最重要的方法是将1D字节数组重构为[3, height, width]图像张量,并从字节张量创建图像。以下实现显示了1D字节数组如何转换为3通道位图张量。

static int[][][] reshape(int channel, int height, int width,  byte[] img){    var data = new int[channel][][];    int counter = 0;    for(int c = 0; c < channel; c++)    {        data[c] = new int[height][];        for (int y = 0; y < height; y++)        {            data[c][y] = new int[width];            for (int x = 0; x < width; x++)            {                data[c][y][x] = img[counter];                counter++;            }        }    }    return data;}

1D字节数组转换为张量后,图像可以被创建并保留在磁盘上。以下方法遍历一个批处理文件中的所有10000个图像,提取它们并保留在磁盘上。

public static void extractandSave(byte[] batch, string destImgFolder, ref int imgCounter){    var nStep = 3073;//1 for label and 3072 for image    //    for (int i = 0; i < batch.Length; i += nStep)    {        var l = (int)batch[i];        var img = new ArraySegment
(batch, i + 1, nStep - 1).ToArray();// data in CIFAR-10 dataset is in CHW format, which means CHW: RR...R, GG..G, BB..B; // while HWC: RGB, RGB, ... RGB var reshaped = reshape(3, 32, 32, img); var image = ArrayToImg(reshaped); //check if folder exists var currentFolder = destImgFolder + classNames[l]; if (!Directory.Exists(currentFolder)) Directory.CreateDirectory(currentFolder); //save image to specified folder image.Save(currentFolder + "\\" + imgCounter.ToString() + ".png"); imgCounter++; }}

运行Cifar-Extractor控制台应用程序,下载,提取和保存图像的过程将在几分钟内完成。最重要的是CIFAR-10数据集将存储在c://sc/datasets/cifar-10路径中。当我们创建图像分类器时,这很重要。

现在我们在标签上排列的磁盘上有60000个小图像,我们可以开始创建深度学习模型了。

Anndotnet中创建新的图像分类项目文件

打开最新的ANNdotNET v1.2并选择New-> Image Classification project。输入CIFAR项目名称,然后按保存按钮。下图显示了CIFAR new ann-project

https://www.codeproject.com/KB/AI/1273368/2019-01-01_15-19-06-2.png

一旦我们有了一个新项目,我们就可以通过点击Add按钮开始定义图像标签。对于每10个标签,我们需要在列表中添加新标签项。在每个项目中,应定义以下字段:

  • 图像标签
  • 带有标签的图像的路径
  • 查询——如果我们需要使用名称的某些部分获取指定路径中的所有图像。如果指定路径中的所有图像都是指示一个标签的图像,则查询应为空字符串。

除了Label项之外,还应定义图像转换以定义图像的大小,以及创建验证/测试数据集的图像数量。

假设在c:/sc/datasets/cifar-10文件夹中提取CIFAR-10数据集,下图显示了应如何定义标签项:

https://www.codeproject.com/KB/AI/1273368/2019-01-01_15-25-55-3.png

如果应从列表中删除标签项,则通过选择项目,然后点击删除按钮来完成此操作。除了图像属性,我们还应该定义有多少图像属于验证数据集。可以看出,所有提取图像的20%将被创建验证数据集。请注意,测试文件夹中的图像不是这两个数据集的一部分。一旦训练模型,它们将用于测试阶段。现在我们完成了数据准备,我们可以进入下一步:创建mlconifg文件。

ANNdotNET中创建mlconfig

通过选择New MLConfig命令,将在项目资源管理器中创建新的mlconfig文件。此外,通过在所选的mlconfig树项上按F2键,我们可以轻松地将名称更改为“ CIRAF-10-ConvNet。我们给出这样一个名字的原因是因为我们将使用卷积神经网络

为了定义mlconfig文件,我们需要定义以下内容:

  • 使用Visual Network Designer进行网络配置
  • 定义学习参数
  • 定义训练参数

创建网络配置

通过使用Visual Network DesignerVND),我们可以快速创建网络模型。对于这个CIFAR-10数据集,我们将创建11层模型,包括4个卷积层(Convolutional)2个池(Pooling)1个辍学层(DropOut )3个密集(Dense)层,所有层后面都是缩放(Scale)层:

Scale (1/255)->Conv2D(32,[3,3])->Conv2D(32,[3,3])->Pooling2d([2,2],2)->

Conv2D(64,[3,3])->Conv2D(64,[3,3])->Pooling2d([2,2],2)->DropOut(0.5)->

Dense(64, TanH)->Dense(32, TanH)->Dense(10,Softmax)

可以创建此网络,以便我们从VND组合框中选择适当的图层,然后单击添加按钮。第一层是Scale层,因为我们需要将输入值标准化为区间(0,1)。然后我们创建了两个ConvolutionPooling图层序列。完成后,我们可以添加两个Dense图层,其中6432个神经元具有TanH激活功能。最后一层是必须遵循输出维度的输出层,以及Softmax激活功能。

https://www.codeproject.com/KB/AI/1273368/2019-01-01_15-25-56.png

一旦定义了网络模型,我们就可以进入下一步:设置学习和训练参数。

学习参数可以通过学习参数界面定义。对于此模型,我们可以选择:

  • AdamLearner0.005率和0.9势头值。损失函数是ClassificationEntropyWithSoftmax,评估函数是ClassificationAccuracy

https://www.codeproject.com/KB/AI/1273368/2018-12-10_19-00-25.png

为了定义训练参数,我们切换到训练选项卡页面并设置:

  • Epoch个数
  • Minibatch大小
  • 进度频率
  • 在培训期间随机化miniatch

https://www.codeproject.com/KB/AI/1273368/2019-01-01_16-58-31.png

现在我们有足够的信息来开始模型培训。通过从应用程序功能区中选择运行命令来启动培训过程。为了获得好的模型,我们需要训练模型至少几千个纪元。下图显示了具有训练历史图表的训练模型。

https://www.codeproject.com/KB/AI/1273368/2019-01-01_16-59-49.png

该模型使用恰好4071个纪元进行训练,使用了上述提到的网络参数。从上图可以看出,mini-batch损失函数是CrossEntropyWithSoftmax,而评估函数是Classification Accuracy。下图显示了训练模型的训练和验证数据集的性能。我们还可以认识到,验证数据集具有与训练数据集大致相同的精度,这表明模型训练得很好。有关模型性能的更多详细信息,请参见下一张图片:

https://www.codeproject.com/KB/AI/1273368/2019-01-01_17-03-27.png

上图中的上图显示了训练(左)和验证(右)的实际值和预测值。大多数点值都是蓝色并与橙色重叠,这表明大多数值都是正确预测的。可以缩放图表并查看每个值的详细信息。评估的底部显示了相应数据集的模型的性能参数。可以看出,训练模型对于训练数据集具有0.91的总体准确度,对于验证数据集具有0.826的总体准确度,这表明模型具有相当好的准确性。此外,接下来的两个图像显示了两个数据集的混淆矩阵,详细说明了模型如何预测所有10个标签。

https://www.codeproject.com/KB/AI/1273368/2019-01-01_17-04-23.png

https://www.codeproject.com/KB/AI/1273368/2019-01-01_17-04-49.png

该文章的最后一部分是测试测试数据集的模型。为此,我们从测试集的每个标签中选择了10个随机图像,并评估模型。以下图像显示模型正确预测了所有10个图像。

https://www.codeproject.com/KB/AI/1273368/2019-01-01_17-14-03.png

结论

ANNdotNET v1.2图像分类模块为图像分类提供完整的数据准备和模型开发。用户可以准备培训数据,使用Visual Network Designer创建网络模型,并针对训练模型执行一组统计工具,以验证和评估模型。重要的注意事项是,图像数据集必须存储在特定位置,以便使用博客文章中显示的训练模型。通过在CIFAR-10.zip feed示例上进行双击,可以将训练好的模型以及mlcofig文件直接加载到ANNdotNET项目资源管理器中。

https://www.codeproject.com/KB/AI/1273368/2019-01-01_19-05-56.png

ANNdotNET作为开源项目,为深度学习模型的完整开发提供了一种出色的方式。

 

原文地址:

转载地址:http://huzhj.baihongyu.com/

你可能感兴趣的文章
深入浅出MyBatis:MyBatis解析和运行原理
查看>>
Mybatis与Ibatis
查看>>
字节码文件(Class文件)
查看>>
java中的IO流(一)----概述
查看>>
StringBuilder
查看>>
集合,Collection
查看>>
泛型详解
查看>>
泛型实现斗地主
查看>>
List集合
查看>>
ArrayList集合,LinkedList集合,Vector集合
查看>>
HashSet集合
查看>>
并发与并行,线程与进程
查看>>
方法引用,通过对象名引用成员变量
查看>>
常用工具类 Math:数学计算 Random:生成伪随机数 SecureRandom:生成安全的随机数 2020-2-13
查看>>
Java的异常Exception 2020-2-13
查看>>
Java标准库定义的常用异常,自定义异常 2020-2-15
查看>>
Java问题百度/Google记录 2020-2-16
查看>>
【PADS9.5】9,对比ECO核心板,Router移动元件后布线消失,Router找不到自动布线策略文件丢失或损坏
查看>>
【STM32+w5500汇总】23,HTTP_Client 连接到ONENET上传了一段数据之后会断开,数据上传格式的设置
查看>>
【STM32+W5500+MQTT】24,所有功能都可以通过API函数的调用来实现;HTTP接入ONENET,API开发手册和打包函数,串口软件HTTP连接服务器上传数据,2018年12月28日
查看>>