此示例示出了如何使用卷积神经网络来预测的手写体数字旋转角拟合回归模型。
卷积神经网络(细胞神经网络,或ConvNets)是深度学习的重要工具,并特别适合于分析图像数据。例如,你可以用细胞神经网络分类图像。为了预测连续的数据,如角度和距离,可以包括在网络的端部的回归层。
的示例构造的卷积神经网络结构,火车的网络中,并使用经训练的网络来预测的旋转手写体数字的角度。这些预测是光学字符识别有用的。
或者,您可以使用imrotate
(图像处理工具箱™)来旋转图像,以及箱形图
(统计和机器学习工具箱™)来创建一个剩余盒图。
该数据集包含的手写体数字合成影像与由每个图像被旋转相应的角度(以度为单位)连接在一起。
作为4 d阵列使用加载训练和验证的图像digitTrain4DArrayData
和digitTest4DArrayData
。输出YTrain
和YValidation
在度的旋转角度。训练和验证数据集都包含5000张图片。
[XTrain,〜,YTrain] = digitTrain4DArrayData;[XValidation,〜,YValidation] = digitTest4DArrayData;
显示使用的20个随机训练图像imshow
。
numTrainImages = numel(YTrain);图IDX = randperm(numTrainImages,20);对于I = 1:numel(IDX)副区(4,5,i)的imshow(XTrain(:,:,:,IDX(I)))的DrawNow结束
在训练神经网络时,确保你的数据在网络的所有阶段都是标准化的通常是有帮助的。归一化有助于稳定和加速使用梯度下降的网络训练。如果您的数据没有很好地缩放,那么损失就会变成为NaN
和网络参数可以在训练中发散。正火数据的常用方法包括:重新缩放数据使得其范围变得[0,1]或使得它具有平均的零和一的标准偏差。您可以正常化以下数据:
输入数据。你正常化前的预测输入它们连接到网络。在这个例子中,输入图像已经被归一化到范围[0,1]。
层的输出。可以通过使用批处理正常化层正常化每个卷积和完全连接层的输出。
响应。如果使用批处理归一化层对网络末端的层输出进行归一化,那么当训练开始时网络的预测就会归一化。如果响应的规模与这些预测非常不同,那么网络训练就可能无法收敛。如果你的反应很差,那么试着将其正常化,看看网络训练是否会有所改善。如果在训练前对响应进行规格化,那么必须转换训练过的网络的预测,以获得原始响应的预测。
绘制响应的分布。响应(以度为单位旋转角)大致均匀地-45和45,其无需正常化效果很好之间分配。在分类问题,输出级的概率,这是永远归。
图直方图(YTrain)轴紧ylabel(“计数”)xlabel(“转角”)
在一般情况下,数据没有被准确地正常化。但是,如果你在这个例子中训练网络预测100 * YTrain
要么YTrain + 500
代替YTrain
,那么造成的损失变得为NaN
当训练开始时,网络参数会发生发散。这些结果发生的唯一区别就是网络预测一条Y + B网络预测Y是对最终全连接层的权重和偏差进行简单的调整。
如果输入或响应的分布非常不均匀或倾斜,您还可以在训练网络之前对数据执行非线性转换(例如,取对数)。
为了解决回归问题,创建网络的层,并在网络的末端包括一个回归层。
所述第一层限定了输入数据的大小和类型。输入图像28按28×1。创建相同的大小作为训练图像的图像输入层。
网络的中间层定义了网络,其中大部分计算的核心架构和学习发生。
最终层限定的尺寸和输出数据的类型。对于回归问题,一个完全连接层必须在网络的端部先于回归层。创建尺寸1的完全连接输出层和回归层。
把所有的层组合在一起层
阵列。
层= [imageInputLayer([28 28 1])convolution2dLayer(3,8,'填充','相同')batchNormalizationLayer reluLayer averagePooling2dLayer(2,“步”,2)convolution2dLayer(3,16,'填充','相同')batchNormalizationLayer reluLayer averagePooling2dLayer(2,“步”,2)convolution2dLayer(3,32,'填充','相同')batchNormalizationLayer reluLayer convolution2dLayer(3,32,'填充','相同')batchNormalizationLayer reluLayer dropoutLayer(0.2)fullyConnectedLayer(1)regressionLayer];
创建网络培训选项。30个时代的火车。将初始学习率设置为0.001,20个epoch后降低学习率。在培训期间通过指定验证数据和验证频率来监控网络的准确性。该软件对网络进行训练数据的训练,并在训练期间定期计算验证数据的准确性。验证数据不用于更新网络权重。打开训练进度图,并关闭命令窗口输出。
miniBatchSize = 128;validationFrequency =地板(numel(YTrain)/ miniBatchSize);选项= trainingOptions('SGDM',…'MiniBatchSize',miniBatchSize,…“MaxEpochs”30,…'InitialLearnRate'1 e - 3,…'LearnRateSchedule',“分段”,…'LearnRateDropFactor', 0.1,…“LearnRateDropPeriod”, 20岁,…“洗牌”,“每个历元”,…'ValidationData'{XValidation,YValidation}…'ValidationFrequency',validationFrequency,…“阴谋”,“训练进步”,…“放牧”,假);
创建使用网络trainNetwork
。如果有此命令使用兼容的GPU。除此以外,trainNetwork
使用CPU。需要使用CUDA®启用的NVIDIA®GPU进行GPU培训,计算能力为3.0或更高。
净= trainNetwork(XTrain,YTrain,层,选项);
检查包含在网络架构的细节层
财产净
。
net.Layers
ans = 18x1层数组,有层:1“imageinput”28 x28x1图像输入图像与“zerocenter”正常化2 conv_1的卷积8 3 x3x1旋转步[1]和填充“相同”3“batchnorm_1”批量标准化批量标准化8通道4的relu_1 ReLU ReLU 5“avgpool2d_1”平均池2 x2平均池步(2 - 2)和填充[0 0 0 0]6‘conv_2卷积16 3 x3x8旋转步[1]和填充“相同”7”batchnorm_2批规范化与16通道8批正常化‘relu_2 ReLU ReLU 9“avgpool2d_2”平均池2 x2平均池步(2 - 2)和填充[0 0 0 0]10 conv_3的卷积32 3 x3x16旋转步[1]和填充“相同”11 batchnorm_3的批量标准化批量标准化32通道12“relu_3”ReLU ReLU 13 conv_4的卷积32 3 x3x32旋转步[1]和填充“相同”14“batchnorm_4”批量标准化批量标准化32通道15 ' relu_4 ReLU ReLU 16“辍学”辍学20%dropout 17 'fc'全连接1全连接层18 'regressionoutput'回归输出的平均平方误差与响应' response '
通过评估验证数据准确性测试网络的性能。
用预测
预测验证图像的旋转角度。
YPredicted =预测(净,XValidation);
评估性能
评估模型,通过计算性能:
预测的可接受误差范围的百分比
根均方误差(RMSE)旋转预测的和实际的角度的
计算旋转预测的和实际角度之间的预测误差。
predictionError = YValidation - YPredicted;
计算从真实角度可接受的误差容限内的预测的数量。设置阈值是10度。计算这个阈值内预测的百分比。
用力推= 10;numCorrect = sum(abs(predictionError) < thr);numValidationImages =元素个数(YValidation);= numCorrect / numValidationImages准确性
精度= 0.9704
使用根均方误差(RMSE),以测量旋转的预测值和实际角度之间的差异。
。方形= predictionError ^ 2;RMSE = SQRT(平均值(正方形))
rmse =单4.6056
显示残差的箱线图每个数字类
的箱形图
函数需要其中每列对应于残差每个数字类的矩阵。
验证数据组图像由数字0-9的类与每个500倍的例子。用重塑
将残差按数字类分组。
residualMatrix =重塑(predictionError, 500, 10);
的每一列residualMatrix
对应于每个位的残差。创建使用每个数字的剩余箱线图箱形图
(统计和机器学习工具箱)。
图箱线图(residualMatrix,…'标签'{' 0 ',' 1 ',' 2 ','3','4','5','6','7','8','9'})xlabel(“数字类”)ylabel(度误差的)标题(“残差”)
数字类与精度最高的平均接近零,而且很少变化。
您可以使用函数从图像处理工具箱整顿数字一起显示出来。根据使用旋转它们的预测的角度旋转49个样品数字imrotate
(图像处理工具箱)。
IDX = randperm(numValidationImages,49);对于I = 1:numel(IDX)图像= XValidation(:,:,:,IDX(I));predictedAngle = YPredicted(IDX(I));imagesRotated(:,:,:,1)= imrotate(图像,predictedAngle,“双立方”,'作物');结束
显示他们纠正旋转的原始数字。您可以使用剪辑
(图像处理工具箱),以在单个图像显示的数字在一起。
图副区(1,2,1)的蒙太奇(XValidation(:,:,:,IDX))标题('原版的')副区(1,2,2)蒙太奇(imagesRotated)标题(“修正”)
classificationLayer
|regressionLayer