目录
编辑说明
数据准备
在Anndotnet中创建新的图像分类项目文件
在ANNdotNET中创建mlconfig
创建网络配置
结论
在这篇文章中,我们将为CIFAR-10数据集创建和训练深度学习模型,并了解如何使用ANNdotNET v1.2轻松实现这一点。
编辑说明通过ANNdotNET 1.2,用户可以创建和训练用于图像分类的深度学习模型。图像分类模块提供最少的GUI操作,以便完全准备数据集。在这篇文章中,我们将为CIFAR-10数据集创建和训练深度学习模型,并了解如何使用ANNdotNET v1.2轻松实现这一点。
为了准备数据,我们必须从官方网站下载CIFAR-10数据集。CIFAR-10数据集由6个二进制批处理文件提供,可以在本地计算机上提取并保留。名称中的数字10表示为10个标签创建数据集。下图显示了10个CIFAR-10数据集标签,每个标签包含少量样本图像。
CIFAR-10数据集(从Tiny Images学习多层特征,Alex Krizhevsky,2009年。)
该数据集包含60 000(50 000用于培训和验证,10 000用于测试)微小彩色图像尺寸为32×32。还有更大版本的数据集CIFAR-100有100个标签。我们的任务是创建深度学习模型,能够识别每个图像中的10个预定义标签中的一个。
数据准备为了准备图像,我们需要执行以下操作:
- 下载压缩文件(http://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz)
- 解压缩文件并将每个图像存储在10个代表图像标签的不同文件夹中
- 每个文件夹包含一个标签的图像
下图显示了10个标签文件夹中保留的提取数据集。bird 文件夹打开并显示标记为bird 的所有图像。测试文件夹包含在模型定型后为测试模型而创建的所有图像。
为了正确保存所有图像,我们需要创建一个简单的C#控制台应用程序,它应该提取并保存所有60 000个图像。完整的C#程序可以从这里下载。
为了成功提取图像,我们必须看看这些图像是如何存储在二进制文件中的。从官方网站,我们可以看到有5个用于培训,1个用于测试二进制文件:data_batch_1.bin,data_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:
一旦我们有了一个新项目,我们就可以通过点击Add按钮开始定义图像标签。对于每10个标签,我们需要在列表中添加新标签项。在每个项目中,应定义以下字段:
- 图像标签
- 带有标签的图像的路径
- 查询——如果我们需要使用名称的某些部分获取指定路径中的所有图像。如果指定路径中的所有图像都是指示一个标签的图像,则查询应为空字符串。
除了Label项之外,还应定义图像转换以定义图像的大小,以及创建验证/测试数据集的图像数量。
假设在c:/sc/datasets/cifar-10文件夹中提取CIFAR-10数据集,下图显示了应如何定义标签项:
如果应从列表中删除标签项,则通过选择项目,然后点击“删除”按钮来完成此操作。除了图像属性,我们还应该定义有多少图像属于验证数据集。可以看出,所有提取图像的20%将被创建验证数据集。请注意,测试文件夹中的图像不是这两个数据集的一部分。一旦训练模型,它们将用于测试阶段。现在我们完成了数据准备,我们可以进入下一步:创建mlconifg文件。
在ANNdotNET中创建mlconfig通过选择New MLConfig命令,将在项目资源管理器中创建新的mlconfig文件。此外,通过在所选的mlconfig树项上按F2键,我们可以轻松地将名称更改为“ CIRAF-10-ConvNet”。我们给出这样一个名字的原因是因为我们将使用卷积神经网络。
为了定义mlconfig文件,我们需要定义以下内容:
- 使用Visual Network Designer进行网络配置
- 定义学习参数
- 定义训练参数
通过使用Visual Network Designer(VND),我们可以快速创建网络模型。对于这个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)。然后我们创建了两个Convolution,Pooling图层序列。完成后,我们可以添加两个Dense图层,其中64和32个神经元具有TanH激活功能。最后一层是必须遵循输出维度的输出层,以及Softmax激活功能。
一旦定义了网络模型,我们就可以进入下一步:设置学习和训练参数。
学习参数可以通过学习参数界面定义。对于此模型,我们可以选择:
- AdamLearner以0.005率和0.9势头值。损失函数是ClassificationEntropyWithSoftmax,评估函数是ClassificationAccuracy
为了定义训练参数,我们切换到训练选项卡页面并设置:
- Epoch个数
- Minibatch大小
- 进度频率
- 在培训期间随机化miniatch
现在我们有足够的信息来开始模型培训。通过从应用程序功能区中选择“运行”命令来启动培训过程。为了获得好的模型,我们需要训练模型至少几千个纪元。下图显示了具有训练历史图表的训练模型。
该模型使用恰好4071个纪元进行训练,使用了上述提到的网络参数。从上图可以看出,mini-batch损失函数是CrossEntropyWithSoftmax,而评估函数是Classification Accuracy。下图显示了训练模型的训练和验证数据集的性能。我们还可以认识到,验证数据集具有与训练数据集大致相同的精度,这表明模型训练得很好。有关模型性能的更多详细信息,请参见下一张图片:
上图中的上图显示了训练(左)和验证(右)的实际值和预测值。大多数点值都是蓝色并与橙色重叠,这表明大多数值都是正确预测的。可以缩放图表并查看每个值的详细信息。评估的底部显示了相应数据集的模型的性能参数。可以看出,训练模型对于训练数据集具有0.91的总体准确度,对于验证数据集具有0.826的总体准确度,这表明模型具有相当好的准确性。此外,接下来的两个图像显示了两个数据集的混淆矩阵,详细说明了模型如何预测所有10个标签。
该文章的最后一部分是测试测试数据集的模型。为此,我们从测试集的每个标签中选择了10个随机图像,并评估模型。以下图像显示模型正确预测了所有10个图像。
ANNdotNET v1.2图像分类模块为图像分类提供完整的数据准备和模型开发。用户可以准备培训数据,使用Visual Network Designer创建网络模型,并针对训练模型执行一组统计工具,以验证和评估模型。重要的注意事项是,图像数据集必须存储在特定位置,以便使用博客文章中显示的训练模型。通过在CIFAR-10.zip feed示例上进行双击,可以将训练好的模型以及mlcofig文件直接加载到ANNdotNET项目资源管理器中。
ANNdotNET作为开源项目,为深度学习模型的完整开发提供了一种出色的方式。
原文地址:https://www.codeproject.com/Articles/1273368/Create-CIFAR-10-Deep-Learning-Model-With-ANNdotNET