主要内容

定义具有特沃斯基损失的自定义像素分类层

这个例子展示了如何定义和创建一个使用Tversky损失的自定义像素分类层。

该层可用于训练语义分割网络。要了解有关创建自定义深度学习层的详细信息,请参见定义自定义深度学习层

特沃斯基损失

Tversky损失是基于Tversky指数来测量两个分割图像之间的重叠[1].特沃斯基指数 “透明国际” c 在一个图像之间 Y 和相应的基本真理 T 是由

“透明国际” c 1 Y 厘米 T 厘米 1 Y 厘米 T 厘米 + α 1 Y 厘米 T c + β 1 Y c T 厘米

  • c 对应于类和 c 相当于没去上课 c

  • 的前两个维度上的元素个数是多少 Y

  • α 而且 β 是控制每个类别的假阳性和假阴性对损失的贡献的加权因素。

损失 l 除以课程的数量 C 是由

l c 1 C 1 - “透明国际” c

分类层模板

将分类层模板复制到MATLAB®的新文件中。该模板概述了分类层的结构,并包括定义层行为的函数。示例的其余部分显示如何完成tverskyPixelClassificationLayer

classdeftverskyPixelClassificationLayer < nnet.layer.ClassificationLayer . tverskyPixelClassificationLayer属性%可选属性结束方法函数损失(层,Y, T)%层正向损失函数在这里结束结束结束

声明图层属性

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

  • 的名字-层名,指定为字符向量或字符串标量。要在图层图中包含此图层,必须指定一个非空的惟一层名。如果你用这个层训练一个系列网络的名字设置为'',然后软件在训练时自动分配一个名字。

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

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

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

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

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

特沃斯基损失需要一个小的常数值来防止被零除。指定属性,ε,以保持该值。它还需要两个变量属性Alpha而且β分别控制假阳性和假阴性的权重。

classdeftverskyPixelClassificationLayer < nnet.layer.ClassificationLayer . tverskyPixelClassificationLayer属性(常量)%用于防止除零的小常数。= 1e-8;结束属性%假阳性和假阴性的默认权重系数Alpha = 0.5;Beta = 0.5;结束...结束

创建构造函数

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

属性的可选输入参数名的名字属性在创建时。

函数层= tverskyPixelClassificationLayer(名称,alpha, beta)% layer = tverskyPixelClassificationLayer(name)创建一个Tversky使用指定名称的%像素分类层。设置层名层。的名字=name;设置图层属性层。Alpha = Alpha;层。β=beta;设置层描述层。描述=“特沃斯基损失”结束

创建正向损失函数

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

对于语义分割问题,的维数T尺寸匹配Y,在那里Y4-D数组的大小H——- - - - - -W——- - - - - -K——- - - - - -N,在那里K是班级的数量,和N是小批大小。

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

函数损失(层,Y, T)% loss = forwardLoss(layer, Y, T)返回之间的Tversky损失预测Y和训练目标T。Pcnot = 1-Y;Gcnot = 1-T;TP = sum(sum(y *T,1),2);FP = sum(sum(Y.*Gcnot,1),2);FN = sum(sum(Pcnot.*T,1),2);number = TP + layer.Epsilon;denom = TP +层。Alpha*FP +层。β*FN + layer.Epsilon;计算特沃斯基指数lossTIc = 1 - number ./denom;lossTI = sum(lossTIc,3);返回平均特沃斯基指数损失N = size(Y,4);损失= sum(lossTI)/N;结束

反向损失函数

随着forwardLoss函数完全支持自动微分,不需要为反向损失创建函数。

有关支持自动微分的函数列表,请参见支持dlarray的函数列表

完成一层

中提供了完整的层tverskyPixelClassificationLayer.m

classdeftverskyPixelClassificationLayer < nnet.layer.ClassificationLayer . tverskyPixelClassificationLayer这一层实现了用于训练的Tversky损失函数%语义分割网络。%的引用萨利希,赛义德·萨迪格·莫赫塞尼,德尼兹·埃尔多格穆斯和阿里·格利普尔。。Tversky损失函数用于三维图像分割卷积深度网络。”国际机械研讨会%医学影像学习。施普林格,Cham, 2017。% ----------属性(常量)%用于防止除零的小常数。= 1e-8;结束属性%假阳性和假的默认权重系数%底片Alpha = 0.5;Beta = 0.5;结束方法函数层= tverskyPixelClassificationLayer(名称,alpha, beta)% layer = tverskyPixelClassificationLayer(name, alpha, beta)创建一个Tversky%像素分类层具有指定的名称和属性alpha和beta。设置层名。层。的名字=name; layer.Alpha = alpha; layer.Beta = beta;设置层描述。层。描述=“特沃斯基损失”结束函数损失(层,Y, T)% loss = forwardLoss(layer, Y, T)返回之间的Tversky损失预测Y和训练目标T。Pcnot = 1-Y;Gcnot = 1-T;TP = sum(sum(y *T,1),2);FP = sum(sum(Y.*Gcnot,1),2);FN = sum(sum(Pcnot.*T,1),2);number = TP + layer.Epsilon;denom = TP +层。Alpha*FP +层。β*FN + layer.Epsilon;计算特沃斯基指数lossTIc = 1 - number ./denom;lossTI = sum(lossTIc,3);返回平均特沃斯基指数损失。N = size(Y,4);损失= sum(lossTI)/N;结束结束结束

GPU的兼容性

所使用的MATLAB函数forwardLosstverskyPixelClassificationLayer所有的支持gpuArray输入,所以该层是GPU兼容的。

检查输出层有效性

创建该层的一个实例。

层= tverskyPixelClassificationLayer(“特沃斯基”, 0.7, 0.3);

通过使用检查层的有效性checkLayer.将有效的输入大小指定为该层的典型输入的单个观察值的大小。该层期望H——- - - - - -W——- - - - - -K——- - - - - -N数组输入,其中K是班级的数量,和N是小批中的观察数。

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

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

在语义分割网络中使用自定义层

创建一个语义分割网络tverskyPixelClassificationLayer

图层= [imageInputLayer([32 32 1]) convolution2dLayer(3,64,“填充”,1) maxPooling2dLayer(2,“步”, 2) convolution2dLayer (64,“填充”,1) reluLayer转置conv2dlayer (4,64,“步”2,“种植”,1) convolution2dLayer(1,2) softmaxLayer tverskyPixelClassificationLayer(“特沃斯基”, 0.3, 0.7);

加载训练数据用于语义分割使用imageDatastore而且pixelLabelDatastore

dataSetDir = fullfile(toolboxdir(“愿景”),“visiondata”“triangleImages”);imageDir = fullfile(dataSetDir,“trainingImages”);labelDir = fullfile(dataSetDir,“trainingLabels”);imds = imageDatastore(imageDir);classNames = [“三角形”“背景”];labelIDs = [255 0];pxds = pixelLabelDatastore(labelDir, classNames, labelIDs);

使用数据存储将图像和像素标签数据关联起来结合

Ds = combine(imds,pxds);

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

选项= trainingOptions(“亚当”...“InitialLearnRate”1 e - 3,...“MaxEpochs”, 100,...“LearnRateDropFactor”, 5 e 1,...“LearnRateDropPeriod”, 20岁,...“LearnRateSchedule”“分段”...“MiniBatchSize”, 50);net = trainNetwork(ds,layers,options);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |丧失准确性  | |========================================================================================| | 1 | 1 | 00:00:01 | 50.32% | 1.2933 | 0.0010 | | 13 | 50 | 00:00:20 | 98.83% | 0.0991 | 0.0010 | | 25 | 100 | 00:00:37 | 99.33% | 0.0549 | 0.0005 | | | 150 | 00:00:53 | 99.37% | 0.0465 |0.0005 | | 200 | | 00:01:07 | 99.48% | 0.0400 | 0.0003 | 63 | 250 | | 00:01:20 | 99.47% | 0.0385 | 0.0001 | 75 | 300 | | 00:01:31 | 99.54% | 0.0349 | 0.0001 | 88 | 350 | | 00:01:42 | 99.51% | 0.0353 | 6.2500 e-05 | | 100 | 400 | 00:01:53 | | 0.0331 | 6.2500 e-05 99.56%  | |========================================================================================| 培训完成:马克思时代完成。

通过对测试图像进行分割并显示分割结果来评估训练后的网络。

I = imread(“triangleTest.jpg”);[C,分数]= semanticseg(I,net);B = labeloverlay(I,C);蒙太奇({B}我)

图中包含一个轴对象。axis对象包含一个image类型的对象。

参考文献

[1]萨利希,赛义德·萨迪格·莫赫塞尼,德尼兹·埃尔多格穆斯和阿里·格利普尔。“使用3D全卷积深度网络进行图像分割的Tversky损失函数。”医学影像中的机器学习国际研讨会.施普林格,Cham, 2017。

另请参阅

|||(计算机视觉工具箱)|(计算机视觉工具箱)

相关的话题

Baidu
map