主要内容

定义自定义像素分类层与Tversky损失

这个例子展示了如何定义和创建一个使用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属性%可选属性结束方法函数loss = forwardLoss(layer, Y, T)%层前向损失函数在这里结束结束结束

声明图层属性

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

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

  • 描述—层的一行描述,指定为字符向量或字符串标量。当图层显示在数组中。如果不指定层描述,则软件显示层类名称。

  • 类型-层的类型,指定为字符向量或字符串标量。的价值类型控件中显示该层时出现数组中。如果不指定层类型,则显示该软件“分类层”“回归层”

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

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

如果层没有其他属性,那么你可以省略属性部分。

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

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

Create Constructor函数

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

的可选输入参数名称名字创造时的财产。

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

创建正向损失函数

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

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

的大小Y取决于前一层的输出。为了确保Y是一样的尺寸吗T,则必须在输出层之前包含一个输出正确大小的层。例如,确保Y是预测分数的4d数组K类中,您可以包含大小相同的完全连接层K或者卷积层K在输出层之前,过滤器后面跟着一个softmax层。

函数loss = forwardLoss(layer, 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;dom = TP + layer。Alpha*FP +层。β*FN + layer.Epsilon;%计算Tversky指数lossTIc = 1 -数字/数字;lossTI = sum(lossTIc,3);%返回Tversky指数的平均损失N = size(Y,4);loss = sum(lossTI)/N;结束

反向损失函数

随着forwardLoss功能完全支持自动微分,不需要为金宝app后向损失创建函数。

有关支持自动微分的函数列表,请参见金宝app支持数组的函数列表金宝app(深度学习工具箱)

完成一层

中提供了完成的层tverskyPixelClassificationLayer.m,它作为支持文件附加到示例中。金宝app

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

GPU的兼容性

在MATLAB中用到的函数forwardLosstverskyPixelClassificationLayer所有的支金宝app持gpuArray输入,因此该层是GPU兼容的。

检查输出层有效性

创建该图层的实例。

layer = 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.56419秒。

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

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

创建一个语义分段网络,使用tverskyPixelClassificationLayer

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

负载训练数据用于语义分割imageDatastorepixelLabelDatastore

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

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

Ds = combine(imds,pxds);

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

options = 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:02 | 50.32% | 1.2933 | 0.0010 | | 13 | 50 | 00:00:23 | 98.83% | 0.0990 | 0.0010 | | 25 | 100 | 00:00:42 | 99.32% | 0.0550 | 0.0005 | | | 150 | 00:01:02 | 99.38% | 0.0461 |0.0005 | | 200 | | 00:01:21 | 99.48% | 0.0397 | 0.0003 | 63 | 250 | | 00:01:41 | 99.47% | 0.0380 | 0.0001 | 75 | 300 | | 00:02:00 | 99.54% | 0.0344 | 0.0001 | 88 | 350 | | 00:02:20 | 99.51% | 0.0352 | 6.2500 e-05 | | 100 | 400 | 00:02:39 | | 0.0330 | 6.2500 e-05 99.56%  | |========================================================================================| 培训完成:马克思时代完成。

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

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

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

参考文献

[1] Salehi, Seyed Sadegh Mohseni, Deniz Erdogmus和Ali Gholipour。使用3D全卷积深度网络进行图像分割的Tversky损失函数医学成像中的机器学习国际研讨会.b施普林格,Cham, 2017。