主要内容

定义自定义分类输出层

提示

构造具有交叉熵损失的分类输出层k互斥类,使用classificationLayer.如果您想对您的分类问题使用不同的损失函数,那么您可以使用这个示例作为指导定义一个自定义分类输出层。

这个例子展示了如何定义具有平方和误差(SSE)损失的自定义分类输出层,并将其用于卷积神经网络。

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

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

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

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

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

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

分类SSE层计算分类问题的平方和误差损失。SSE是两个连续随机变量之间的误差度量。为预测Y以及培训目标T, SSE损失之间Y而且T是由

l 1 N n 1 N 1 K Y n T n 2

在哪里N观察的次数和K是类的数量。

分类输出层模板

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

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

命名图层

首先,给图层起一个名字。在类文件的第一行中,替换现有的名称myClassificationLayersseClassificationLayer

classdefssecassificationlayer < nnet.layer.ClassificationLayer...结束

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

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

保存图层

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

声明图层属性

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

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

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

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

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

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

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

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

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

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

在本例中,该层不需要任何其他属性,因此可以删除属性部分。

创建构造函数

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

指定输入参数的名字分配给的名字属性在创建时。在函数的顶部添加注释,解释函数的语法。

函数layer = ssecassificationlayer (name)% layer = ssecassificationlayer (name)创建一个平方和%错误分类层,并指定层名。...结束

初始化图层属性

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

属性为该层提供一行描述描述层的属性。设置的名字属性设置为输入参数的名字

函数layer = ssecassificationlayer (name)% layer = ssecassificationlayer (name)创建一个平方和%错误分类层,并指定层名。设置层名。层。的名字=的名字;设置层描述。层。描述=平方和误差结束

创建正向损失函数

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

对于分类问题,的维度T取决于问题的类型。

分类任务 输入的大小 观察维度
二维图像分类 1-by-1-by -K——- - - - - -N,在那里K是班级的数量和N是观测的数量。 4
三维图像分类 1-by-1-by-1-by -K——- - - - - -N,在那里K是班级的数量和N是观测的数量。 5
Sequence-to-label分类 K——- - - - - -N,在那里K是班级的数量和N是观测的数量。 2
Sequence-to-sequence分类 K——- - - - - -N——- - - - - -年代,在那里K是类的数量,N是观察数,和年代是序列长度。 2

的大小Y取决于前一层的输出。为了确保Y尺寸和T,必须在输出层之前包含一个输出正确大小的层。例如,确保Y是预测分数的4-D数组K类,可以包含大小完全连接的层K在输出层之前再加一个softmax层。

分类SSE层计算分类问题的平方和误差损失。SSE是两个连续随机变量之间的误差度量。为预测Y以及培训目标T, SSE损失之间Y而且T是由

l 1 N n 1 N 1 K Y n T n 2

在哪里N观察的次数和K是类的数量。

输入Y而且T对应于Y而且T分别在方程中。输出损失对应于l.在函数的顶部添加注释,解释函数的语法。

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

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

完成一层

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

classdefssecassificationlayer < nnet.layer.ClassificationLayer示例自定义分类层的平方和误差损失。方法函数layer = ssecassificationlayer (name)% layer = ssecassificationlayer (name)创建一个平方和%错误分类层,并指定层名。设置层名。层。的名字=的名字;设置层描述。层。描述=平方和误差结束函数损失(层,Y, T)% loss = forwardLoss(layer, Y, T)返回之间的SSE损失预测Y和训练目标T。计算平方和。sumSquares = sum((Y-T).^2);对小批量取平均值。N = size(Y,4);损失= sum(sumSquares)/N;结束结束结束

GPU的兼容性

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

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

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

检查输出层有效性

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

定义一个自定义平方和错误分类层。要创建这个图层,保存文件sseClassificationLayer.m在当前文件夹中。创建该层的一个实例。

层= ssecassificationlayer (上交所的);

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

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

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

在网络中包含自定义分类输出层

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

加载示例训练数据。

[XTrain,YTrain] = digitTrain4DArrayData;

定义一个自定义平方和错误分类层。要创建这个图层,保存文件sseClassificationLayer.m在当前文件夹中。创建该层的一个实例。创建一个包含自定义分类输出层的层数组sseClassificationLayer

layers = [imageInputLayer([28 28 1]) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer ssecassificationlayer (上交所的)]
2 " Convolution 20 5x5 convolutions with stride [1 1] and padding [0 0 0 0 0] 3 " Batch normalization Batch normalization 4 " ReLU ReLU 5 " Fully Connected 10 Fully Connected Layer 6 " Softmax Softmax 7 'sse' Classification Output平方和误差

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

选项= trainingOptions(“个”);net = trainNetwork(XTrain,YTrain,图层,选项);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |丧失准确性  | |========================================================================================| | 1 | 1 |就是9.38% | | 0.9944 | 0.0100 | | 2 | 50 | 00:00:06 | 74.22% | 0.3542 | 0.0100 | | 3 | 100 | 00:00:11 | 92.97% | 0.1303 | 0.0100 | | 150 | | 00:00:16 | 96.09% | 0.0956 | 0.0100 ||6 | 200 | 00:00:21 | 95.31% | 0.0748 | 0.0100 | | 7 | 250 | 00:00:26 | 97.66% | 0.0459 | 0.0100 | | 8 | 300 | 00:00:31 | 99.22% | 0.0203 | 0.0100 | | 9 | 350 | 00:00:37 | 99.22% | 0.0259 | 0.0100 | | 11 | 400 | 00:00:42 | 100.00% | 0.0071 | 0.0100 | | 12 | 450 | 00:00:47 | 100.00% | 0.0050 | 0.0100 | | 13 | 500 | 00:00:53 | 100.00% | 0.0100 | 0.0100 | | 15 | 550 | 00:01:00 | 100.00% | 0.0058 | 0.0100 | | 16 | 600 | 00:01:06 | 100.00% | 0.0019 | 0.0100 | | 17 | 650 | 00:01:11 | 100.00% | 0.0039 | 0.0100 | | 18 | 700 | 00:01:17 | 100.00% | 0.0023 | 0.0100 | | 20 | 750 | 00:01:24 | 100.00% | 0.0024 | 0.0100 | | 21 | 800 | 00:01:28 | 100.00% | 0.0019 | 0.0100 | | 22 | 850 | 00:01:33 | 100.00% | 0.0017 | 0.0100 | | 24 | 900 | 00:01:37 | 100.00% | 0.0020 | 0.0100 | | 25 | 950 | 00:01:42 | 100.00% | 0.0012 | 0.0100 | | 26 | 1000 | 00:01:48 | 100.00% | 0.0011 | 0.0100 | | 27 | 1050 | 00:01:55 | 99.22% | 0.0104 | 0.0100 | | 29 | 1100 | 00:02:02 | 100.00% | 0.0013 | 0.0100 | | 30 | 1150 | 00:02:08 | 100.00% | 0.0012 | 0.0100 | | 30 | 1170 | 00:02:10 | 99.22% | 0.0088 | 0.0100 | |========================================================================================| Training finished: Max epochs completed.

通过对新数据进行预测并计算精度来评估网络性能。

[XTest,YTest] = digitTest4DArrayData;YPred = category (net, XTest);accuracy = mean(YTest == YPred)
准确度= 0.9842

另请参阅

|||||

相关的话题