针对回归训练卷积神经网络

针对回归训练卷积神经网络

此示例使用:

Try it in MATLAB

此示例说明如何使用卷积神经网络拟合回归模型来预测手写数字的旋转角度。

卷积神经网络(CNN 或 ConvNet)是深度学习的基本工具,尤其适用于分析图像数据。例如,您可以使用 CNN 对图像进行分类。要预测连续数据(例如角度和距离),可以在网络末尾包含回归层。

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

此外,您可以选择使用 imrotate (Image Processing Toolbox™) 旋转图像,并可选择使用 boxplot (Statistics and Machine Learning Toolbox™) 创建残差箱线图。

加载数据

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

使用 digitTrain4DArrayData 和 digitTest4DArrayData 以四维数组的形式加载训练图像和验证图像。输出 YTrain 和 YValidation 是以度为单位的旋转角度。训练数据集和验证数据集各包含 5000 个图像。

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

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

numTrainImages = numel(YTrain);
figure
idx = randperm(numTrainImages,20);
for i = 1:numel(idx)
    subplot(4,5,i)
    imshow(XTrain(:,:,:,idx(i)))
    drawnow
end

检查数据归一化

在训练神经网络时,最好确保数据在网络的所有阶段均归一化。对于使用梯度下降的网络训练,归一化有助于训练的稳定和加速。如果您的数据比例不佳,则损失可能会变为 NaN,并且网络参数在训练过程中可能发生偏离。归一化数据的常用方法包括重新缩放数据,使其范围变为 [0,1],或使其均值为 0 且标准差为 1。您可以归一化以下数据:

  • 输入数据。在将预测变量输入到网络之前对其进行归一化。在此示例中,输入图像已归一化到范围 [0,1]。
  • 层输出。您可以使用批量归一化层来归一化每个卷积层和全连接层的输出。

    可直接联系客服QQ交代需求:953586085

    欢迎光临程序代写小店https://item.taobao.com/item.htm?spm=a230r.1.14.59.255028c3ALNkZ0&id=586797758241&ns=1&abbucket=15#detail

  • 响应。如果使用批量归一化层来归一化网络末尾的层输出,则网络的预测值在训练开始时就被归一化。如果响应的比例与这些预测值完全不同,则网络训练可能无法收敛。如果您的响应比例不佳,则尝试对其进行归一化,并查看网络训练是否有所改善。如果在训练之前将响应归一化,则必须转换经过训练网络的预测值,以获得原始响应的预测值。

绘制响应的分布。响应(以度为单位的旋转角度)大致均匀地分布在 -45 和 45 之间,效果很好,无需归一化。在分类问题中,输出是类概率,始终需要归一化。

figure
histogram(YTrain)
axis tight
ylabel(‘Counts‘)
xlabel(‘Rotation Angle‘)

通常,数据不必完全归一化。但是,如果在此示例中训练网络来预测 100*YTrain 或 YTrain+500 而不是 YTrain,则损失将变为 NaN,并且网络参数在训练开始时会发生偏离。即使预测 aY + b 的网络与预测 Y 的网络之间的唯一差异是对最终全连接层的权重和偏置的简单重新缩放,也会出现这些结果。

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

创建网络层

要解决回归问题,请创建网络层并在网络末尾包含一个回归层。

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

网络的中间层定义网络的核心架构,大多数计算和学习都在此处进行。

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

在 Layer 数组中将所有层组合在一起。

layers = [
    imageInputLayer([28 28 1])

    convolution2dLayer(3,8,‘Padding‘,‘same‘)
    batchNormalizationLayer
    reluLayer

    averagePooling2dLayer(2,‘Stride‘,2)

    convolution2dLayer(3,16,‘Padding‘,‘same‘)
    batchNormalizationLayer
    reluLayer

    averagePooling2dLayer(2,‘Stride‘,2)

    convolution2dLayer(3,32,‘Padding‘,‘same‘)
    batchNormalizationLayer
    reluLayer

    convolution2dLayer(3,32,‘Padding‘,‘same‘)
    batchNormalizationLayer
    reluLayer

    dropoutLayer(0.2)
    fullyConnectedLayer(1)
    regressionLayer];

训练网络

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

miniBatchSize  = 128;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions(‘sgdm‘, ...
    ‘MiniBatchSize‘,miniBatchSize, ...
    ‘MaxEpochs‘,30, ...
    ‘InitialLearnRate‘,1e-3, ...
    ‘LearnRateSchedule‘,‘piecewise‘, ...
    ‘LearnRateDropFactor‘,0.1, ...
    ‘LearnRateDropPeriod‘,20, ...
    ‘Shuffle‘,‘every-epoch‘, ...
    ‘ValidationData‘,{XValidation,YValidation}, ...
    ‘ValidationFrequency‘,validationFrequency, ...
    ‘Plots‘,‘training-progress‘, ...
    ‘Verbose‘,false);

使用 trainNetwork 创建网络。如果存在兼容的 GPU,此命令会使用 GPU。否则,trainNetwork 将使用 CPU。在 GPU 上进行训练需要具有 3.0 或更高计算能力的支持 CUDA® 的 NVIDIA® GPU。

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

检查 net 的 Layers 属性中包含的网络架构的详细信息。

net.Layers
ans =
  18x1 Layer array with layers:

     1   ‘imageinput‘         Image Input           28x28x1 images with ‘zerocenter‘ normalization
     2   ‘conv_1‘             Convolution           8 3x3x1 convolutions with stride [1  1] and padding ‘same‘
     3   ‘batchnorm_1‘        Batch Normalization   Batch normalization with 8 channels
     4   ‘relu_1‘             ReLU                  ReLU
     5   ‘avgpool_1‘          Average Pooling       2x2 average pooling with stride [2  2] and padding [0  0  0  0]
     6   ‘conv_2‘             Convolution           16 3x3x8 convolutions with stride [1  1] and padding ‘same‘
     7   ‘batchnorm_2‘        Batch Normalization   Batch normalization with 16 channels
     8   ‘relu_2‘             ReLU                  ReLU
     9   ‘avgpool_2‘          Average Pooling       2x2 average pooling with stride [2  2] and padding [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 32 channels
    12   ‘relu_3‘             ReLU                  ReLU
    13   ‘conv_4‘             Convolution           32 3x3x32 convolutions 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‘                 Fully Connected       1 fully connected layer
    18   ‘regressionoutput‘   Regression Output     mean-squared-error with response ‘Response‘

测试网络

基于验证数据评估准确度来测试网络性能。

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

YPredicted = predict(net,XValidation);

评估性能

通过计算以下值来评估模型性能:

  1. 在可接受误差界限内的预测值的百分比
  2. 预测旋转角度和实际旋转角度的均方根误差 (RMSE)

计算预测旋转角度和实际旋转角度之间的预测误差。

predictionError = YValidation - YPredicted;

计算在实际角度的可接受误差界限内的预测值的数量。将阈值设置为 10 度。计算此阈值范围内的预测值的百分比。

thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numValidationImages = numel(YValidation);

accuracy = numCorrect/numValidationImages
accuracy = 0.9636

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

squares = predictionError.^2;
rmse = sqrt(mean(squares))
rmse = single
    4.6393

显示每个数字类的残差箱线图

boxplot 函数需要一个矩阵,其中各个列对应于各个数字类的残差。

验证数据按数字类 0-9 对图像进行分组,每组包含 500 个样本。使用 reshape 按数字类对残差进行分组。

residualMatrix = reshape(predictionError,500,10);

residualMatrix 的每列对应于每个数字的残差。使用 boxplot (Statistics and Machine Learning Toolbox) 为每个数字创建残差箱线图。

figure
boxplot(residualMatrix,...
    ‘Labels‘,{‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘})
xlabel(‘Digit Class‘)
ylabel(‘Degrees Error‘)
title(‘Residuals‘)

准确度最高的数字类具有接近于零的均值和很小的方差。

校正数字旋转

您可以使用 Image Processing Toolbox 中的函数来摆正数字并将它们显示在一起。使用 imrotate (Image Processing Toolbox) 根据预测的旋转角度旋转 49 个样本数字。

idx = randperm(numValidationImages,49);
for i = 1:numel(idx)
    image = XValidation(:,:,:,idx(i));
    predictedAngle = YPredicted(idx(i));
    imagesRotated(:,:,:,i) = imrotate(image,predictedAngle,‘bicubic‘,‘crop‘);
end

显示原始数字以及校正旋转后的数字。您可以使用 montage (Image Processing Toolbox) 将数字显示在同一个图像上。

figure
subplot(1,2,1)
montage(XValidation(:,:,:,idx))
title(‘Original‘)

subplot(1,2,2)
montage(imagesRotated)
title(‘Corrected‘)

原文地址:https://www.cnblogs.com/chenbocheng/p/10844079.html

时间: 2024-11-09 01:53:48

针对回归训练卷积神经网络的相关文章

卷积神经网络CNN总结

从神经网络到卷积神经网络(CNN)我们知道神经网络的结构是这样的: 那卷积神经网络跟它是什么关系呢?其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进.比如下图中就多了许多传统神经网络没有的层次. 卷积神经网络的层级结构      ? 数据输入层/ Input layer ? 卷积计算层/ CONV layer ? ReLU激励层 / ReLU layer ? 池化层 / Pooling layer ? 全连接层 / FC layer 1.数据输入层该层要

[blog]基于卷积神经网络的以图搜图算法实现

基于卷积神经网络的以图搜图算法实现        如果用这个名称去搜索论文,一定有不少.为什么了,因为从原理上来看,卷积神经网络就非常适合找图片的相似的地方.想想看,许多大牛.小牛.微牛的文章都是说如何从mnist中.从CIFA10中.从CIFA100中去找到相似的图片.那么,反过来想一想,如果那么复杂的数据卷积神经网络都能够去处理,那么对于这种相对来说,比较简单的"以图搜图"的需求,应该更容易来解决.这里的神经网络解决这个问题,还是尝试得到一种较为通用的问题解决方法. 零.数据集的创

自己训练卷积模型实现猫狗

原数据集:包含 25000张猫狗图像,两个类别各有12500 新数据集:猫.狗 (照片大小不一样) 训练集:各1000个样本 验证集:各500个样本 测试集:各500个样本 # 将图像复制到训练.验证和测试的目录 import os,shutil orginal_dataset_dir = 'kaggle_original_data/train' base_dir = 'cats_and_dogs_small' os.mkdir(base_dir)#保存新数据集的目录 train_dir = o

5.1 卷积神经网络简介

5-1 实例化一个小型的卷积神经网络 from keras import layers from keras import models Using TensorFlow backend. model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape = (28, 28, 1))) model.add(layers.MaxPooling2D((2,2))) model.

卷积神经网络_(2)_分类与回归_几类经典网络简介

1.经典神经网络有:2012年提出的AlexNet和2014年提出的VGGNet,结构图分别如下: 2.分类与回归: (1)分类(classfication):就是经过经过一系列的卷积层和池化层之后,再经过全连接层得到样本属于每个类的得分,再用比如softmax分类其对其进行分类: (2)回归(regression):相当于用一个矩形框来框住要识别的物体,即localization; 如下: 这里,回归用了拟合的方法,即给定输入中物体的位置(x,yw,h),再用卷积网络的输出(x',y',w',

卷积神经网络分类与回归任务的应用简介

location 对输入图像定位,找到盒子坐标(x,y,w,h):Clssificaion and Location的最后一层是的特征做两件事,一个是分类,一个是定位.         训练时使用已有的模型,也就是最后一层全联接之前所有的参数都用已有模型的,然后在这个基础上进行微调(fine tune),使其向着想要的网络去收敛.               分类时,softmax计算loss,随机梯度下降SGD反向传播更新参数.测试时同时得到分类得分和定位(坐标).              

使用CNN(convolutional neural nets)检测脸部关键点教程(三):卷积神经网络训练和数据扩充

第五部分 第二个模型:卷积神经网络 上图演示了卷积操作 LeNet-5式的卷积神经网络,是计算机视觉领域近期取得的巨大突破的核心.卷积层和之前的全连接层不同,采用了一些技巧来避免过多的参数个数,但保持了模型的描述能力.这些技巧是: 1, 局部联结:神经元仅仅联结前一层神经元的一小部分. 2, 权重共享:在卷积层,神经元子集之间的权重是共享的.(这些神经元的形式被称为特征图[feature map]) 3, 池化:对输入进行静态的子采样. 局部性和权重共享的图示 卷积层的单元实际上连接了前一层神经

TensorFlow训练MNIST数据集(3) —— 卷积神经网络

前面两篇随笔实现的单层神经网络 和多层神经网络, 在MNIST测试集上的正确率分别约为90%和96%.在换用多层神经网络后,正确率已有很大的提升.这次将采用卷积神经网络继续进行测试. 1.模型基本结构 如下图所示,本次采用的模型共有8层(包含dropout层).其中卷积层和池化层各有两层. 在整个模型中,输入层负责数据输入:卷积层负责提取图片的特征:池化层采用最大池化的方式,突出主要特征,并减少参数维度:全连接层再将个特征组合起来:dropout层可以减少每次训练的计算量,并可以一定程度上避免过

卷积神经网络(CNN)的训练过程

卷积神经网络的训练过程 卷积神经网络的训练过程分为两个阶段.第一个阶段是数据由低层次向高层次传播的阶段,即前向传播阶段.另外一个阶段是,当前向传播得出的结果与预期不相符时,将误差从高层次向底层次进行传播训练的阶段,即反向传播阶段.训练过程如图4-1所示.训练过程为: 1.网络进行权值的初始化: 2.输入数据经过卷积层.下采样层.全连接层的向前传播得到输出值: 3.求出网络的输出值与目标值之间的误差: 4.当误差大于我们的期望值时,将误差传回网络中,依次求得全连接层,下采样层,卷积层的误差.各层的