主要内容

定义自定义回归输出层

提示

要创建具有均方误差损失的回归输出层,请使用regressionLayer.如果您想为您的回归问题使用不同的损失函数,那么您可以使用这个示例作为指导定义一个自定义回归输出层。

这个例子展示了如何创建具有平均绝对误差(MAE)损失的自定义回归输出层。

要定义自定义回归输出层,您可以使用本例中提供的模板,该模板将带您完成以下步骤:

  1. 命名层-给层一个名称,以便它可以在MATLAB中使用®

  2. 声明层属性-指定层的属性。

  3. 创建一个构造函数(可选)-指定如何构造层并初始化其属性。如果没有指定构造函数,则软件将使用在创建。

  4. 创建一个正向损失函数——指定预测和训练目标之间的损失。

  5. 创建反向损失函数(可选)-指定损失相对于预测的导数。如果没有指定反向损失函数,则正向损失函数必须支持金宝appdlarray对象。

回归MAE层计算回归问题的平均绝对误差损失。MAE损失是两个连续随机变量之间的误差度量。为预测Y以及培训目标T, MAE之间的损失YT是由

l 1 N n 1 N 1 R 1 R | Y n T n |

在哪里N观察的次数和R是响应的数量。

回归输出层模板

将回归输出层模板复制到MATLAB中的新文件中。该模板概述了回归输出层的结构,并包括定义层行为的函数。

classdefmyRegressionLayer < nnet.layer.RegressionLayer%……& nnet.layer.Acceleratable %(可选)属性%(可选)图层属性。图层属性在这里。结束方法函数图层= myRegressionLayer()(可选)创建一个myRegressionLayer。%层构造函数在这里。结束函数损失(层,Y,T)返回预测Y和训练之间的损失%目标T。%的输入:% layer -输出层% Y -网络预测培训目标%输出:%损失- Y和T之间的损失%层正向损失函数在这里。结束函数dLdY = backwardLoss(layer,Y,T)%(可选)反向传播损失的导数%的功能。%的输入:% layer -输出层% Y -网络预测培训目标%输出:% dLdY -损失对%预测Y%层反向损失函数在这里。结束结束结束

命名层并指定超类

首先,给图层起一个名字。在类文件的第一行中,替换现有的名称myRegressionLayermaeRegressionLayer.因为层支持加速,也包括金宝appnnet.layer.Acceleratablemixin。有关自定义层加速的详细信息,请参见自定义层函数加速

classdefmaeRegressionLayer < nnet.layer.RegressionLayer...& nnet.layer.Acceleratable...结束

接下来,重命名myRegressionLayer构造函数中的第一个函数方法Section),使其具有与层相同的名称。

方法函数层= maeRegressionLayer()…结束...结束

保存图层

保存层类文件在一个新的文件名为maeRegressionLayer.m.文件名必须与层名匹配。要使用该层,必须将文件保存在当前文件夹或MATLAB路径下的文件夹中。

声明图层属性

属性中声明层属性属性部分。

默认情况下,自定义输出层具有以下属性:

  • 名字- - - - - -层名,指定为字符向量或字符串标量。为数组输入时,trainNetworkassembleNetworklayerGraph,dlnetwork函数自动为具有该名称的层分配名称

  • 描述-层的单行描述,指定为字符向量或字符串标量。控件中显示该层时,将显示此描述数组中。如果您没有指定层描述,那么软件将显示“分类输出”“回归输出”

  • 类型-层的类型,指定为字符向量或字符串标量。的价值类型控件中显示该层时显示数组中。如果您没有指定层类型,那么软件将显示层类名称。

自定义分类层还具有以下属性:

  • - - - - - -类的输出层,指定为分类向量、字符串数组、单元格字符向量数组或“汽车”.如果“汽车”,然后软件在训练时间自动设置课程。如果指定字符向量的字符串数组或单元格数组str,则软件将输出层的类设置为分类(str, str)

自定义回归层也有以下属性:

  • ResponseNames- - - - - -响应的名称,指定字符向量的单元格数组或字符串数组。在训练时,软件根据训练数据自动设置响应名称。默认为{}

如果该层没有其他属性,则可以省略属性部分。

该层不需要任何附加属性,因此可以删除属性部分。

创建构造函数

创建构造层和初始化层属性的函数。指定创建该层所需的任何变量作为构造函数的输入。

初始化名字属性时,指定输入参数名字.在函数的顶部添加注释,解释函数的语法。

函数层= maeRegressionLayer(name)% layer = maeRegressionLayer(name)创建一个% mean-absolute-error回归层,并指定该层%的名字。...结束

初始化图层属性

替换注释%层构造函数在这里使用初始化层属性的代码。

属性为该层提供一行描述描述层的属性。设置名字属性设置为输入参数名字.设置描述描述层的类型和它的大小。

函数层= maeRegressionLayer(name)% layer = maeRegressionLayer(name)创建一个% mean-absolute-error回归层,并指定该层%的名字。设置层名。层。名字=名字;设置层描述。层。描述=“平均绝对误差”结束

创建正向损失函数

创建一个名为forwardLoss返回网络预测和训练目标之间的MAE损失。的语法forwardLoss损失(层,Y, T),在那里Y是前一层的输出和T包含培训目标。

对于回归问题,的维数T也取决于问题的类型。

回归的任务 输入的大小 观察维度
二维图像回归 1-by-1-by -R——- - - - - -N,在那里R回复的数量和N是观测的数量 4
二维图像到图像回归 h——- - - - - -w——- - - - - -c——- - - - - -N,在那里hw,c输出的高度、宽度和通道数分别为和N是观测的数量 4
三维图像回归 1-by-1-by-1-by -R——- - - - - -N,在那里R回复的数量和N是观测的数量 5
三维图像到图像回归 h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N,在那里hwd,c输出的高度、宽度、深度和通道数分别为和N是观测的数量 5
Sequence-to-one回归 R——- - - - - -N,在那里R回复的数量和N是观测的数量 2
Sequence-to-sequence回归 R——- - - - - -N——- - - - - -年代,在那里R是响应的数量,N是观察数,和年代是序列长度 2

例如,如果网络定义了一个具有一个响应的图像回归网络,并且具有大小为50的小批,则T是一个大小为1 × 1 × 1 × 50的四维数组。

的大小Y取决于前一层的输出。为了确保Y尺寸和T,必须在输出层之前包含一个输出正确大小的层。例如,对于图像回归用R响应,确保Y是一个4-D数组的正确大小,你可以包括一个全连接层的大小R在输出层之前。

回归MAE层计算回归问题的平均绝对误差损失。MAE损失是两个连续随机变量之间的误差度量。为预测Y以及培训目标T, MAE之间的损失YT是由

l 1 N n 1 N 1 R 1 R | Y n T n |

在哪里N观察的次数和R是响应的数量。

输入YT对应于YT分别在方程中。输出损失对应于l.为了确保损失为标量,输出小批上的平均损耗。在函数的顶部添加注释,解释函数的语法。

函数损失(层,Y, T)% loss = forwardLoss(layer, Y, T)返回之间的MAE损失预测Y和训练目标T。计算MAE。R = size(Y,3);meanAbsoluteError = sum(abs(Y-T),3)/R;对小批量取平均值。N = size(Y,4);loss = sum(meanAbsoluteError)/N;结束

因为forwardLoss函数只使用支持的函数金宝appdlarray对象,定义backwardLoss功能是可选的。获取支持的函数列表金宝appdlarray对象,看到支持dlarray的函数列表金宝app

完成一层

查看已完成的回归输出层类文件。

classdefmaeRegressionLayer < nnet.layer.RegressionLayer…& nnet.layer.Acceleratable示例自定义回归层,具有平均绝对误差损失。方法函数层= maeRegressionLayer(name)% layer = maeRegressionLayer(name)创建一个% mean-absolute-error回归层,并指定该层%的名字。设置层名。层。名字=名字;设置层描述。层。描述=“平均绝对误差”结束函数损失(层,Y, T)% loss = forwardLoss(layer, Y, T)返回之间的MAE损失预测Y和训练目标T。计算MAE。R = size(Y,3);meanAbsoluteError = sum(abs(Y-T),3)/R;对小批量取平均值。N = size(Y,4);loss = sum(meanAbsoluteError)/N;结束结束结束

GPU的兼容性

如果层转发功能完全支持金宝appdlarray对象,那么该层是GPU兼容的。否则,为了与GPU兼容,层函数必须支持类型的输入和返回输出金宝appgpuArray(并行计算工具箱)

许多MATLAB内置函数支持金宝appgpuArray(并行计算工具箱)dlarray输入参数。获取支持的函数列表金宝appdlarray对象,看到支持dlarray的函数列表金宝app.有关在GPU上执行的函数的列表,请参见在图形处理器上运行MATLAB函数(并行计算工具箱)要使用GPU进行深度学习,还必须有支持GPU的设备。金宝app有关受支持设备的信息,请参见金宝appGPU计算要求(并行计算工具箱)有关在MATLAB中使用gpu的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱)

所使用的MATLAB函数forwardLossmaeRegressionLayer所有的支金宝app持dlarray对象,所以该层是GPU兼容的。

检查输出层有效性

检查自定义分类输出层的层有效性maeRegressionLayer

创建该层的一个实例maeRegressionLayer,作为支持文件附在本例中。金宝app

层= maeRegressionLayer(“美”);

检查该层是否有效使用checkLayer.将有效的输入大小指定为该层的典型输入的单个观察值的大小。这个层需要一个1 × 1 × r × -N数组输入,其中R是响应的数量,和N是小批中的观察数。

validInputSize = [1 1 10];validInputSize checkLayer(层,“ObservationDimension”4);
跳过GPU测试。没有找到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定'CheckCodegenCompatibility'和'ObservationDimension'选项。运行nnet.checklayer.TestOutputLayerWithoutBackward ........完成nnet.checklayer.TestOutputLayerWithoutBackward __________测试总结:8通过,0失败,0不完整,2跳过。时间流逝:0.14431秒。

测试摘要报告通过、失败、不完整和跳过测试的数量。

在网络中包括自定义回归输出层

您可以像使用深度学习工具箱中的任何其他输出层一样使用自定义输出层。本节展示如何使用前面创建的自定义输出层创建和训练用于回归的网络。

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

加载示例训练数据。

[XTrain,~,TTrain] = digitTrain4DArrayData;

创建一个包含回归输出层的层数组maeRegressionLayer

layers = [imageInputLayer([28 28 1]) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(1) maeRegressionLayer(“美”)]
2 "二维卷积20个5x5卷积,带stride[1 1]和padding[0 0 0 0 0] 3 "批量归一化批量归一化4 " ReLU ReLU 5 "全连接1全连接层6 'mae'回归输出平均绝对误差

设置训练选项,训练网络。

选项= trainingOptions(“个”);net = trainNetwork(XTrain,TTrain,图层,选项);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | RMSE | |率损失  | |========================================================================================| | 1 | 1 |就是| 28.28 | 25.1 | 0.0100 | | 2 | 50 | 00:00:03 | 15.69 | 12.5 | 0.0100 | | 3 | 100 | 00:00:06 | 12.48 | 9.8 | 0.0100 | | 150 | | 00:00:10 | 10.13 | 7.7 | 0.0100 | | 6 | 200 |00:00:13 | 9.96 | 7.7 | 0.0100 | | 250 | | 00:00:16 | 10.48 | 7.8 | 0.0100 | | 300 | | 00:00:20 | 10.18 | 8.2 | 0.0100 | | 350 | | 00:00:23 | 8.55 | 6.5 | 0.0100 | | 400 | | 00:00:26 | 9.77 | 7.3 | 0.0100 | | 450 | | 00:00:29 | 8.54 | 6.3 | 0.0100 | | 500 | | 00:00:33 | 10.20 | 6.9 | 0.0100 | | 550 | | 00:00:36 | 9.37 | 6.9 | 0.0100 | | 16 | 600 | 00:00:39 | 8.98 | 6.6 | 0.0100 | | 650 | | 00:00:42 | 8.42 | 6.3 | 0.0100 | | 700 | | 00:00:45 | 8.17 | 6.1 | 0.0100 | | 20 |750 | 00:00:48 | 7.18 | 5.3 | 0.0100 | | 21 | 800 | 00:00:52 | 8.02 | 5.9 | 0.0100 | | 22 | 850 | 00:00:55 | 7.13 | 5.7 | 0.0100 | | 24 | 900 | 00:00:59 | 7.40 | 5.2 | 0.0100 | | 25 | 950 | 00:01:02 | 7.56 | 5.9 | 0.0100 | | 26 | 1000 | 00:01:05 | 8.68 | 6.5 | 0.0100 | | 1050 | | 27 00:01:10 | 7.18 | 5.4 | 0.0100 | | 1100 | | 29日00:01:14 | 7.53 | 5.7 | 0.0100 | | 1150 | | 00:01:17 | 6.60 | 4.7 | 0.0100 | | 1170 | | 00:01:19 | 6.55 | 4.9 | 0.0100 ||========================================================================================| 培训完成:马克思时代完成。

通过计算预测旋转角度与实际旋转角度之间的预测误差来评估网络性能。

[XTest,~,TTest] = digitTest4DArrayData;YPred = predict(net,XTest);predictionError = TTest - YPred;

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

THR = 10;numCorrect = sum(abs(predictionError) < thr);numTestImages = size(XTest,4);accuracy = numCorrect/numTestImages
准确度= 0.7830

另请参阅

|||||

相关的话题