主要内容

使用Tversky损耗定义自定义像素分类层

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

此层可用于训练语义分段网络。要了解有关创建自定义深度学习层的更多信息,请参阅定义自定义深度学习层(深度学习工具箱).

特沃斯基损失

Tversky损失基于Tversky指数,用于测量两个分割图像之间的重叠[1.].特沃斯基指数 C 在一个图像之间 Y 以及相应的基本事实 T 是由

C = M = 1. M Y 厘米 T 厘米 M = 1. M Y 厘米 T 厘米 + α M = 1. M Y 厘米 T C M + β M = 1. M Y C M T 厘米

  • C 对应于类和 C 相当于不上课 C .

  • M 是元素的前两个维度上的元素数 Y .

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

损失 L 超过班数 C 是由

L = C = 1. C 1. - C

分类层模板

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

classdeftverskyPixelClassificationLayer < nnet.layer.ClassificationLayer属性%可选属性终止方法函数损耗=正向损耗(层,Y,T)%层前向损失函数在这里终止终止终止

声明图层特性

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

  • 名称–层名称,指定为字符向量或字符串标量。要将该层包含在层图中,必须指定一个非空的唯一层名称。如果使用该层和名称被设置为'',则软件会在培训时自动指定名称。

  • 描述–层的一行描述,指定为字符向量或字符串标量。当图层显示在图形中时,将显示此说明数组。如果未指定图层说明,则软件将显示图层类名。

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

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

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

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

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

classdeftverskyPixelClassificationLayer < nnet.layer.ClassificationLayer属性(常数)%防止被零除的小常数。ε=1e-8;终止属性%误报和误报的默认权重系数α=0.5;β=0.5;终止...终止

创建构造函数

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

指定要分配给的可选输入参数名称名称属性在创建。

函数图层= tverskyPixelClassificationLayer(name, alpha, beta)% layer = tverskyPixelClassificationLayer(name)创建Tversky%具有指定名称的像素分类层。设置图层名称层。名称=name;设置图层属性层。α=α;层。贝塔=beta;%设置图层描述图层.说明=“特沃斯基损失”;终止

创建远期损失函数

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

对于语义切分问题,需要考虑T尺寸匹配Y,在那里Y4-D阵列的大小H——- - - - - -W——- - - - - -K——- - - - - -N,在那里K是类的数量,并且N为迷你批量大小。

大小Y取决于上一层的输出。要确保Y大小是一样的吗T,则必须在输出层之前包含输出正确大小的层。例如,为了确保Y4-D数组的预测得分是什么K类中,可以包含大小为的完全连接层K或者是一个卷积层K过滤器在输出层之前跟随一个softmax层。

函数损耗=正向损耗(层,Y,T)% loss = forwardLoss(layer, Y, T)返回Tversky loss between%预测Y和训练目标T。Pcnot = 1 y;Gcnot = 1 - t;TP =总和(总和(y * T, 1), 2);FP =总和(总和(y * Gcnot, 1), 2);FN =总和(总和(Pcnot。* T, 1), 2);number = TP + layer.Epsilon;denom = TP + layer。α* FP +层。贝塔*FN + layer.Epsilon;%计算Tversky指数lossTIc=1-数字/名称;lossTI=总和(lossTIc,3);回报率平均特沃斯基指数损失N =大小(Y, 4);损失= (lossTI) / N;终止

落后的损失函数

随着forwardLoss功能完全支持自动差异化,不需要金宝app创建一个功能为后向损失。

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

完成层

已完成的层在中提供tverskyPixelClassificationLayer.m.

classdeftverskyPixelClassificationLayer < nnet.layer.ClassificationLayer%这一层实现了用于训练的Tversky损失函数%语义分割网络。%的引用萨利希、赛义德·萨德格·莫赫塞尼、丹尼兹·埃尔多格穆斯和阿里·古尔利普尔。% "Tversky损失函数的图像分割使用3D充分%卷积深度网络。”国际机器研讨会%医学影像学学习。2017年,湛江斯普林格。% ----------属性(常数)%防止被零除的小常数。ε=1e-8;终止属性%默认权重系数为假阳性和假%底片α=0.5;β=0.5;终止方法函数图层= tverskyPixelClassificationLayer(name, alpha, beta)%layer=tverskyPixelClassificationLayer(名称、alpha、beta)创建Tversky%具有指定名称和属性alpha和beta的像素分类层。%设置图层名称。layer.Name=Name;layer.Alpha=Alpha;layer.Beta=Beta;%设置图层描述。图层.说明=“特沃斯基损失”;终止函数损耗=正向损耗(层,Y,T)% loss = forwardLoss(layer, Y, T)返回Tversky loss between%预测Y和训练目标T。Pcnot = 1 y;Gcnot = 1 - t;TP =总和(总和(y * T, 1), 2);FP =总和(总和(y * Gcnot, 1), 2);FN =总和(总和(Pcnot。* T, 1), 2);number = TP + layer.Epsilon;denom = TP + layer。α* FP +层。贝塔*FN + layer.Epsilon;%计算特沃斯基指数lossTIc=1-数字/名称;lossTI=总和(lossTIc,3);回报率平均特沃斯基指数损失。N =大小(Y, 4);损失= (lossTI) / N;终止终止终止

GPU的兼容性

所用的MATLAB函数forwardLosstverskyPixelClassificationLayer全部支持金宝appgpuArray输入,所以该层是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跳过。时间:1.27秒。

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

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

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

layers=[imageInputLayer([32 32 1])卷积2dLayer(3,64,“填充”,1)batchNormalizationLayer reluLayer MaxPoolig2Dlayer(2,“大步走”,2)卷积2层(3,64,“填充”64年,1)reluLayer transposedConv2dLayer(4日,“大步走”2,“种植”,1)卷积2层(1,2)softmaxLayer tverskyPixelClassificationLayer(“特沃斯基”,0.3,0.7)];

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

dataSetDir = fullfile (toolboxdir (“愿景”),“视觉数据”,“triangleImages”); imageDir=fullfile(dataSetDir,“培训图像”);labelDir = fullfile (dataSetDir,“trainingLabels”);imds=imageDatastore(imageDir);类名=[“三角形”“背景”];标签id = [255 0];pxds = pixelLabelDatastore(labelDir, classNames, labelid);

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

ds=联合收割机(imds、pxds);

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

选择= trainingOptions (“亚当”,...“InitialLearnRate”,1e-3,...“MaxEpochs”,100,...“LearnRateDropFactor”, 5 e 1,...“LearnRateDropPeriod”,20,...“LearnRateSchedule”,“分段”,...“MiniBatchSize”, 50);网= trainNetwork (ds、层、期权);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |丧失准确性  | |========================================================================================| | 1 | 1 | 00:00:02 | | 1.2933 | 0.0010 50.32%| | 13 | 50 | 00:00:30 | 98.82% | 0.0986 | 0.0010 | | 25 | 100 | 00:00:58 | 99.33% | 0.0548 | 0.0005 | | 38 | 150 | 00:01:22 | 99.37% | 0.0473 | 0.0005 | | 50 | 200 | 00:01:42 | 99.48% | 0.0400 | 0.0003 | | 63 | 250 | 00:02:03 | 99.48% | 0.0378 | 0.0001 | | 75 | 300 | 00:02:25 | 99.54% | 0.0347 | 0.0001 | | 88 | 350 | 00:02:50 | 99.51% | 0.0349 | 6.2500e-05 | | 100 | 400 | 00:03:14 | 99.56% | 0.0330 | 6.2500e-05 | |========================================================================================| Training finished: Max epochs completed.

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

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

Figure包含axes对象。axes对象包含image类型的对象。

参考文献

Salehi, Seyed Sadegh Mohseni, Deniz Erdogmus和Ali Gholipour。使用3D全卷积深度网络进行图像分割的特沃斯基损失函数医学影像中的机器学习国际研讨会湛斯普林格,2017年。