主要内容

基于CycleGAN的无监督医学图像去噪

这个例子展示了如何使用CycleGAN神经网络从有噪声的低剂量CT图像中生成高质量的高剂量CT图像。

x射线CT是一种流行的成像方式,用于临床和工业应用,因为它产生高质量的图像,并提供优越的诊断能力。为了保护病人的安全,临床医生建议使用低剂量的辐射。然而,低辐射剂量会导致图像的信噪比(SNR)降低,从而降低诊断的准确性。

深度学习技术可以提高低剂量CT (LDCT)图像的质量。使用生成对抗网络(GAN)进行图像到图像的转换,您可以将有噪声的LDCT图像转换为与常规剂量CT图像相同质量的图像。在此应用中,源域由LDCT图像组成,目标域由常规剂量图像组成。有关更多信息,请参见开始了解用于图像到图像转换的GANs

CT图像去噪需要进行无监督训练的GAN,因为临床医生通常不会在同一时段获得同一患者的低剂量和常规剂量CT图像的匹配对。这个例子使用了一个周期一致的GAN (CycleGAN),该GAN是对来自大量数据样本的图像数据块进行训练的。有关使用来自有限数据样本的完整图像训练的UNIT神经网络的类似方法,请参见无监督医学图像去噪单元

UnsupervisedDenoisingExampleUpdated_3.png

下载LDCT数据集

本例使用来自低剂量CT大挑战的数据[2,3,4]。数据包括对常规剂量CT图像和模拟低剂量CT图像,包括99个头部扫描(标记N为神经),100个胸部扫描(标记C为胸部)和100个腹部扫描(标记L为肝脏)。数据集的大小为1.2 TB。

指定dataDir作为数据集的期望位置。

dataDir = fullfile(tempdir,“LDCT”“LDCT-and-Projection-data”);

要下载数据,请转到癌症影像档案的网站。这个例子只使用了胸部的图像。将箱子文件从“Images (DICOM, 952 GB)”数据集中下载到指定的目录dataDir使用NBIA数据检索器.下载成功后,dataDir包含50个子文件夹,名称为“C002”及“C004”,以“C296”结尾。

为培训、验证和测试创建数据存储

LDCT数据集提供了成对的低剂量和高剂量CT图像。然而,CycleGAN架构需要非配对数据进行无监督学习。本例通过划分图像来模拟未配对的训练和验证数据,以便用于获得低剂量CT和高剂量CT图像的患者不重叠。该示例保留了用于测试的低剂量和常规剂量图像对。

方法将数据分割为训练、验证和测试数据集createLDCTFolderListhelper函数。该函数作为支持文件附加到示例中。金宝app辅助函数对数据进行分割,使得每组中两种类型的图像都有大致良好的表示。大约80%的数据用于训练,15%用于测试,5%用于验证。

maxDirsForABodyPart = 25;[filesTrainLD, filesTrainHD filesTestLD、filesTestHD filesValLD, filesValHD] =...createLDCTFolderList (dataDir maxDirsForABodyPart);

创建包含两个域的训练和验证图像的图像数据存储,即低剂量CT图像和高剂量CT图像。数据集由DICOM图像组成,因此使用自定义ReadFcn中的名称-值参数imageDatastore允许读取数据。

ext =“.dcm”;readFcn = @(x)dicomread(x);imdsTrainLD = imageDatastore(filesTrainLD,FileExtensions= extts,ReadFcn= ReadFcn);imdsTrainHD = imageDatastore(filesTrainHD,FileExtensions=exts,ReadFcn= ReadFcn);imdsValLD = imageDatastore(filesValLD,FileExtensions= extts,ReadFcn= ReadFcn);imdsValHD = imageDatastore(filesValHD,FileExtensions= extts,ReadFcn= ReadFcn);imdsTestLD = imageDatastore(fileststld,FileExtensions= extts,ReadFcn= ReadFcn);imdsTestHD = imageDatastore(filesTestHD,FileExtensions=exts,ReadFcn= ReadFcn);

低剂量和高剂量图像的数量可能不同。选择文件的一个子集,使图像的数量相等。

numTrain = min(numel(imdsTrainLD.Files),numel(imdsTrainHD.Files));imdstraainld =子集(imdstraainld,1:numTrain);imdsTrainHD =子集(imdsTrainHD,1:numTrain);numVal = min(nummel (imdsValLD.Files), nummel (imdsValHD.Files));imdsValLD =子集(imdsValLD,1:numVal);imdsValHD =子集(imdsValHD,1:numVal);numTest = min(nummel (imdsTestLD.Files), nummel (imdsTestHD.Files));imdsTestLD =子集(imdsTestLD,1:numTest);imdsTestHD =子集(imdsTestHD,1:numTest);

预处理和增加数据

方法对数据进行预处理变换属性指定的自定义预处理操作normalizeCTImageshelper函数。该函数作为支持文件附加到示例中。金宝app的normalizeCTImages函数将数据重新缩放到范围[- 1,1]。

timdsTrainLD = transform(imdsTrainLD,@(x){normalizeCTImages(x)});timdsTrainHD = transform(imdsTrainHD,@(x){normalizeCTImages(x)});timdsValLD = transform(imdsValLD,@(x){normalizeCTImages(x)});timdsValHD = transform(imdsValHD,@(x){normalizeCTImages(x)});timdsTestLD = transform(imdsTestLD,@(x){normalizeCTImages(x)});timdsTestHD = transform(imdsTestHD,@(x){normalizeCTImages(x)});

结合低剂量和高剂量训练数据使用randomPatchExtractionDatastore.从这个数据存储中读取数据时,使用随机旋转和水平反射来增加数据。

inputSize = [128,128,1];augmenter = imageDataAugmenter(RandRotation=@()90*(randi([0,1],1)),RandXReflection=true);dsTrain = randompatchextracactiondatastore (timdsTrainLD,timdsTrainHD,...inputSize (1:2), PatchesPerImage = 16, DataAugmentation =增压器);

组合验证数据,使用randomPatchExtractionDatastore.读取验证数据时不需要执行扩充操作。

dsVal = randompatchextracactiondatastore (timdsValLD,timdsValHD,inputSize(1:2));

可视化数据集

看看训练集中的一些低剂量和高剂量图像补丁对。注意,低剂量(左)和高剂量(右)的图像对是不配对的,因为它们来自不同的患者。

numImagePairs = 6;imagePairsTrain = [];i = 1:numImagePairs imLowAndHighDose = read(dsTrain);inputImage = imLowAndHighDose.InputImage{1};inputImage = rescale(im2single(inputImage));responseImage = imLowAndHighDose.ResponseImage{1};responseImage = rescale(im2single(responseImage));imagePairsTrain = cat(4,imagePairsTrain,inputImage,responseImage);结束蒙太奇(imagePairsTrain大小= [numImagePairs 2], BorderSize = 4,写成BackgroundColor =“w”

批训练和训练期间的验证数据

本例使用自定义训练循环。的minibatchqueue(深度学习工具箱)对象用于管理自定义训练循环中的观察数据的小批处理。minibatchqueue对象也将数据强制转换为dlarray对象,用于在深度学习应用程序中实现自动区分。

通过使用辅助函数沿批处理维度连接图像补丁来处理小批concatenateMiniBatchLD2HDCT.该函数作为支持文件附加到示例中。金宝app指定小批数据提取格式为"SSCB”(空间,空间,通道,批次)。丢弃任何少于miniBatchSize观察。

miniBatchSize = 32;mbqTrain = minibatchqueue(...MiniBatchSize = MiniBatchSize,...MiniBatchFcn = @concatenateMiniBatchLD2HDCT,...PartialMiniBatch =“丢弃”...MiniBatchFormat =“SSCB”);mbqVal = minibatchqueue(dsVal,...MiniBatchSize = MiniBatchSize,...MiniBatchFcn = @concatenateMiniBatchLD2HDCT,...PartialMiniBatch =“丢弃”...MiniBatchFormat =“SSCB”);

创建生成器和鉴别器网络

CycleGAN由两个生成器和两个鉴别器组成。发生器执行图像到图像的转换,从低剂量到高剂量,反之亦然。鉴别器是PatchGAN网络,它返回输入数据是真实的或生成的patch-wise概率。一个鉴别器区分真实和生成的低剂量图像,另一个鉴别器区分真实和生成的高剂量图像。

创建每个生成器网络cycleGANGenerator函数。对于256 * 256像素的输入大小,指定NumResidualBlocks参数为9.默认情况下,该函数有3个编码器模块,并在第一卷积层中使用64个滤波器。

numResiduals = 6;genHD2LD = cycleGANGenerator(inputSize,NumResidualBlocks=numResiduals,NumOutputChannels=1);genLD2HD = cycleGANGenerator(inputSize,NumResidualBlocks=numResiduals,NumOutputChannels=1);

属性创建每个鉴别器网络patchGANDiscriminator函数。在鉴别器的第一个卷积层中,使用默认设置下采样块的数量和过滤器的数量。

diskld = patchGANDiscriminator(inputSize);discHD = patchGANDiscriminator(inputSize);

定义损失函数和分数

modelGradientsHelper函数计算鉴别器和生成器的梯度和损失。函数中定义了此函数金宝app支持功能部分的示例。

生成器的目标是生成经过翻译的图像,鉴别器将其分类为真实图像发电机损耗是三种损耗的加权和:对抗性损耗、周期一致性损耗和保真度损耗。保真度损失是基于结构相似性(SSIM)损失的。

l 总计 l 敌对的 + λ l 周期 一致性 + l 忠诚

指定权重因子 λ 控制了周期一致性损失与对抗性损失和保真度损失的相对重要性。

Lambda = 10;

每个鉴别器的目标是正确区分其域中图像的真实图像(1)和翻译图像(0)。每个鉴别器都有一个损失函数,它依赖于预期输出和预测输出之间的均方误差(MSE)。

指定培训项目

以32个小批次的尺寸训练3个周期。

numEpochs = 3;miniBatchSize = 32;

指定Adam优化的选项。对于生成器和鉴别器网络,使用:

  • 学习率为0.0002

  • 梯度衰减因子为0.5

  • 平方梯度衰减因子为0.999

learnRate = 0.0002;gradientDecay = 0.5;squaredGradientDecayFactor = 0.999;

初始化生成器和鉴别器的Adam参数。

avgGradGenLD2HD = [];avgSqGradGenLD2HD = [];avgGradGenHD2LD = [];avgSqGradGenHD2LD = [];avgGradDiscLD = [];avgSqGradDiscLD = [];avgGradDiscHD = [];avgSqGradDiscHD = [];

每100次迭代显示生成的验证图像。

validationFrequency = 100;

训练或下载模型

默认情况下,该示例下载了用于低剂量到高剂量CT的预训练版本的CycleGAN生成器。预训练的网络使您可以运行整个示例,而无需等待训练完成。

为了训练网络,设置doTraining变量转换为真正的.在自定义训练循环中训练模型。对于每个迭代:

  • 方法读取当前小批处理的数据下一个(深度学习工具箱)函数。

  • 方法评估模型梯度dlfeval(深度学习工具箱)功能和modelGradientshelper函数。

  • 方法更新网络参数adamupdate(深度学习工具箱)函数。

  • 在每个纪元之后显示源域和目标域的输入和翻译图像。

如果有GPU,可以在GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU计算要求(并行计算工具箱).在具有24gb GPU内存的NVIDIA™Titan X上进行训练大约需要30个小时。

doTraining = false;如果doTraining迭代= 0;开始= tic;创建一个目录来存储检查点checkpointDir = fullfile(dataDir,“检查点”);如果~存在(checkpointDir“dir”mkdir (checkpointDir);结束初始化训练进度图[figureHandle, tileHandle imageAxes、scoreAxesX scoreAxesY,...lineScoreGenLD2HD lineScoreGenD2LD lineScoreDiscHD lineScoreDiscLD] =...initializeTrainingPlotLD2HDCT_CycleGAN;epoch = 1:numEpochs shuffle(mbqTrain);在小批上循环hasdata(mbqTrain)迭代=迭代+ 1;读取小批数据[imageLD,imageHD] = next(mbqTrain);将小批量数据转换为dlarray并指定尺寸标签%“SSCB”(空间,空间,通道,批)imageLD = darray (imageLD,“SSCB”);imageHD = darray (imageHD,“SSCB”);如果在GPU上训练,则将数据转换为gpuArray如果canUseGPU imageLD = gpuArray(imageLD);imageHD = gpuArray(imageHD);结束计算损失和梯度[genHD2LDGrad, genLD2HDGrad discrXGrad discYGrad,...genHD2LDState genLD2HDState,分数,imagesOutLD2HD imagesOutHD2LD] =...dlfeval (@modelGradients genLD2HD genHD2LD,...discLD、discHD imageHD imageLD,λ);genHD2LD。状态= genHD2LDState;genLD2HD。State = genLD2HDState;% diskld更新参数,用于区分%由实际低剂量CT图像生成的低剂量CT图像[discLD。learnables,avgGradDiscLD,avgSqGradDiscLD] =...adamupdate (discLD。learnables,discrXGrad,avgGradDiscLD,...迭代,avgSqGradDiscLD learnRate、gradientDecay squaredGradientDecayFactor);%更新discHD的参数,用于区分%由真实高剂量CT图像生成的高剂量CT图像[discHD。learnables,avgGradDiscHD,avgSqGradDiscHD] =...adamupdate (discHD。learnables,discYGrad,avgGradDiscHD,...迭代,avgSqGradDiscHD learnRate、gradientDecay squaredGradientDecayFactor);% genHD2LD更新参数,其中%由高剂量CT图像生成低剂量CT图像[genHD2LD。learnables,avgGradGenHD2LD,avgSqGradGenHD2LD] =...adamupdate (genHD2LD。learnables,genHD2LDGrad,avgGradGenHD2LD,...迭代,avgSqGradGenHD2LD learnRate、gradientDecay squaredGradientDecayFactor);%更新genLD2HD参数,其中%由低剂量CT图像生成高剂量CT图像[genLD2HD。learnables,avgGradGenLD2HD,avgSqGradGenLD2HD] =...adamupdate (genLD2HD。learnables,genLD2HDGrad,avgGradGenLD2HD,...迭代,avgSqGradGenLD2HD learnRate、gradientDecay squaredGradientDecayFactor);更新网络得分图updateTrainingPlotLD2HDCT_CycleGAN(得分、迭代、时代、启动、scoreAxesX scoreAxesY,...lineScoreGenLD2HD lineScoreGenD2LD,...lineScoreDiscHD lineScoreDiscLD)%每个validationFrequency迭代,显示一批%使用保留的生成器输入生成图像如果mod(迭代,validationFrequency) == 0 ||迭代== 1 displayGeneratedLD2HDCTImages(mbqVal,imageAxes,genLD2HD,genHD2LD);结束结束在每个纪元之后保存模型如果canUseGPU [genLD2HD,genHD2LD,discLD,discHD] =...收集(genLD2HD genHD2LD、discLD discHD);结束generatorHighDoseToLowDose = genHD2LD;generatorLowDoseToHighDose = genLD2HD;discriminatorLowDose = discLD;discriminatorHighDose = discHD;modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(checkpointDir + filesep +“LD2HDCTCycleGAN——”+ modelDateTime +“时代——”+时代+“.mat”...“generatorLowDoseToHighDose”“generatorHighDoseToLowDose”...“discriminatorLowDose”“discriminatorHighDose”);结束保存最终的模型modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(checkpointDir + filesep +“trainedLD2HDCTCycleGANNet——”+ modelDateTime +“.mat”...“generatorLowDoseToHighDose”“generatorHighDoseToLowDose”...“discriminatorLowDose”“discriminatorHighDose”);其他的net_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/trainedLD2HDCTCycleGANNet.mat”;downloadTrainedNetwork (net_url dataDir);负载(fullfile (dataDir“trainedLD2HDCTCycleGANNet.mat”));结束

使用测试数据生成新图像

定义用于计算质量指标的测试图像的数量。随机选择两个测试图像显示。

numTest = timdsTestLD.numpartitions;numImagesToDisplay = 2;idxImagesToDisplay = randi(numTest,1,numImagesToDisplay);

初始化变量计算PSNR和SSIM。

origPSNR = 0 (numTest,1);generatedPSNR = 0 (numTest,1);origSSIM = 0 (numTest,1);generatedSSIM = 0 (numTest,1);

要生成新的翻译图像,请使用预测(深度学习工具箱)函数。从测试数据集中读取图像,并使用经过训练的生成器生成新的图像。

idx = 1:numTest imageTestLD = read(timdsTestLD);imageTestHD = read(timdsTestHD);imageTestLD = cat(4,imageTestLD{1});imageTestHD = cat(4,imageTestHD{1});将小批量数据转换为dlarray并指定尺寸标签%“SSCB”(空间,空间,通道,批)imageTestLD = darray (imageTestLD,“SSCB”);imageTestHD = dlarray(imageTestHD,“SSCB”);如果在GPU上运行,则将数据转换为gpuArray如果canUseGPU imageTestLD = gpuArray(imageTestLD);imageTestHD = gpuArray(imageTestHD);结束生成翻译后的图像generatedImageHD = predict(generatorLowDoseToHighDose,imageTestLD);generatedImageLD = predict(generatorHighDoseToLowDose,imageTestHD);显示一些图像以可视化网络响应如果ismember(idx,idxImagesToDisplay) figure origImLD = rescale(extractdata(imageTestLD));genImHD = rescale(extractdata(generatedImageHD));montage({origImLD,genImHD},Size=[1 2],BorderSize=5) title(“原始LDCT测试图像”+ idx +(左),生成的HDCT图像(右)结束origPSNR(idx) = psnr(imageTestLD,imageTestHD);generatedPSNR(idx) = psnr(generatedImageHD,imageTestHD);origSSIM(idx) = multissim(imageTestLD,imageTestHD);generatedSSIM(idx) = multissim(generatedImageHD,imageTestHD);结束

计算原始图像和生成图像的平均PSNR。PSNR值越大,图像质量越好。

disp (原始图像的平均PSNR:+的意思是(origPSNR,“所有”));
原始图像平均PSNR: 20.4045
disp (生成图像的平均PSNR:+的意思是(generatedPSNR,“所有”));
生成图像的平均PSNR为27.9155

计算原始图像和生成图像的平均SSIM。SSIM值越接近1,图像质量越好。

disp (“原始图像的平均SSIM:”+的意思是(origSSIM,“所有”));
原始图像的平均SSIM: 0.76651
disp (生成图像的平均SSIM:+的意思是(generatedSSIM,“所有”));
生成图像的平均SSIM: 0.90194

金宝app支持功能

模型梯度函数

这个函数modelGradients将两个生成器和鉴别器作为输入dlnetwork对象和一小批输入数据。该函数返回了损失相对于网络中可学习参数的梯度以及四个网络的分数。因为鉴别器输出不在范围[0,1]内,所以modelGradients函数应用sigmoid函数将鉴别器输出转换为概率分数。

函数[genHD2LDGrad, genLD2HDGrad discLDGrad discHDGrad,...genHD2LDState genLD2HDState,分数,imagesOutLDAndHDGenerated imagesOutHDAndLDGenerated] =...modelGradients (genLD2HD、genHD2LD discLD、discHD imageHD, imageLD,λ)将图像从一个域转换到另一个域:低剂量到高剂量和%反之亦然[imageLDGenerated,genHD2LDState] = forward(genHD2LD,imageHD);[imageHDGenerated,genLD2HDState] = forward(genLD2HD,imageLD);计算每个域的真实图像的预测%鉴别器网络predRealLD = forward(discLD,imageLD);predRealHD = forward(discHD,imageHD);计算每个域生成图像的预测%对应的鉴别器网络predGeneratedLD = forward(discLD,imageLDGenerated);predGeneratedHD = forward(discHD,imageHDGenerated);计算真实图像的鉴别器损失discLDLossReal = lossReal(predRealLD);discHDLossReal = lossReal(predRealHD);计算生成图像的鉴别器损失discLDLossGenerated = lossGenerated(predGeneratedLD);discHDLossGenerated = lossGenerated(predGeneratedHD);计算每个鉴别器网络的总鉴别器损失discldlossstotal = 0.5*(discLDLossReal + discLDLossGenerated);discHDLossTotal = 0.5*(discHDLossReal + discHDLossGenerated);计算生成图像的生成器损失genLossHD2LD = lossReal(predGeneratedLD);genLossLD2HD = lossReal(predGeneratedHD);属性完成往返(周期一致性)输出%生成器到每个生成的图像中获取相应的图像%原始域名cycleImageLD2HD2LD = forward(genHD2LD,imageHDGenerated);cycleImageHD2LD2HD = forward(genLD2HD,imageLDGenerated);计算真实图像与生成图像之间的循环一致性损失cycleLossLD2HD2LD = cycleConsistencyLoss(imageLD,cycleImageLD2HD2LD,lambda);cycleLossHD2LD2HD = cycleConsistencyLoss(imageHD,cycleImageHD2LD2HD,lambda);计算标识输出identityImageLD = forward(genHD2LD,imageLD);identityImageHD = forward(genLD2HD,imageHD);计算标识输出之间的保真损失(SSIM)fidelityLossLD = mean(1-multissim(identityImageLD,imageLD),“所有”);fidelityLossHD = mean(1-multissim(identityImageHD,imageHD),“所有”);计算发电机总损耗genLossTotal = genLossHD2LD + cycleLossHD2LD2HD +...genLossLD2HD + cycleLossLD2HD2LD + fidelityLossLD + fidelityLossHD;计算生成器的分数genHD2LDScore = mean(sigmoid(predGeneratedLD),“所有”);genLD2HDScore = mean(sigmoid(predGeneratedHD),“所有”);计算鉴别器的分数discLDScore = 0.5*mean(sigmoid(predRealLD),“所有”) +...0.5 *意味着(1-sigmoid (predGeneratedLD),“所有”);discHDScore = 0.5*mean(sigmoid(predRealHD),“所有”) +...0.5 *意味着(1-sigmoid (predGeneratedHD),“所有”);将分数合并到单元格数组中scores = {genHD2LDScore,genLD2HDScore,discLDScore,discHDScore};计算发电机的梯度genLD2HDGrad = dlgradient(genLossTotal,genLD2HD.Learnables,RetainData=true);genHD2LDGrad = dlgradient(genLossTotal,genHD2LD.Learnables,RetainData=true);计算鉴别器的梯度discLDGrad = dlgradient(discLDLossTotal,discLD.Learnables,RetainData=true);discHDGrad = dlgradient(discHDLossTotal,discHD.Learnables);返回小批低剂量CT转换为高剂量CT的图像imagesOutLDAndHDGenerated = {imageLD,imageHDGenerated};返回小批高剂量CT转换为低剂量CT的图像imagesOutHDAndLDGenerated = {imageHD,imageLDGenerated};结束

损失函数

指定真实图像和生成图像的MSE损失函数。

函数loss = mean((1- forecasts).^2,“所有”);结束函数损失=产生的(预测)损失=平均((预测)。“所有”);结束

为真实图像和生成图像指定循环一致性损失函数。

函数loss = cycleConsistencyLoss(imageReal,imageGenerated,lambda) loss = mean(abs(imageReal-imageGenerated),“所有”) * lambda;结束

参考文献

[1]朱俊彦,朴泰成,菲利普·伊索拉,阿列克谢·a·埃弗罗斯。“使用周期一致对抗网络的未配对图像到图像转换。”在2017 IEEE计算机视觉国际会议(ICCV)2242 - 51。威尼斯:IEEE, 2017。https://doi.org/10.1109/ICCV.2017.244

[2] McCollough, Cynthia,陈白宇,David R Holmes III,段新慧,余志聪,余立峰,冷帅,Joel Fletcher。“低剂量CT图像和投影数据(ldct和投影数据)”癌症成像档案,2020年。https://doi.org/10.7937/9npb - 2637。

[3]资助国家生物医学成像和生物工程研究所EB017095和EB017185 (Cynthia McCollough, PI)。

[4] Clark, Kenneth, Bruce Vendt, Kirk Smith, John Freymann, Justin Kirby, Paul Koppel, Stephen Moore等人,“癌症成像档案(TCIA):维护和运行一个公共信息库。”数字成像杂志26日,没有。6(2013年12月):1045-57。https://doi.org/10.1007/s10278 - 013 - 9622 - 7。

[5] You,陈宇,杨青松,单宏明,Lars Gjesteby,李光,鞠圣红,张竹阳等。低剂量CT去噪的结构敏感多尺度深度神经网络。IEEE访问6(2018): 41839-55。https://doi.org/10.1109/ACCESS.2018.2858196。

另请参阅

||||(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)

相关的例子

更多关于