主要内容

将分类网络转换为回归网络

这个例子展示了如何将一个训练有素的分类网络转换成一个回归网络。

经过预先训练的图像分类网络已经在100多万幅图像上进行了训练,可以将图像分为1000个对象类别,如键盘、咖啡杯、铅笔和许多动物。网络学习了丰富的特征表示范围广泛的图像。该网络以一幅图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。

迁移学习通常用于深度学习应用。你可以用一个预先训练好的网络作为学习新任务的起点。这个例子展示了如何使用预先训练好的分类网络,并将其重新训练用于回归任务。

该示例加载了一个预先训练的卷积神经网络结构用于分类,取代了用于分类的层,并重新训练网络来预测旋转后的手写数字的角度。您可以选择使用imrotate(图像处理工具箱™)来使用预测值校正图像旋转。

负载Pretrained网络

从支持文件加载预先训练的网络金宝appdigitsNet.mat.这个文件包含一个对手写数字进行分类的分类网络。

负载digitsNet层=净。层
图层数组:1“imageinput”图像输入28××28日1图像“zerocenter”正常化2 conv_1的卷积8 3×3×1的隆起与步幅[1]和填充“相同”3“batchnorm_1”批量标准化批量标准化8通道4的relu_1 ReLU ReLU 5“maxpool_1”马克斯池2×2马克斯池步(2 - 2)和填充[0 0 0 0]6“conv_2”卷积16 3×3×8旋转步[1]和填充“相同”7”batchnorm_2批量标准化批量标准化与16通道8 ' relu_2 ReLU ReLU 9“maxpool_2”马克斯池2×2马克斯池步(2 - 2)和填充[0 0 0 0]10 conv_3的卷积32 3×3×16步[1]和填充的卷积‘相同’11“batchnorm_3”Batch normalizing Batch Normalization with 32 channels 12 'relu_3' ReLU ReLU 13 'fc' Fully Connected 10 Fully Connected layer 14 'softmax' softmax softmax 15 'classoutput' classoutput crossentropyex with '0'和9个其他类

加载数据

数据集包含手写数字的合成图像以及相应的旋转角度(以角度表示)。

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

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

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

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

取代最后一层

网络的卷积层提取图像特征,最后一个可学习层和最后一个分类层用来对输入图像进行分类。这两个层,“俱乐部”“classoutput”digitsNet,包含关于如何将网络提取的特征组合成类别概率、损失值和预测标签的信息。为了重新训练一个预先训练的回归网络,用适应任务的新层代替这两层。

将最终的完全连接层、softmax层和分类输出层替换为大小为1(响应数)的完全连接层和回归层。

numResponses = 1;layers = [layers(1:12) fulllyconnectedlayer (numResponses) regressionLayer];

冻结初始层

网络现在已经准备好接受关于新数据的再培训。你还可以选择将网络中较早层次的学习速率设置为零,从而“冻结”这些层次的权重。在培训期间,trainNetwork不更新冻结层的参数。由于冻结层的梯度不需要计算,冻结许多初始层的权值可以显著加快网络训练速度。如果新数据集很小,那么冻结较早的网络层也可以防止这些层对新数据集过度拟合。

使用支持函数金宝appfreezeWeights设置前12层的学习速率为零。

层(1:12)= freezeWeights(层(1:12));

列车网络的

创建网络培训选项。设置初始学习率为0.001。在培训期间通过指定验证数据监控网络的准确性。打开训练进度图,并关闭命令窗口输出。

选择= trainingOptions (“个”...“InitialLearnRate”, 0.001,...“ValidationData”{XValidation, YValidation},...“阴谋”“训练进步”...“详细”、假);

使用以下命令创建网络trainNetwork.该命令使用兼容的GPU(如果可用)。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱).否则,trainNetwork使用CPU。

网= trainNetwork (XTrain、YTrain层,选择);

测试网络

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

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

YPred =预测(净,XValidation);

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

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

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

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

predictionError = YValidation - YPred;

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

用力推= 10;numCorrect = sum(abs(predictionError) < thr);numImagesValidation =元素个数(YValidation);= numCorrect / numImagesValidation准确性
精度= 0.7532

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

rmse =√意味着(predictionError ^ 2))
rmse =9.0270

正确的数字旋转

您可以使用图像处理工具箱中的函数来调整数字并将它们一起显示。旋转49个样本数字根据他们的预测旋转角度使用imrotate(图像处理工具箱)。

idx = randperm (numImagesValidation, 49);i = 1:numel(idx) i = XValidation(:,:,:,idx(i));Y = YPred (idx (i));XValidationCorrected (::,:, i) = imrotate (Y,我“双三次的”“作物”);结束

显示原始数字及其校正旋转。使用蒙太奇(图像处理工具箱)以在单一图像中同时显示数字。

figure subplot(1,2,1) montage(XValidation(:,:,:,idx)) title(“原始”)子情节(1,2,2)蒙太奇(XValidationCorrected)标题(“纠正”

另请参阅

|

相关的话题