主要内容

定义自定义分类输出层

小费

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

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

要定义自定义分类输出图层,可以使用此示例中提供的模板,这将浏览以下步骤:

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

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

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

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

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

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

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 -网络预测% T -训练目标%输出:% loss - Y和T之间的损失%层前向损耗函数进入。结尾函数dLdY = backwardLoss(layer, Y, T)%(可选)反向传播损失的导数% 功能。%的输入:% layer -输出层% Y -网络预测% T -训练目标%输出:% dLdY -损失对…的导数%预测Y%层向后损失功能在这里。结尾结尾结尾

层的名字

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

classdefsseClassificationLayer < nnet.layer.ClassificationLayer...结尾

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

方法函数tallay = sseclassificationlayer()...结尾...结尾

保存层

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

声明层属性

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

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

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

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

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

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

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

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

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

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

在本例中,该层不需要任何额外的属性,因此您可以删除属性部分。

创建构造函数

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

指定输入参数的名字分配给的名字创作的财产。在函数顶部添加注释,该函数解释了函数的语法。

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

初始化层属性

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

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

函数层= sseClassificationLayer(名称)% layer = ssecsassificationlayer (name)创建一个平方和%错误分类层并指定图层名称。%设置图层名称。层。的名字=的名字;%设置图层描述。层。描述=“方块错误”;结尾

创建前向损失函数

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

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

分类任务 输入的大小 观察维度
二维图像分类 1-by-1-by -K.——- - - - - -N,在那里K.是课程数量和N为观察次数。 4.
三维图像分类 1-by-1-1-by-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。%计算平方和的总和。sumSquares = ((y - t) ^ 2)总和;%呈迷你批次。N =大小(Y, 4);损失= (sumSquares) / N;结尾

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

完成一层

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

classdefsseClassificationLayer < nnet.layer.ClassificationLayer%示例自定义分类层的平方和误差损失。方法函数层= sseClassificationLayer(名称)% layer = ssecsassificationlayer (name)创建一个平方和%错误分类层并指定图层名称。%设置图层名称。层。的名字=的名字;%设置图层描述。层。描述=“方块错误”;结尾函数丢失=转发器(图层,y,t)% loss = forwardLoss(layer, Y, T)返回SSE之间的损失%预测y和训练目标t。%计算平方和的总和。sumSquares = ((y - t) ^ 2)总和;%呈迷你批次。N =大小(Y, 4);损失= (sumSquares) / 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函数forwardLoss所有支持万博1manbetxdlarray对象,所以该层是GPU兼容的。

检查输出层有效性

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

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

层= sseClassificationLayer (上交所的);

检查图层是否有效checkLayer.将有效的输入大小指定为单个观察到图层的单个观察的大小。该层预计1×1逐个K.——- - - - - -N阵列输入,其中K.是课程数量,也是N为小批处理中的观察数。

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

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

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

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

加载示例训练数据。

[XTrain, YTrain] = digitTrain4DArrayData;

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

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

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

选择= trainingOptions (“个”);网= trainNetwork (XTrain、YTrain层,选择);
单CPU培训。初始化输入数据归一化。| ========================================================================================|时代|迭代|经过时间的时间迷你批量|迷你批量|基础学习| | | | (hh:mm:ss) | Accuracy | Loss | Rate | |========================================================================================| | 1 | 1 | 00:00:00 | 9.38% | 0.9944 | 0.0100 | | 2 | 50 | 00:00:04 | 75.00% | 0.3561 | 0.0100 | | 3 | 100 | 00:00:08 | 92.97% | 0.1316 | 0.0100 | | 4 | 150 | 00:00:11 | 96.88% | 0.0915 | 0.0100 | | 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,欧美]= digitTest4DArrayData;YPred = classification (net, XTest);精度=平均值(YTest == YPred)
精度= 0.9844

也可以看看

||

相关的话题