主要内容

定义自定义回归输出层

提示

创建具有均方误差损耗的回归输出层,使用海退层.如果要为回归问题使用不同的丢失函数,则可以使用此示例定义自定义回归输出层作为指南。

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

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

  1. 命名层–为层命名,以便在MATLAB中使用®

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

  3. 创建构造函数(可选) - 指定如何构建图层并初始化其属性。如果未指定构造函数,则软件将初始化属性''在创建。

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

  5. 创建向后损失函数(可选)-指定损失相对于预测的导数。如果不指定向后损失函数,则向前损失函数必须支持万博1manbetxdlarray物体。

回归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性质%(可选)图层属性。%图层属性在此处进行。终止方法作用tillay = myregressionlayer()%(可选)创建myRegressionLayer。%层构造函数在这里。终止作用丢失=转发器(图层,y,t)%返回预测Y和训练之间的损失%的目标T。%的输入:%层-输出层% Y -网络预测% T -训练目标%输出:% loss - Y和T之间的损失%层前向损耗函数进入。终止作用dLdY = backwardLoss(layer, Y, T)%(可选)反向传播损失的导数% 功能。%的输入:%层-输出层% Y -网络预测% T -训练目标%输出:%dLdY-损失对资产的导数%预测Y%层向后损失功能在这里。终止终止终止

命名图层

首先,为图层命名。在类文件的第一行中,替换现有名称myRegressionLayer具有海退层

classdefmaeRegressionLayer < nnet.layer.RegressionLayer...终止

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

方法作用layer = maeRegressionLayer()…终止...终止

保存层

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

声明层属性

在中声明图层特性性质部分

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

  • 的名字-层名,指定为字符向量或字符串标量。若要在层图中包含层,必须指定非空的唯一层名。如果你用层和的名字被设置为'',则软件会在训练时自动为图层指定名称。

  • 描述- 图层的单​​行描述,指定为字符向量或字符串标量。当图层以a中显示时,会出现此说明大堆如果未指定图层描述,则软件将显示“分类输出”“回归输出”

  • 类型-层的类型,指定为字符向量或字符串标量。的价值类型当图层显示在一个中时出现大批。如果未指定图层类型,则软件显示图层类名。

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

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

自定义回归图层还具有以下属性:

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

如果图层没有其他特性,则可以忽略性质部分

该图层不需要任何其他属性,因此您可以删除性质部分

创建构造函数

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

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

作用层= maeRegressionLayer(名称)% layer = maeRegressionLayer(name)创建%平均绝对误差回归图层并指定图层%名字。...终止

初始化图层特性

取代的评论%层构造函数在这里使用初始化层属性的代码。

给层一个单行描述通过设置描述层的属性。设定的名字属性设置为输入参数的名字. 设置描述以描述图层的类型及其大小。

作用层= maeRegressionLayer(名称)% layer = maeRegressionLayer(name)创建%平均绝对误差回归图层并指定图层%名字。%设置图层名称。层。的名字=的名字;%设置图层描述。图层.说明=的平均绝对误差;终止

创建前向损失函数

创建名为的函数正向损耗返回网络和培训目标的预测之间的MAE损失。语法正向损耗丢失=转发器(图层,y,t),在那里y前一层的输出是和吗T.包含培训目标。

对于回归问题,尺寸T.也取决于问题的类型。

回归任务 输入的大小 观察维度
2-D图像回归 1-by-1-by -R.——- - - - - -N,在那里R.是响应和响应的数量N为观察次数。 4.
2-D图像到图像回归 H——- - - - - -W.——- - - - - -C——- - - - - -N,在那里HW.C输出通道的高度、宽度和数量分别是N为观察次数。 4.
三维图像回归 1-by-1-1-by-R.——- - - - - -N,在那里R.是响应和响应的数量N为观察次数。 5.
三维图像间回归 H——- - - - - -W.——- - - - - -D.——- - - - - -C——- - - - - -N,在那里HW.D.C输出的高度、宽度、深度和通道数分别是N为观察次数。 5.
序列到一个回归 R.——- - - - - -N,在那里R.是响应和响应的数量N为观察次数。 2
序列间回归 R.——- - - - - -N——- - - - - -S.,在那里R.是响应的数量,N是观察的次数,和S.是序列长度。 2

例如,如果网络定义了一个只有一个响应的图像回归网络,并且有大小为50的小批量,那么T.是一个大小为1×1×1×50的4-D阵列。

的大小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)%损失=转发器(图层,y,t)返回之间的MAE损失%预测y和训练目标t。%计算MAE。R =大小(Y, 3);meanAbsoluteError =总和(abs (y - t), 3) / R;%呈迷你批次。N =大小(Y, 4);损失= (meanAbsoluteError) / N;终止

因为正向损耗函数只使用支持的函数万博1manbetxdlarray对象,定义backwardLoss函数是可选的。获取支持的函数列表万博1manbetxdlarray对象,看到支持dlarray的函数列表万博1manbetx

完成一层

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

classdefmaeRegressionLayer < nnet.layer.RegressionLayer%具有平均绝对误差损失的自定义回归层示例。方法作用层= maeRegressionLayer(名称)% layer = maeRegressionLayer(name)创建%平均绝对误差回归图层并指定图层%名字。%设置图层名称。层。的名字=的名字;%设置图层描述。图层.说明=的平均绝对误差;终止作用丢失=转发器(图层,y,t)%损失=转发器(图层,y,t)返回之间的MAE损失%预测y和训练目标t。%计算MAE。R =大小(Y, 3);meanAbsoluteError =总和(abs (y - t), 3) / R;%呈迷你批次。N =大小(Y, 4);损失= (meanAbsoluteError) / N;终止终止终止

GPU兼容性

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

许多MATLAB内置功能支持万博1manbetxgpuArray(并行计算工具箱)dlarray输入参数。获取支持的函数列表万博1manbetxdlarray对象,看到支持dlarray的函数列表万博1manbetx.有关在GPU上执行的函数列表,请参见在GPU上运行matlab函数(并行计算工具箱)要使用GPU进行深度学习,您还必须具有支持的GPU设备。万博1manbetx有关支持设备的信息,请参阅万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱)有关在MATLAB中使用GPU的更多信息,请参见GPU计算在Matlab中(并行计算工具箱)

所用的MATLAB函数正向损耗在里面海退层所有支持万博1manbetxdlarray对象,所以该层是GPU兼容的。

检查输出层的有效性

检查自定义分类输出层的图层有效性海退层

定义一个自定义的平均绝对误差回归层。要创建这个图层,保存文件maeRegressionLayer.m在当前文件夹中。创建图层的实例。

层= maeRegressionLayer (“美”);

检查图层是否有效检查层.将有效输入大小指定为对层的典型输入的单个观察的大小。这层需要一个1 × 1 × r × -N数组输入,其中R是响应数,以及N是小批次中的观察数。

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

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

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

您可以使用自定义输出层,其方式与深度学习工具箱中的任何其他输出层相同。本节介绍如何使用先前创建的自定义输出层创建和训练网络进行回归。

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

加载示例训练数据。

[XTrain ~, YTrain] = digitTrain4DArrayData;

创建包含回归输出层的层阵列海退层

layers=[imageInputLayer([28 28 1])卷积2dLayer(5,20)批规格化层reluLayer fullyConnectedLayer(1)回归层(“美”)]
layers=6x1层阵列,带层:1''图像输入28x28x1图像,带“零中心”标准化2''卷积20 5x5卷积,带跨距[1]和填充[0 0 0 0 0 0]3''批量标准化批量标准化4''ReLU ReLU 5''完全连接1完全连接层6“mae”回归输出平均绝对误差

设置培训选项并培训网络。

选项=培训选项(“个”); net=列车网络(XTrain、YTrain、图层、选项);
单CPU培训。初始化输入数据归一化。| ========================================================================================|时代|迭代|经过时间的时间迷你批量|迷你批量|基础学习| | | | (hh:mm:ss) | RMSE | Loss | Rate | |========================================================================================| | 1 | 1 | 00:00:00 | 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 | | 4 | 150 | 00:00:12 | 10.07 | 7.7 | 0.0100 | | 6 | 200 | 00:00:15 | 9.81 | 7.5 | 0.0100 | | 7 | 250 | 00:00:18 | 10.20 | 7.5 | 0.0100 | | 8 | 300 | 00:00:22 | 9.57 | 7.2 | 0.0100 | | 9 | 350 | 00:00:25 | 8.61 | 6.5 | 0.0100 | | 11 | 400 | 00:00:28 | 9.45 | 6.8 | 0.0100 | | 12 | 450 | 00:00:33 | 8.26 | 6.0 | 0.0100 | | 13 | 500 | 00:00:37 | 9.51 | 6.1 | 0.0100 | | 15 | 550 | 00:00:41 | 10.00 | 7.7 | 0.0100 | | 16 | 600 | 00:00:45 | 8.60 | 6.1 | 0.0100 | | 17 | 650 | 00:00:50 | 7.18 | 5.4 | 0.0100 | | 18 | 700 | 00:00:53 | 8.89 | 6.3 | 0.0100 | | 20 | 750 | 00:00:57 | 7.76 | 5.9 | 0.0100 | | 21 | 800 | 00:01:00 | 8.07 | 6.0 | 0.0100 | | 22 | 850 | 00:01:04 | 7.38 | 5.6 | 0.0100 | | 24 | 900 | 00:01:07 | 7.51 | 5.5 | 0.0100 | | 25 | 950 | 00:01:10 | 6.88 | 4.9 | 0.0100 | | 26 | 1000 | 00:01:13 | 6.83 | 4.7 | 0.0100 | | 27 | 1050 | 00:01:19 | 6.70 | 4.8 | 0.0100 | | 29 | 1100 | 00:01:24 | 6.57 | 4.8 | 0.0100 | | 30 | 1150 | 00:01:28 | 6.87 | 4.9 | 0.0100 | | 30 | 1170 | 00:01:30 | 7.75 | 6.2 | 0.0100 | |========================================================================================|

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

[xtest,〜,ytest] = dimittest4darraydata;ypred =预测(net,xtest);predictionerror = ytest  -  ypred;

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

thr=10;numCorrect=总和(绝对值(预测误差)
              
精度=0.7524

也可以看看

||

相关话题