提示
为了创建一个具有均方误差损失的回归输出层,使用regressionLayer
。如果您想为您的回归问题使用一个不同的损失函数,那么您可以使用这个示例作为指南定义一个自定义的回归输出层。
这个例子展示了如何创建一个带有平均绝对误差损失的自定义回归输出层。
要定义一个自定义回归输出层,你可以使用本例中提供的模板,它带你完成以下步骤:
给图层命名-给图层命名,以便在MATLAB中使用®。
声明层属性-指定层的属性。
创建一个构造函数(可选)-指定如何构造层并初始化其属性。如果没有指定构造函数,则软件将使用”
在创建。
创建一个前向损失函数——指定预测和训练目标之间的损失。
创建一个反向损失函数(可选)-指定损失相对于预测的导数。如果不指定后向丢失功能,则必须支持前向丢失功能金宝appdlarray
对象。
回归MAE层计算回归问题的平均绝对误差损失。MAE损失是两个连续随机变量之间的误差度量。为预测Y和培训目标T, MAE之间的损失Y和T是由
在哪里N观察的数量是多少R是响应的数量。
将回归输出层模板复制到MATLAB中的一个新文件中。该模板概述了回归输出层的结构,并包含了定义层行为的函数。
classdefmyRegressionLayer < nnet.layer.RegressionLayer属性%(可选)图层属性。%图层属性到这里。结束方法函数层= myRegressionLayer ()%(可选)创建myRegressionLayer%层构造函数在这里。结束函数损失=远期损失(层,Y, T)%返回预测Y和训练之间的损失%的目标T。%%的输入:%层-输出层% Y -网络做出的预测% T -训练目标%%输出:y和t之间的损失 - 损失%层正向损耗函数在这里。结束函数dLdY = backwardLoss(layer, Y, T)%(可选)反向传播损失的导数%的功能。%%的输入:%层-输出层% Y -网络做出的预测% T -训练目标%%输出:% dLdY -损失相对于%预测y%层反向损耗函数在这里。结束结束结束
首先,给图层一个名字。在类文件的第一行,替换现有的名称myRegressionLayer
与maeRegressionLayer
。
classdefmaeRightionLayer…结束
接下来,重命名myRegressionLayer
函数的第一个函数方法
section),以使其具有与图层相同的名称。
方法函数图层= maeRegressionLayer()…结束…结束
将层类文件保存到一个名为maeRegressionLayer.m
。文件名必须与层名匹配。要使用图层,必须将文件保存在当前文件夹或MATLAB路径下的文件夹中。
属性中声明层属性属性
部分。
默认情况下,自定义输出层有以下属性:
的名字
- - - - - -层名,指定为字符向量或字符串标量。要在层图中包含层,必须指定一个非空的唯一层名。如果你用层和的名字
被设置为”
,然后软件在培训时自动为该层分配一个名称。
描述
—对层的单行描述,指定为字符向量或字符串标量。当层显示在层
数组中。如果你没有指定一个层描述,然后软件显示“分类输出”
或“回归输出”
。
类型
- 图层的类型,指定为字符向量或字符串标量。的价值类型
当层显示在层
数组中。如果您没有指定层类型,那么软件将显示层类名。
自定义分类层也有以下属性:
类
- - - - - -输出层的类,指定为分类向量、字符串数组、字符向量的单元格数组或“汽车”
。如果类
是“汽车”
,然后软件在训练时间自动设置课程。如果指定字符向量的字符串数组或单元格数组str
,然后软件将输出层的类设置为分类(str, str)
。默认值为“汽车”
。
自定义回归层也有以下属性:
ResponseNames
- - - - - -响应的名称,指定了字符向量或字符串数组的单元格数组。在培训时,软件根据培训数据自动设置响应名称。默认为{}
。
如果该层没有其他属性,那么您可以省略属性
部分。
该层不需要任何额外的属性,所以您可以删除属性
部分。
创建构建图层并初始化图层属性的函数。指定将图层创建为构造函数的输入所需的任何变量。
初始化的名字
属性创建时,指定输入参数的名字
。在函数的顶部添加注释,解释函数的语法。
函数层= maeRegressionLayer(名称)% layer = maeRegressionLayer(name)创建一个% mean-absolute-error回归层并指定该层%的名字。…结束
取代的评论%层构造函数在这里
使用初始化层属性的代码。
通过设置。给层一个单行描述描述
层的属性。设置的名字
属性设置为输入参数的名字
。设置描述来描述图层的类型和大小。
函数层= maeRegressionLayer(名称)% layer = maeRegressionLayer(name)创建一个% mean-absolute-error回归层并指定该层%的名字。%设置图层名称。层。的名字=的名字;%设置图层描述。层。描述=的平均绝对误差;结束
创建一个名为forwardLoss
这就将网络预测和训练目标之间的MAE损失返回。的语法forwardLoss
是损失=远期损失(层,Y, T)
,在那里Y
上一层的输出是和吗T
包含训练目标。
对于回归问题,维度T
也取决于问题的类型。
回归的任务 | 输入的大小 | 观察维度 |
---|---|---|
二维图像回归 | 1-by-1-by -R——- - - - - -N,在那里R回复的数量是多少N为观测值。 | 4 |
二维Image-to-image回归 | h——- - - - - -w——- - - - - -c——- - - - - -N ,在那里h,w,c分别是输出的高度、宽度和通道数,和N为观测值。 |
4 |
三维图像回归 | 1-by-1-by-1-by -R——- - - - - -N,在那里R回复的数量是多少N为观测值。 | 5 |
3 d Image-to-image回归 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N ,在那里h,w,d,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之间的损失Y和T是由
在哪里N观察的数量是多少R是响应的数量。
输入Y
和T
对应于Y和T分别为式中。输出损失
对应于l。以确保损失
为标量,输出小批量的平均损耗。在函数的顶部添加注释,解释函数的语法。
函数损失=远期损失(层,Y, T)% loss = forwardLoss(layer, Y, T)返回之间的MAE loss%预测Y和训练目标T。%计算美。R =大小(Y, 3);meanAbsoluteError =总和(abs (y - t), 3) / R;以平均量代替小批量。N =大小(Y, 4);损失= (meanAbsoluteError) / N;结束
因为forwardLoss
function只使用支持的函数金宝appdlarray
对象,定义backwardLoss
函数是可选的。以获取支持的函数列表金宝appdlarray
对象,参见支持dlarray的函数列表金宝app。
查看完整的回归输出层类文件。
classdefmaeRightionLayer%示例自定义回归层的平均绝对错误损失。方法函数层= maeRegressionLayer(名称)% layer = maeRegressionLayer(name)创建一个% mean-absolute-error回归层并指定该层%的名字。%设置图层名称。层。的名字=的名字;%设置图层描述。层。描述=的平均绝对误差;结束函数损失=远期损失(层,Y, T)% loss = forwardLoss(layer, Y, T)返回之间的MAE loss%预测Y和训练目标T。%计算美。R =大小(Y, 3);meanAbsoluteError =总和(abs (y - t), 3) / R;以平均量代替小批量。N =大小(Y, 4);损失= (meanAbsoluteError) / N;结束结束结束
如果层转发功能完全支持金宝appdlarray
对象,然后该图层是GPU兼容。否则,兼容GPU,图层函数必须支持类型的输入和返回输出金宝appgpuArray
(并行计算工具箱)。
许多MATLAB内置函数支持金宝appgpuArray
(并行计算工具箱)和dlarray
输入参数。以获取支持的函数列表金宝appdlarray
对象,参见支持dlarray的函数列表金宝app。有关在GPU上执行的函数列表,请参阅在GPU上运行MATLAB函数(并行计算工具箱)。为了使用GPU进行深度学习,你还必须拥有CUDA®使英伟达®GPU,计算能力3.0及以上。有关在MATLAB中使用gpu的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱)。
使用的MATLAB功能forwardLoss
在maeRegressionLayer
所有的支金宝app持dlarray
对象,因此该层是GPU兼容的。
检查自定义分类输出层的层有效性maeRegressionLayer
。
定义一个自定义的平均绝对误差回归层。要创建这个图层,保存文件maeRegressionLayer.m
在当前文件夹中。创建该层的实例。
层= maeRegressionLayer ('Mae');
检查图层是否有效checkLayer
。指定有效的输入大小为该层的典型输入的单个观察值的大小。这层应该是1 × 1 × r -N数组输入,其中R是响应的数量,和N为小批观测的个数。
validInputSize = [1 1 10];validInputSize checkLayer(层,“ObservationDimension”4);
跳过GPU测试。找不到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成图层的有效性,请指定“CheckCodeGencompatibility”和“观察Dimension”选项。运行nnet.checklayer.TestOutputLayerWithoutBackward ........ Done Nnet.CheckLayer.TestOutputLayerWithoutBackward __________测试摘要:8传递,0失败,0不完整,2跳。经过时间:0.13529秒。
测试摘要报告通过、失败、未完成和跳过的测试的数量。
您可以像深度学习工具箱中的其他输出层一样使用自定义输出层。本节展示如何使用前面创建的自定义输出层创建和训练回归网络。
该例子构建了一个卷积神经网络体系结构,训练了一个网络,并使用训练的网络来预测旋转的角度,手写数字。这些预测对光学字符识别是有用的。
加载示例培训数据。
[XTrain ~, YTrain] = digitTrain4DArrayData;
创建一个包含回归输出层的层数组maeRegressionLayer
。
[imageInputLayer([28 28 1]) convolution2dLayer(5,20) batchNormalizationLayer relullayer fullconnectedlayer (1) maeRegressionLayer('Mae')]
层= 6 x1层与层:数组1”的形象输入28 x28x1图像zerocenter正常化2”卷积20 5 x5旋转步[1]和填充[0 0 0 0]3“批量标准化批量标准化4”ReLU ReLU 5”完全连接1完全连接层6‘美’回归输出平均绝对误差
设置训练选项,训练网络。
选择= trainingOptions (“个”);网= trainNetwork (XTrain、YTrain层,选择);
单CPU培训。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习 | | | | ( hh: mm: ss) | RMSE | |率损失 | |========================================================================================| | 1 | 1 |就是| 28.28 | 25.1 | 0.0100 | | 2 | 50 | 00:00:04 | 14.27 | 11.3 | 0.0100 | | 3 | 100 | 00:00:08 | 14.30 | 11.5 | 0.0100 | | 150 | | 00:00:12 | 10.07 | 7.7 | 0.0100 | | 6 | 200 |00:00:16 | 9.81 | 7.5 | 0.0100 | | 250 | | 00:00:19 | 10.20 | 7.5 | 0.0100 | | 300 | | 00:00:23 | 9.57 | 7.2 | 0.0100 | | 350 | | 00:00:27 | 8.61 | 6.5 | 0.0100 | | 400 | | 00:00:32 | 9.45 | 6.8 | 0.0100 | | 450 | | 00:00:37 | 8.26 | 6.0 | 0.0100 | | 500 | | 00:00:40 | 9.51 | 6.1 | 0.0100 | | 550 | | 00:00:44 | 10.00 | 7.7 | 0.0100 | | 16 | 600 | 00:00:48 | 8.60 | 6.1 | 0.0100 | | 650 | | 00:00:52 | 7.18 | 5.4 | 0.0100 | | 700 | | 00:00:56 | 8.89 | 6.3 | 0.0100 | | 20 |750 | 00:00:59 | 7.76 | 5.9 | 0.0100 | | 21 | 800 | 00:01:03 | 8.07 | 6.0 | 0.0100 | | 22 | 850 | 00:01:07 | 7.38 | 5.6 | 0.0100 | | 24 | 900 | 00:01:10 | 7.51 | 5.5 | 0.0100 | | 25 | 950 | 00:01:15 | 6.88 | 4.9 | 0.0100 | | 26 | 1000 | 00:01:19 | 6.83 | 4.7 | 0.0100 | | 1050 | | 27 00:01:26 | 6.70 | 4.8 | 0.0100 | | 1100 | | 29日00:01:29 | 6.57 | 4.8 | 0.0100 | | 1150 | | 00:01:35 | 6.87 | 4.9 | 0.0100 | | 1170 | | 00:01:36 | 7.75 | 6.2 | 0.0100 ||========================================================================================|
通过计算预测转角与实际转角之间的预测误差来评估网络性能。
[XTest ~,欧美]= digitTest4DArrayData;YPred =预测(净,XTest);predictionError = YTest - YPred;
从真实角度计算可接受的误差余量内的预测数量。将阈值设置为10度,并计算此阈值内的预测百分比。
用力推= 10;numCorrect = sum(abs(predictionError) < thr);numTestImages =大小(XTest 4);= numCorrect / numTestImages准确性
精度= 0.7524