主要内容

定义自定义分类输出层

提示

构造具有交叉熵损失的分类输出层K互斥类,使用分类层。如果您想对分类问题使用不同的损失函数,则可以使用此示例作为指南定义自定义分类输出层。

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

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

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

  2. 声明图层特性–指定图层的特性。

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

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

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

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

L = 1. N N = 1. N = 1. K ( Y N T N ) 2. ,

在哪里N观察的次数是多少K是班级的数量。

分类输出层模板

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

classdefmyClassificationLayer属性%(可选)图层特性。%图层属性在这里。终止方法函数层= myClassificationLayer ()%(可选)创建myClassificationLayer。%层构造函数在这里。终止函数损耗=正向损耗(层,Y,T)%返回预测Y和训练之间的损失%目标T。%%投入:% layer -输出层%Y–网络做出的预测%T–培训目标%%输出:% loss - Y和T之间的损失%层向前损失函数在这里。终止函数dLdY=后向损失(层,Y,T)%(可选)反向传播损失的导数%功能。%%投入:% layer -输出层%Y–网络做出的预测%T–培训目标%%输出:% dLdY -损失对…的导数%预测Y%层向后损失函数在这里。终止终止终止

层的名字

首先,给图层命名。在类文件的第一行中,替换现有的名称myClassificationLayer具有sseClassificationLayer

classdefsseClassificationLayer < nnet.layer.ClassificationLayer...终止

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

方法函数层=SSeClassionLayer()。。。终止...终止

保存层

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

声明图层特性

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

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

  • 名称图层名称,指定为字符向量或字符串标量。若要在图层图中包含图层,必须指定非空的唯一图层名称。如果您使用层和名称被设置为'',然后软件在训练时自动为该层分配一个名称。

  • 描述–层的一行描述,指定为字符向量或字符串标量。当图层显示在图形中时,将显示此说明数组中。如果您没有指定层描述,则软件显示“分类输出”“回归输出”

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

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

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

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

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

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

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

创建构造函数

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

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

函数层= sseClassificationLayer(名称)%layer=SSeClassionLayer(名称)创建一个平方和%错误分类图层并指定图层名称。...终止

初始化层属性

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

给层一个单行描述通过设置描述属性的层。设置名称属性设置为输入参数名称

函数层= sseClassificationLayer(名称)%layer=SSeClassionLayer(名称)创建一个平方和%错误分类图层并指定图层名称。%设置图层名称。layer.Name=名称;%设置图层描述。层。描述=“平方和误差”;终止

创建前向损失函数

创建一个名为forwardLoss返回网络预测和训练目标之间的SSE损失。的语法forwardLoss损耗=正向损耗(层,Y,T)哪里Y是上一层的输出,并且T代表培训目标。

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

分类任务 输入大小 观察维度
二维图像分类 一乘一乘-K-借-N哪里K是类和类的数量N是观察数。 4.
三维图像分类 一乘一乘一-K-借-N哪里K是类和类的数量N是观察数。 5.
序列到标签分类 K-借-N哪里K是类和类的数量N是观察数。 2.
序列间分类 K-借-N-借-s哪里K是班级的数量,N是观察次数,以及s为序列长度。 2.

大小Y取决于前一层的输出。以确保Y和我的一样大T,则必须在输出层之前包含输出正确大小的层。例如,为了确保Y4-D数组的预测得分是什么K类,您可以包含大小完全连接的层K在输出层之前有一个softmax层。

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

L = 1. N N = 1. N = 1. K ( Y N T N ) 2. ,

在哪里N观察的次数是多少K是班级的数量。

输入YT对应于YT分别在方程中。输出丧失对应于L. 在函数顶部添加注释,解释函数的语法。

函数损耗=正向损耗(层,Y,T)% loss = forwardLoss(layer, Y, T)返回SSE之间的损失%预测Y和训练目标T。%计算平方和。平方和=和((Y-T)。^2;%以小批为例。N=大小(Y,4);损失=总和(平方和)/N;终止

因为forwardLoss函数仅使用支持金宝appdlarray对象,定义后向损失功能是可选的。有关支持的函数的列表金宝appdlarray对象,看到支持dlarray的函数列表金宝app

完成层

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

classdefsseClassificationLayer < nnet.layer.ClassificationLayer%示例自定义分类层的平方和误差损失。方法函数层= sseClassificationLayer(名称)%layer=SSeClassionLayer(名称)创建一个平方和%错误分类图层并指定图层名称。%设置图层名称。layer.Name=名称;%设置图层描述。层。描述=“平方和误差”;终止函数损耗=正向损耗(层,Y,T)% loss = forwardLoss(layer, Y, T)返回SSE之间的损失%预测Y和训练目标T。%计算平方和。平方和=和((Y-T)。^2;%以小批为例。N=大小(Y,4);损失=总和(平方和)/N;终止终止终止

GPU的兼容性

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

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

所用的MATLAB函数forwardLoss全部支持金宝appdlarray对象,因此该层与GPU兼容。

检查输出层有效性

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

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

层= sseClassificationLayer (上交所的);

使用以下命令检查图层是否有效checkLayer。将有效输入大小指定为该层典型输入的单个观测值的大小。该层需要1×1×1-K-借-N数组输入,其中K是类的数量,并且N为小批处理中的观察数。

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

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

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

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

加载示例训练数据。

[XTrain, YTrain] = digitTrain4DArrayData;

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

layers=[imageInputLayer([28 28 1])卷积2dLayer(5,20)批次规格化Layer reluLayer fullyConnectedLayer(10)softmaxLayer SSeClassionLayer(上交所的)]
图层数组:1”的形象输入28 x28x1图像zerocenter正常化2”卷积20 5 x5旋转步[1]和填充[0 0 0 0]3“批量标准化批量标准化4”ReLU ReLU 5“完全连接10完全连接层6”Softmax Softmax 7上交所的分类输出误差平方和

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

选择= trainingOptions (“sgdm”);网= trainNetwork (XTrain、YTrain层,选择);
单CPU培训。初始化输入数据规范化。|===================================================================================================================================================================================================================================================================================================================================================================================================================================================历元|迭代|经过的时间|小批量|小批量|基础学习| | | | | |(hh:mm:ss)第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第二种第第二种第二种第第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四种第四|0.0100 | 3 | 100 | 00:00:08 | 92.97%| 0.1316 | 0.0100 | 4 | 150 | 00:00:11 | 96.88%| 0.0915 1240 1240 | 6 | 200 | 00:00:15 | 95.31%|0.0738 | 0.0100 | | 7 | 250 | 00:00:19 | 96.88% | 0.0485 | 0.0100 | | 8 | 300 | 00:00:24 | 99.22% | 0.0203 | 0.0100 | | 9 | 350 | 00:00:28 | 99.22% | 0.0264 | 0.0100 | | 11 | 400 | 00:00:32 | 100.00% | 0.0069 | 0.0100 | | 12 | 450 | 00:00:40 | 100.00% | 0.0045 | 0.0100 | | 13 | 500 | 00:00:48 | 100.00% | 0.0078 | 0.0100 | | 15 | 550 | 00:00:54 | 100.00% | 0.0059 | 0.0100 | | 16 | 600 | 00:00:57 | 100.00% | 0.0021 | 0.0100 | | 17 | 650 | 00:01:02 | 100.00% | 0.0040 | 0.0100 | | 18 | 700 | 00:01:07 | 100.00% | 0.0024 | 0.0100 | | 20 | 750 | 00:01:11 | 100.00% | 0.0028 | 0.0100 | | 21 | 800 | 00:01:15 | 100.00% | 0.0020 | 0.0100 | | 22 | 850 | 00:01:19 | 100.00% | 0.0017 | 0.0100 | | 24 | 900 | 00:01:22 | 100.00% | 0.0020 | 0.0100 | | 25 | 950 | 00:01:26 | 100.00% | 0.0013 | 0.0100 | | 26 | 1000 | 00:01:30 | 100.00% | 0.0012 | 0.0100 | | 27 | 1050 | 00:01:36 | 99.22% | 0.0104 | 0.0100 | | 29 | 1100 | 00:01:42 | 100.00% | 0.0013 | 0.0100 | | 30 | 1150 | 00:01:48 | 100.00% | 0.0012 | 0.0100 | | 30 | 1170 | 00:01:50 | 99.22% | 0.0077 | 0.0100 | |========================================================================================|

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

[XTest,YTest]=Digittest4ArrayData;YPred=分类(净,XTest);精度=平均值(YTest==YPred)
精度= 0.9844

另见

||

相关的话题