主要内容

训练卷积神经网络用于回归

这个例子展示了如何使用卷积神经网络拟合一个回归模型来预测手写数字的旋转角度。

卷积神经网络(cnn或ConvNets)是深度学习的重要工具,特别适合于分析图像数据。例如,你可以使用cnn对图像进行分类。为了预测连续的数据,比如角度和距离,你可以在网络的末端加入一个回归层。

该示例构建了一个卷积神经网络架构,训练了一个网络,并使用训练好的网络来预测旋转手写数字的角度。这些预测对光学字符识别很有用。

可选地,您可以使用imrotate(图像处理工具箱™)旋转图像,和箱线图(Statistics and Machine Learning Toolbox™)创建残差盒图。

加载数据

该数据集包含手写数字的合成图像以及每个图像旋转的相应角度(以度为单位)。

将训练和验证图像加载为4-D数组digitTrain4DArrayDatadigitTest4DArrayData。输出YTrainYValidation是旋转角度的度数。训练和验证数据集各包含5000张图像。

[XTrain,~,YTrain] = digitTrain4DArrayData;[XValidation,~,YValidation] = digitTest4DArrayData;

显示20个随机训练图像使用imshow

numTrainImages = nummel (YTrain);figure idx = randperm(numTrainImages,20);i = 1:元素个数(idx)次要情节(4、5、i) imshow (XTrain (:,:,:, idx(我)))结束

检查数据归一化

当训练神经网络时,确保你的数据在网络的所有阶段都是标准化的通常是有帮助的。归一化有助于稳定和加速使用梯度下降的网络训练。如果您的数据伸缩性差,那么损失可能会变得很大在训练过程中,网络参数会出现发散。规范化数据的常用方法包括重新缩放数据,使其范围变为[0,1],或者使其均值为零,标准差为1。可以对以下数据进行规范化:

  • 输入数据。在将预测器输入到网络之前对其进行规范化。在这个例子中,输入的图像已经被归一化到[0,1]的范围。

  • 层输出。您可以通过使用批规范化层对每个卷积和完全连接层的输出进行规范化。

  • 响应。如果使用批处理归一化层对网络末端的层输出进行归一化,则在训练开始时对网络的预测进行归一化。如果响应与这些预测的规模非常不同,那么网络训练可能无法收敛。如果你的反应规模不大,那么试着将其规范化,看看网络训练是否有所改善。如果在训练前对响应进行归一化,那么必须对训练后网络的预测进行变换,以获得原始响应的预测。

绘制响应的分布。响应(以度为单位的旋转角度)在-45和45之间近似均匀分布,无需归一化即可很好地工作。在分类问题中,输出总是归一化的类概率。

图直方图(YTrain)轴ylabel (“计数”)包含(旋转角度的

一般来说,数据不必完全规范化。但是,如果你在这个例子中训练网络来预测100 * YTrainYTrain + 500而不是YTrain,那么损失就变成当训练开始时,网络参数出现发散。这些结果发生的唯一区别是网络预测aY + b一个网络预测Y是对最终完全连接层的权重和偏差的简单重新缩放。

如果输入或响应的分布非常不均匀或倾斜,您还可以在训练网络之前对数据执行非线性转换(例如,取对数)。

创建网络层

为了解决回归问题,创建网络层,并在网络的末端包含一个回归层。

第一层定义输入数据的大小和类型。输入图像为28 × 28 × 1。创建一个与训练图像大小相同的图像输入层。

网络的中间层定义了网络的核心架构,大部分的计算和学习都在这里进行。

最后一层定义输出数据的大小和类型。对于回归问题,一个完全连接的层必须在网络末端的回归层之前。创建一个大小为1的完全连接的输出层和一个回归层。

把所有的图层组合在一起数组中。

layers = [imageInputLayer([28 28 1])卷积2dlayer (3,8,“填充”“相同”) batchNormalizationLayer reluLayer averagePooling2dLayer(2,“步”2) convolution2dLayer(16日“填充”“相同”) batchNormalizationLayer reluLayer averagePooling2dLayer(2,“步”32岁的,2)convolution2dLayer (3“填充”“相同”) batchNormalizationLayer reluLayer卷积2dlayer (3,32,“填充”“相同”) batchNormalizationLayer reluLayer dropoutLayer(0.2) fulllyconnectedlayer (1) regressionLayer];

列车网络的

创建网络培训选项。训练30次。将初始学习率设置为0.001,并在20个epoch后降低学习率。通过指定验证数据和验证频率,在训练期间监控网络的准确性。该软件利用训练数据对网络进行训练,并在训练过程中定期计算验证数据的准确率。验证数据不用于更新网络权重。打开训练进度图,关闭命令窗口输出。

miniBatchSize = 128;validationFrequency = floor(numel(YTrain)/miniBatchSize);options = 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。否则,trainNetwork使用CPU。在GPU上进行训练需要具有计算能力3.0或更高的支持CUDA®的NVIDIA®GPU。

net = trainNetwork(XTrain,YTrain,layers,options);

中包含的网络体系结构的详细信息的属性

网层
ans = 18×1包含图层的图层数组:1' imageinput'图像输入28×28×1图像与'零中心'归一化2' conv_1'卷积8 3×3×1卷积与步长[1 1]和填充'相同' 3 'batchnorm_1'批归一化8通道批归一化4 'relu_1' ReLU ReLU 5 'avgpool2d_1'平均池化2×2平均池化与步长[2 2]和填充[0 0 0 0]6 'conv_2'卷积16 3×3×8卷积与步长[1 1]和填充'相同' 7 'batchnorm_2'批归一化16通道8'relu_2' ReLU ReLU 9 'avgpool2d_2'平均池化2×2步长[2 2]和填充[0 0 0 0]的平均池化10 'conv_3'卷积32 3×3×16步长[1 1]卷积和填充'same' 11 'batchnorm_3'批量归一化32通道的批量归一化12 'relu_3' ReLU ReLU 13 'conv_4'卷积32 3×3×32步长[1 1]卷积和填充'same' 14 'batchnorm_4'批量归一化32通道15 'relu_4' ReLU ReLU 16 'dropout' dropout 20%带响应“response”的输出均方误差

测试网络

通过评估验证数据的准确性来测试网络的性能。

使用预测预测验证图像的旋转角度。

y =预测(net,XValidation);

评估性能

通过计算来评估模型的性能:

  1. 在可接受的误差范围内预测的百分比

  2. 预测角度和实际角度的均方根误差(RMSE)

计算预测转角与实际转角之间的预测误差。

predictionError = YValidation - ypredicting;

从真实角度计算在可接受误差范围内的预测数。将阈值设置为10度。计算该阈值内的预测百分比。

THR = 10;numCorrect = sum(abs(predictionError) < thr);numValidationImages = nummel (YValidation);accuracy = numCorrect/numValidationImages
精度= 0.9690

使用均方根误差(RMSE)来测量预测角度和实际角度之间的差异。

^2;Rmse = sqrt(均数(平方))
rmse =4.6062

可视化预测

在散点图中可视化预测。根据真实值绘制预测值。

图散射(YPredicted YValidation,“+”)包含(“预测价值”) ylabel (“真正的价值”)举行情节([- 6060],[- 6060],“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)) title(“原始”) subplot(1,2,2)蒙太奇(imagesrotation)标题(“纠正”

另请参阅

|

相关的话题