主要内容

定义自定义回归输出层

提示

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

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

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

  1. 给图层命名-给图层命名以便在MATLAB中使用®

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

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

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

  5. 创建反向损失函数(可选)——指定损失相对于预测的导数。如果没有指定向后丢失函数,则向前丢失函数必须支持dlarray对象。

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

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。%层构造函数在这里。结束函数损失= forwardLoss(层,Y, T)返回预测Y和训练之间的损失。%的目标T。%的输入:% layer -输出层% Y -由网络做出的预测训练目标%输出:%损失- Y和T之间的损失%层正向损失函数在这里。结束函数dLdY = backwardLoss(层,Y, T)%(可选)反向传播损失的导数%的功能。%的输入:% layer -输出层% Y -由网络做出的预测训练目标%输出:% dLdY -损失对的导数%预测Y%层向后损失函数在这里。结束结束结束

命名图层并指定超类

首先,给图层起一个名字。在类文件的第一行中,替换现有的名称myRegressionLayermaeRegressionLayer.因为该层支持加速,所以还包括nnet.layer.Acceleratablemixin。有关自定义层加速的更多信息,请参见自定义层函数加速

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

接下来,重命名myRegressionLayer构造函数的第一个函数方法Section),这样它就有了与图层相同的名称。

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

保存层

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

声明层属性

中声明层属性属性部分。

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

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

  • 描述-层的一行描述,指定为字符向量或字符串标量。当该层显示在数组中。如果不指定层描述,则显示该软件“分类输出”“回归输出”

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

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

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

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

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

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

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

创建构造函数

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

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

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

初始化层属性

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

给图层一个单行描述描述层的属性。设置的名字属性设置为输入参数的名字.设置描述来描述层的类型和大小。

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

创建前向丢失函数

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

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

回归的任务 输入的大小 观察维度
二维图像回归 1-by-1-by -R——- - - - - -N,在那里R回复的数量和N观察的次数是多少 4
二维Image-to-image回归 h——- - - - - -w——- - - - - -c——- - - - - -N,在那里hw,c输出的高度、宽度和通道数是否分别为N观察的次数是多少 4
三维图像回归 1-by-1-by-1-by -R——- - - - - -N,在那里R回复的数量和N观察的次数是多少 5
3 d Image-to-image回归 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的4-D数组。

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

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

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

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

输入Y而且T对应于Y而且T分别在方程中。输出损失对应于l.以确保损失是标量,输出小批的平均损失。在函数的顶部添加注释,解释函数的语法。

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

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

完成一层

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

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

GPU的兼容性

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

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

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

检查输出层有效性

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

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

层= 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.21734秒。

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

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

您可以以与“深度学习工具箱”中任何其他输出层相同的方式使用自定义输出层。本节展示如何使用前面创建的自定义输出层创建和训练回归网络。

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

加载示例训练数据。

[XTrain ~, TTrain] = digitTrain4DArrayData;

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

layers = [imageInputLayer([28 28 1]) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(1) maeRegressionLayer(“美”)]
2”二维卷积20 5x5卷积与步幅[1 1]和填充[0 0 0 0]3”批处理归一化批处理归一化4”ReLU ReLU 5”全连接1全连接层6 'mae'回归输出平均绝对误差

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

选择= trainingOptions (“个”);网= trainNetwork (XTrain、TTrain层,选择);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | RMSE | |率损失  | |========================================================================================| | 1 | 1 |就是| 28.28 | 25.1 | 0.0100 | | 2 | 50 | 00:00:04 | 14.99 | 11.9 | 0.0100 | | 3 | 100 | 00:00:08 | 13.86 | 11.0 | 0.0100 | | 150 | | 00:00:11 | 10.94 | 8.8 | 0.0100 | | 6 | 200 |00:00:15 | 10.08 | 7.8 | 0.0100 | | 250 | | 00:00:19 | 10.81 | 8.0 | 0.0100 | | 300 | | 00:00:22 | 9.94 | 7.7 | 0.0100 | | 350 | | 00:00:25 | 9.57 | 7.3 | 0.0100 | | 400 | | 00:00:29 | 10.77 | 7.9 | 0.0100 | | 450 | | 00:00:33 | 8.88 | 6.9 | 0.0100 | | 500 | | 00:00:36 | 9.42 | 6.4 | 0.0100 | | 550 | | 00:00:40 | 10.06 | 7.5 | 0.0100 | | 16 | 600 | 00:00:44 | 8.67 | 6.1 | 0.0100 | | 650 | | 00:00:47 | 7.72 | 5.7 | 0.0100 | | 700 | | 00:00:51 | 8.69 | 6.7 | 0.0100 | | 20 |750 | 00:00:55 | 7.34 | 5.7 | 0.0100 | | 21 | 800 | 00:00:58 | 8.78 | 6.5 | 0.0100 | | 22 | 850 | 00:01:02 | 7.72 | 6.1 | 0.0100 | | 24 | 900 | 00:01:06 | 7.95 | 5.9 | 0.0100 | | 25 | 950 | 00:01:09 | 6.91 | 4.9 | 0.0100 | | 26 | 1000 | 00:01:13 | 7.60 | 5.4 | 0.0100 | | 27 | 1050 | 00:01:18 | 6.81 | 4.9 | 0.0100 | | 29 | 1100 | 00:01:22 | 7.93 | 6.3 | 0.0100 | | 30 | 1150 | 00:01:26 | 6.49 | 4.7 | 0.0100 | | 30 | 1170 | 00:01:27 | 7.18 | 5.7 | 0.0100 | |========================================================================================| Training finished: Max epochs completed.

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

[XTest, ~, tt) = digitTest4DArrayData;YPred =预测(净,XTest);predictionError = TTest - YPred;

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

用力推= 10;numright = sum(abs(predictionError) < thr);numTestImages =大小(XTest 4);= numCorrect / numTestImages准确性
精度= 0.7742

另请参阅

|||||

相关的话题

Baidu
map