这个例子展示了如何使用卷积神经网络拟合回归模型来预测手写数字的旋转角度。
卷积神经网络(cnn或ConvNets)是深度学习的基本工具,特别适合分析图像数据。例如,您可以使用cnn对图像进行分类。要预测连续数据,如角度和距离,可以在网络的末端包含一个回归层。
该示例构建了一个卷积神经网络架构,训练了一个网络,并使用训练后的网络预测旋转手写数字的角度。这些预测对光学字符识别是有用的。
您可以选择使用imrotate
(图像处理工具箱™)旋转图像,和箱线图
(统计和机器学习工具箱™)来创建残差箱图。
数据集包含手写数字的合成图像以及每个图像旋转的相应角度(以度为单位)。
将训练图像和验证图像加载为4-D数组digitTrain4DArrayData
而且digitTest4DArrayData
.输出YTrain
而且YValidation
是旋转角度,单位是度。训练和验证数据集各包含5000张图像。
[XTrain,~,YTrain] = digitTrain4DArrayData;[XValidation,~,YValidation] = digitTest4DArrayData;
显示20个随机训练图像使用imshow
.
numTrainImages =数字(YTrain);figure idx = randperm(numTrainImages,20);为i = 1:元素个数(idx)次要情节(4、5、i) imshow (XTrain (:,:,:, idx(我)))结束
在训练神经网络时,它通常有助于确保你的数据在网络的所有阶段都是标准化的。标准化有助于稳定和加速网络训练使用梯度下降。如果您的数据比例不好,那么损失可能会变得南
在训练过程中,网络参数会出现发散。规范化数据的常用方法包括重新缩放数据,使其范围变为[0,1],或者使其均值为0,标准差为1。可以对以下数据进行归一化:
输入数据。在将预测器输入到网络之前,将其规范化。在这个例子中,输入图像已经标准化到范围[0,1]。
层输出。通过使用批处理归一化层,可以归一化每个卷积层和全连接层的输出。
响应。如果你使用批归一化层来归一化网络末端的层输出,那么当训练开始时,网络的预测是归一化的。如果响应的规模与这些预测有很大的不同,那么网络训练可能无法收敛。如果你的反应规模不好,那么试着将其正常化,看看网络训练是否会有所改善。如果在训练之前将响应归一化,那么必须转换训练网络的预测以获得原始响应的预测。
画出响应的分布。响应(以度为单位的旋转角度)近似均匀分布在-45和45之间,不需要归一化就能很好地工作。在分类问题中,输出是类概率,它总是标准化的。
图直方图(YTrain)轴紧ylabel (“计数”)包含(旋转角度的)
通常,数据不需要完全规范化。然而,如果你在这个例子中训练网络来预测100 * YTrain
或YTrain + 500
而不是YTrain
,那么损失就变成了南
当训练开始时,网络参数出现发散。这些结果发生即使唯一的区别,网络预测aY + b一个网络预测Y是最终全连接层的权重和偏差的简单重新缩放。
如果输入或响应的分布非常不均匀或倾斜,您还可以在训练网络之前对数据进行非线性转换(例如,取对数)。
为了解决回归问题,创建网络的层,并在网络的末端包含一个回归层。
第一层定义输入数据的大小和类型。输入图像是28 × 28 × 1。创建一个与训练图像大小相同的图像输入层。
网络的中间层定义了网络的核心架构,大部分的计算和学习都发生在那里。
最后一层定义输出数据的大小和类型。对于回归问题,一个完全连接的层必须在网络末端的回归层之前。创建大小为1的完全连接输出层和回归层。
将所有图层组合在一起层
数组中。
图层= [imageInputLayer([28 28 1])卷积2dlayer (3,8,“填充”,“相同”(2,)“步”2) convolution2dLayer(16日“填充”,“相同”(2,)“步”32岁的,2)convolution2dLayer (3“填充”,“相同”卷积2dlayer (3,32,“填充”,“相同”) batchNormalizationLayer reluLayer dropoutLayer(0.2) fullyConnectedLayer(1) regressionLayer];
创建网络培训选项。训练30次。将初始学习率设置为0.001,并在20个epoch后降低学习率。通过指定验证数据和验证频率,在培训过程中监控网络的准确性。该软件在训练数据上训练网络,并在训练期间定期计算验证数据的准确性。验证数据不用于更新网络权重。打开训练进度图,并关闭命令窗口输出。
miniBatchSize = 128;validationFrequency = floor(编号(YTrain)/miniBatchSize);选项= trainingOptions(“个”,...“MiniBatchSize”miniBatchSize,...“MaxEpochs”30岁的...“InitialLearnRate”1 e - 3,...“LearnRateSchedule”,“分段”,...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”, 20岁,...“洗牌”,“every-epoch”,...“ValidationData”{XValidation, YValidation},...“ValidationFrequency”validationFrequency,...“阴谋”,“训练进步”,...“详细”、假);
使用以下命令创建网络trainNetwork
.如果可用,该命令使用兼容的图形处理器。使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱).否则,trainNetwork
占用CPU。
net = trainNetwork(XTrain,YTrain,图层,选项);
类中包含的网络体系结构的详细信息层
的属性网
.
网层
ans = 18x1带有图层的图层数组:1' imageinput'图像输入28x28x1图像,'zerocenter'归一化2' conv_1'卷积8个3x3x1卷积,stride[1 1],填充'same' 3 'batchnorm_1'批量归一化8通道批量归一化4 'relu_1' ReLU ReLU 5 'avgpool2d_1'平均池化2x2平均池化,stride[2 2],填充[0 0 0 0 0]6 'conv_2'卷积16个3x3x8卷积,stride[1 1],填充'same' 7 'batchnorm_2'批量归一化16通道批量归一化8'relu_2' ReLU ReLU 9 'avgpool2d_2' Average Pooling 2x2 Average Pooling with stride [2 2] and padding [0 0 0 0 0] 10 'conv_3' Convolution 32 3x3x16 convolutions with stride [1 1] and padding 'same' 11 'batchnorm_3' Batch Normalization Batch Normalization with stride [1 1] and padding 'same' 14 'batchnorm_4' Batch Normalization Batch Normalization with 32 channels 15 'relu_4' ReLU ReLU 16 'dropout' dropout 20%dropout 17 'fc'全连接1 '全连接层18 'regressionoutput'回归输出均方误差与响应' response '
通过评估验证数据的准确性来测试网络的性能。
使用预测
预测验证图像的旋转角度。
ypredict = predict(net,XValidation);
评估性能
通过计算来评估模型的性能:
在可接受的误差范围内预测的百分比
预测和实际旋转角度的均方根误差(RMSE)
计算预测角度与实际角度之间的预测误差。
predictionError = YValidation - yexpected;
从真实角度计算在可接受的误差范围内的预测数。设置阈值为10度。计算该阈值内预测的百分比。
THR = 10;numCorrect = sum(abs(predictionError) < thr);numValidationImages = nummel (YValidation);accuracy = numCorrect/numValidationImages
准确度= 0.9716
使用均方根误差(RMSE)来测量预测和实际旋转角度之间的差异。
squares = predictionError.^2;Rmse =√(均数(平方))
rmse =单4.5505
在散点图中可视化预测。把预测值与真实值画在一起。
图散射(YPredicted YValidation,“+”)包含(“预测价值”) ylabel (“真正的价值”)举行在Plot ([-60 60], [-60 60],“r——”)
可以使用“图像处理工具箱”中的函数将数字拉直并一起显示。旋转49个样本数字根据他们的预测旋转角度使用imrotate
(图像处理工具箱)。
idx = randperm(numValidationImages,49);为i = 1:元素个数(idx)图像= XValidation (:,:,:, idx(我));predictedAngle = yexpected (idx(i));imagesrotate (:,:,:,i) = imrotate(image,predictedAngle,“双三次的”,“作物”);结束
显示原始数字及其正确的旋转。你可以使用蒙太奇
(图像处理工具箱)显示数字一起在一个单一的图像。
图subplot(1,2,1)蒙太奇(XValidation(:,:,:,idx))标题(“原始”) subplot(1,2,2)蒙太奇(imagesrotate)“纠正”)
regressionLayer
|classificationLayer