主要内容

使用实验管理器来训练生成对抗网络(GANs)

这个例子展示了如何创建一个自定义训练实验来训练生成对抗网络(GAN)来生成花的图像。对于自定义训练实验,显式地定义所使用的训练过程实验管理器.在本例中,您实现了一个自定义训练循环来训练GAN, GAN是一种深度学习网络,可以生成与输入真实数据具有相似特征的数据。GAN由两个一起训练的网络组成:

  • 生成器——给定一个随机值向量(潜在输入)作为输入,该网络生成与训练数据具有相同结构的数据。

  • 判别器——给定的数据批次包含来自训练数据的观察结果,以及来自生成器的生成数据,该网络试图将观察结果分类为“真实的”或“生成的”。

为了训练GAN,同时训练两个网络以最大化两个网络的性能:

  • 训练生成器生成“欺骗”鉴别器的数据。为了优化生成器的性能,在给定生成的数据时,使鉴别器的损失最大化。换句话说,生成器的目标是生成鉴别器分类为“真实”的数据。

  • 训练鉴别器区分真实数据和生成数据。为了优化鉴别器的性能,在给定批次的真实数据和生成的数据时,尽量减少鉴别器的损失。换句话说,鉴别器的目标是不被生成器“愚弄”。

理想情况下,这些策略会产生一个生成令人信服的真实数据的生成器和一个学习了训练数据特征的强特征表示的鉴别器。有关更多信息,请参见训练生成对抗网络(GAN)

开放实验

首先,打开示例。实验管理器加载一个带有预先配置的实验的项目,您可以检查和运行该实验。打开实验,在实验的浏览器窗格中,双击实验的名称(ImageGenerationExperiment).

自定义训练实验由描述、超参数表和训练函数组成。有关更多信息,请参见配置自定义训练实验

描述字段包含实验的文本描述。对于本例,描述如下:

训练生成对抗网络(GAN)生成花的图像。使用超参数指定:*鉴别器网络中退出层的概率*训练鉴别器网络时需要翻转的真实标签的百分比

Hyperparameters部分指定策略(详尽的扫描)和用于实验的超参数值。运行实验时,“实验管理器”将使用超参数表中指定的超参数值的每个组合来训练网络。这个例子使用了两个超参数:

  • dropoutProb设置鉴别器网络中退出层的概率。默认情况下,此超参数的值指定为[0.25 0.5 0.75]

  • flipFactor设置训练鉴别器网络时翻转的真实标签的百分比。实验利用该超参数为真实数据添加噪声,更好地平衡了鉴别器和生成器的学习。否则,如果鉴别器学习区分真实图像和生成图像的速度太快,那么生成器可能无法训练。此超参数的值指定为[0.1 0.3 0.5]

培训功能指定实验使用的训练数据、网络架构、训练选项和训练程序。训练函数的输入是一个结构,其中包含来自超参数表的字段和实验。监控对象,您可以使用该对象跟踪训练的进度、记录训练使用的度量标准的值,并生成训练图。训练函数返回一个结构,其中包含训练过的生成器网络、训练过的鉴别器网络和用于训练的执行环境。实验管理器保存此输出,因此您可以在训练完成后将其导出到MATLAB工作区。训练函数有六个部分。

  • 初始化输出将网络的初始值设置为空数组,以指示训练尚未开始。实验设置执行环境为“汽车”,所以它在GPU上训练网络(如果GPU可用的话)。使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关更多信息,请参见GPU支金宝app持版本(并行计算工具箱)

输出。发电机= [];输出。鉴别器= [];输出。executionEnvironment =“汽车”
  • 负荷训练数据将实验的训练数据定义为imageDatastore对象。实验使用了Flowers数据集,其中包含3670张花的图像,大约218 MB。有关此数据集的更多信息,请参见图像数据集

班长。状态=“加载数据”
url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile(下载文件夹,“flower_dataset.tgz”);
imageFolder = fullfile(下载文件夹,“flower_photos”);如果~存在(imageFolder“dir”) websave(文件名,url);解压(文件名,downloadFolder)结束
datasetFolder = fullfile(imageFolder);imdsTrain = imageDatastore(数据文件夹,...IncludeSubfolders = true);
augmenter = imageDataAugmenter(RandXReflection=true);augimdsTrain = augmentedImageDatastore([64 64],imdsTrain,...DataAugmentation =增压器);
  • 定义发电机网络将生成器网络的体系结构定义为从随机值的1 × 1 × 100数组生成图像的层图。为了使用自定义训练循环训练网络并启用自动区分,训练函数将层图转换为dlnetwork对象。

班长。状态=“创建生成器”
filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = [4 4 512];
layersGenerator = [featureInputLayer(numLatentInputs,Name= .“在”) projectAndReshapeLayer (projectionSize numLatentInputs Name =“项目”) transposedConv2dLayer (filterSize 4 * numFilters Name =“tconv1”) batchNormalizationLayer (Name =“bnorm1”) reluLayer (Name =“relu1”) transposedConv2dLayer (2 * numFilters filterSize,跨步= 2,裁剪=“相同”、名称=“tconv2”) batchNormalizationLayer (Name =“bnorm2”) reluLayer (Name =“relu2”) transposedConv2dLayer (filterSize numFilters,跨步= 2,裁剪=“相同”、名称=“tconv3”) batchNormalizationLayer (Name =“bnorm3”) reluLayer (Name =“relu3”) transposedConv2dLayer (filterSize 3步= 2,裁剪=“相同”、名称=“tconv4”) tanhLayer (Name =”“双曲正切));
lgraphGenerator = layerGraph(layergenerator);输出。生成器= dlnetwork(lgraphGenerator);
  • 定义鉴别器网络将鉴别器网络的体系结构定义为一个层图,用于对真实的和生成的64 × 64 × 3图像进行分类。退出层使用超参数表中定义的退出概率。为了使用自定义训练循环训练网络并启用自动区分,训练函数将层图转换为dlnetwork对象。

班长。状态=“创建鉴别器”
filterSize = 5;numFilters = 64;inputSize = [64 64 3];dropoutProb = params.dropoutProb;量表= 0.2;
layersDiscriminator = [imageInputLayer(inputSize,归一化=“没有”、名称=“在”) dropoutLayer (dropoutProb Name =“辍学”) convolution2dLayer (filterSize numFilters,跨步= 2,填充=“相同”、名称=“conv1”) leakyReluLayer(规模、Name =“lrelu1”) convolution2dLayer (2 * numFilters filterSize,跨步= 2,填充=“相同”、名称=“conv2”) batchNormalizationLayer (Name =“bn2”) leakyReluLayer(规模、Name =“lrelu2”) convolution2dLayer (filterSize 4 * numFilters,跨步= 2,填充=“相同”、名称=“conv3”) batchNormalizationLayer (Name =“bn3”) leakyReluLayer(规模、Name =“lrelu3”) convolution2dLayer (filterSize 8 * numFilters,跨步= 2,填充=“相同”、名称=“conv4”) batchNormalizationLayer (Name =“bn4”) leakyReluLayer(规模、Name =“lrelu4”) convolution2dLayer(4 1名=“conv5”));
lgraphDiscriminator = layerGraph(layersDiscriminator);输出。discriminator = dlnetwork(lgraphDiscriminator);
  • 指定培训项目定义实验使用的训练选项。在这个例子中,实验管理器使用初始学习率为0.0002,梯度衰减因子为0.5,梯度衰减因子平方为0.999,用128个小批大小的网络训练50个epoch。

numEpochs = 50;miniBatchSize = 128;initialLearnRate = 0.0002;gradientDecayFactor = 0.5;squaredGradientDecayFactor = 0.999;trailingAvgGenerator = [];trailingAvgSqGenerator = [];trailingAvgDiscriminator = [];trailingAvgSqDiscriminator = [];flipFactor = params.flipFactor;
  • 火车模型定义实验使用的自定义训练循环。自定义训练循环使用minibatchqueue处理和管理小批量的图像。对于每个小批量,minibatchqueue对象将重新调整范围[-1,1]中的图像的大小,丢弃任何小于128个观测值的部分小批,并使用维度标签格式化图像数据“SSCB”(空间,空间,通道,批次)。默认情况下,minibatchqueue对象将数据转换为dlarray具有基础类型的对象.对于每个纪元,自定义训练循环对数据存储进行洗牌,并在小批量数据上进行循环。如果在GPU上训练,则数据将转换为gpuArray(并行计算工具箱)对象。然后,训练函数评估模型梯度并更新鉴别器和生成器网络参数。每次迭代自定义训练循环后,训练函数保存训练后的网络并更新训练进度。

班长。度量= [“scoreGenerator”“scoreDiscriminator”“scoreCombined”];班长。包含=“迭代”;groupSubPlot(监控,“综合评分”“scoreCombined”);groupSubPlot(监控,“生成器和判别器分数”...“scoreGenerator”“scoreDiscriminator”]);班长。状态=“培训”
augimdsTrain。MiniBatchSize = MiniBatchSize;mbq = minibatchqueue(augimdsTrain,...MiniBatchSize = MiniBatchSize,...PartialMiniBatch =“丢弃”...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat =“SSCB”...OutputEnvironment = output.executionEnvironment);
迭代= 0;epoch = 1:numEpochs shuffle(mbq);Hasdata (mbq)迭代=迭代+ 1;dlX = next(mbq);Z = randn(numLatentInputs,miniBatchSize,“单身”);dlZ = dlarray(Z,“CB”);如果(输出。executionEnvironment = =“汽车”||...输出。executionEnvironment = =“图形”dlZ = gpuArray(dlZ);结束[gradientsGenerator, gradientsDiscriminator stateGenerator、scoreGenerator scoreDiscriminator] =...dlfeval (@modelGradients output.generator、output.discriminator dlX, dlZ, flipFactor);output.generator.State = stateGenerator;(输出。鉴频器、trailingAvgDiscriminator trailingAvgSqDiscriminator] =...adamupdate (output.discriminator gradientsDiscriminator,...trailingAvgDiscriminator trailingAvgSqDiscriminator,迭代,...initialLearnRate、gradientDecayFactor squaredGradientDecayFactor);(输出。发电机、trailingAvgGenerator trailingAvgSqGenerator] =...adamupdate (output.generator gradientsGenerator,...trailingAvgGenerator trailingAvgSqGenerator,迭代,...initialLearnRate、gradientDecayFactor squaredGradientDecayFactor);scoreGeneratorValue =...双(收集(extractdata (scoreGenerator)));scoreDiscriminatorValue =...双(收集(extractdata (scoreDiscriminator)));scoreCombinedValue = 1-2*max(abs(scoreDiscriminatorValue-0.5),abs(scoreGeneratorValue-0.5));recordMetrics(监控、迭代...scoreGenerator = scoreGeneratorValue,...scoreDiscriminator = scoreDiscriminatorValue,...scoreCombined = scoreCombinedValue);如果班长。停止|| isnan(scoreGeneratorValue) || isnan(scoreDiscriminatorValue)返回结束结束班长。进度= (epoch/numEpochs)*100;结束

训练GANs可能是一项具有挑战性的任务,因为生成器和鉴别器网络在训练过程中相互竞争。如果一个网络学习太快,那么另一个网络就会学习失败。为了帮助您诊断问题并监控生成器和鉴别器实现各自目标的情况,本实验在训练图中显示了一对分数。生成器评分scoreGenerator测量鉴别器能够正确区分生成图像的可能性。鉴别评分scoreDiscriminator测量鉴别器能够正确区分所有输入图像的可能性,假设传递给鉴别器的真实图像和生成图像的数量相等。在理想情况下,两个分数都是0.5。分数太接近于0或1可能表明一个网络主导了另一个。看到监控GAN培训进度,识别常见故障模式

为了帮助你决定哪个试验产生了最好的结果,这个实验将生成器得分和判别器得分合并为一个数值,scoreCombined.该指标使用l-∞规范,以确定两个网络离理想场景有多近。如果两个网络分数都等于0.5,则该值为1,如果其中一个网络分数等于0或1,则为0。

检查训练功能,下培训功能,点击编辑.训练功能在MATLAB®编辑器中打开。此外,训练函数的代码出现在附录1在这个例子的最后。

运行实验

当您运行实验时,实验管理器将多次训练由训练函数定义的网络。每次试验使用不同的超参数值组合。默认情况下,实验管理器每次运行一个试验。如果您有并行计算工具箱,您可以同时运行多个试验。为了获得最好的结果,在运行实验之前,启动一个具有与gpu一样多的worker的并行池。有关更多信息,请参见使用实验管理器并行训练网络

  • 若要一次运行一个试验,请在“实验管理器”工具条上单击运行

  • 若要同时运行多个试验,请单击使用并行然后运行.如果当前没有并行池,experimental Manager将使用默认集群配置文件启动一个并行池。然后,根据可用的并行工作人员的数量,实验管理器执行多个同时进行的试验。

结果表显示了每个试验的训练损失和验证精度。

当实验正在运行时,单击培训策划展示训练图,跟踪每次试验的进度。

评估结果

要为您的实验找到最佳结果,请使用综合分数对结果表进行排序。

  1. 指向scoreCombined列。

  2. 单击三角形图标。

  3. 选择按降序排序

综合得分最高的试验出现在结果表的顶部。

通过生成和检查经过训练的生成器生成的图像来评估GAN的质量。

  1. 选择综合得分最高的试验。

  2. 实验管理器将来发布,点击出口

  3. 在对话框窗口中,为导出的训练输出输入工作区变量的名称。默认名称为trainingOutput

  4. 方法测试已训练的生成器网络generateTestImages函数中列出的附录3在这个例子的最后。使用导出的训练输出作为函数的输入。例如,在MATLAB命令窗口中输入:

generateTestImages (trainingOutput)

该函数创建一批25个随机向量输入到生成器网络,并显示生成的图像。

使用综合评分对结果进行排序可能无法在所有情况下确定最佳试验。为了获得最好的结果,对每个综合得分较高的试验重复这个过程,直观地检查生成器是否生成了各种图像而没有许多重复。如果图像几乎没有多样性,其中一些几乎相同,那么您的生成器可能会受到模式崩溃的影响。有关更多信息,请参见模式崩溃

要记录对实验结果的观察,请添加注释。

  1. 在结果表中,右键单击scoreCombined最好的审判。

  2. 选择添加注释

  3. 注释窗格,在文本框中输入您的观察结果。

有关更多信息,请参见对实验结果进行排序、过滤和注释

重新运行实验

在确定生成最佳图像的超参数组合后,再运行第二次实验,以训练网络更长的时间。

  1. 返回到实验定义窗格。

  2. 在超参数表中,输入来自最佳试验的超参数值。例如,要使用来自试验3的值,请更改的值dropoutProb0.75而且flipFactor0.1

  3. 打开训练功能,指定更长的训练时间。下指定培训项目的值numEpochs500

  4. 使用新的超参数值和训练函数进行实验。实验管理器运行单个试验。训练时间比之前的试验长10倍。

  5. 实验完成后,导出训练输出并运行generateTestImages函数测试新的发电机网络。与前面一样,在视觉上检查生成器是否生成了各种图像,而没有许多重复的图像。

关闭实验

实验的浏览器窗格中,右键单击项目的名称并选择关闭项目.实验管理器关闭项目中包含的所有实验和结果。

附录1:培训功能

这个函数指定了实验使用的训练数据、网络架构、训练选项和训练过程。

输入

  • 参数个数是一个包含来自experimental Manager超参数表字段的结构。

  • 监控是一个实验。监控对象,您可以使用该对象跟踪训练的进度、更新结果表中的信息字段、记录训练使用的度量值以及生成训练图。

输出

  • 输出是一个结构,其中包含训练过的生成器网络、训练过的鉴别器网络和用于训练的执行环境。实验管理器保存此输出,因此您可以在训练完成后将其导出到MATLAB工作区。

函数output = ImageGenerationExperiment_training1(params,monitor)输出。发电机= [];输出。鉴别器= [];输出。executionEnvironment =“汽车”;班长。状态=“加载数据”;url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile(下载文件夹,“flower_dataset.tgz”);imageFolder = fullfile(下载文件夹,“flower_photos”);如果~存在(imageFolder“dir”) websave(文件名,url);解压(文件名,downloadFolder)结束datasetFolder = fullfile(imageFolder);imdsTrain = imageDatastore(数据文件夹,...IncludeSubfolders = true);augmenter = imageDataAugmenter(RandXReflection=true);augimdsTrain = augmentedImageDatastore([64 64],imdsTrain,...DataAugmentation =增压器);班长。状态=“创建生成器”;filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = [4 4 512];layersGenerator = [featureInputLayer(numLatentInputs,Name= .“在”) projectAndReshapeLayer (projectionSize numLatentInputs Name =“项目”) transposedConv2dLayer (filterSize 4 * numFilters Name =“tconv1”) batchNormalizationLayer (Name =“bnorm1”) reluLayer (Name =“relu1”) transposedConv2dLayer (2 * numFilters filterSize,跨步= 2,裁剪=“相同”、名称=“tconv2”) batchNormalizationLayer (Name =“bnorm2”) reluLayer (Name =“relu2”) transposedConv2dLayer (filterSize numFilters,跨步= 2,裁剪=“相同”、名称=“tconv3”) batchNormalizationLayer (Name =“bnorm3”) reluLayer (Name =“relu3”) transposedConv2dLayer (filterSize 3步= 2,裁剪=“相同”、名称=“tconv4”) tanhLayer (Name =”“双曲正切));lgraphGenerator = layerGraph(layergenerator);输出。生成器= dlnetwork(lgraphGenerator);班长。状态=“创建鉴别器”;filterSize = 5;numFilters = 64;inputSize = [64 64 3];dropoutProb = params.dropoutProb;量表= 0.2;layersDiscriminator = [imageInputLayer(inputSize,归一化=“没有”、名称=“在”) dropoutLayer (dropoutProb Name =“辍学”) convolution2dLayer (filterSize numFilters,跨步= 2,填充=“相同”、名称=“conv1”) leakyReluLayer(规模、Name =“lrelu1”) convolution2dLayer (2 * numFilters filterSize,跨步= 2,填充=“相同”、名称=“conv2”) batchNormalizationLayer (Name =“bn2”) leakyReluLayer(规模、Name =“lrelu2”) convolution2dLayer (filterSize 4 * numFilters,跨步= 2,填充=“相同”、名称=“conv3”) batchNormalizationLayer (Name =“bn3”) leakyReluLayer(规模、Name =“lrelu3”) convolution2dLayer (filterSize 8 * numFilters,跨步= 2,填充=“相同”、名称=“conv4”) batchNormalizationLayer (Name =“bn4”) leakyReluLayer(规模、Name =“lrelu4”) convolution2dLayer(4 1名=“conv5”));lgraphDiscriminator = layerGraph(layersDiscriminator);输出。discriminator = dlnetwork(lgraphDiscriminator);numEpochs = 50;miniBatchSize = 128;initialLearnRate = 0.0002;gradientDecayFactor = 0.5;squaredGradientDecayFactor = 0.999;trailingAvgGenerator = []; trailingAvgSqGenerator = []; trailingAvgDiscriminator = []; trailingAvgSqDiscriminator = []; flipFactor = params.flipFactor; monitor.Metrics = [“scoreGenerator”“scoreDiscriminator”“scoreCombined”];班长。包含=“迭代”;groupSubPlot(监控,“综合评分”“scoreCombined”);groupSubPlot(监控,“生成器和判别器分数”...“scoreGenerator”“scoreDiscriminator”]);班长。状态=“培训”;augimdsTrain。MiniBatchSize = MiniBatchSize;mbq = minibatchqueue(augimdsTrain,...MiniBatchSize = MiniBatchSize,...PartialMiniBatch =“丢弃”...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat =“SSCB”...OutputEnvironment = output.executionEnvironment);迭代= 0;epoch = 1:numEpochs shuffle(mbq);Hasdata (mbq)迭代=迭代+ 1;dlX = next(mbq);Z = randn(numLatentInputs,miniBatchSize,“单身”);dlZ = dlarray(Z,“CB”);如果(输出。executionEnvironment = =“汽车”||...输出。executionEnvironment = =“图形”dlZ = gpuArray(dlZ);结束[gradientsGenerator, gradientsDiscriminator stateGenerator、scoreGenerator scoreDiscriminator] =...dlfeval (@modelGradients output.generator、output.discriminator dlX, dlZ, flipFactor);output.generator.State = stateGenerator;(输出。鉴频器、trailingAvgDiscriminator trailingAvgSqDiscriminator] =...adamupdate (output.discriminator gradientsDiscriminator,...trailingAvgDiscriminator trailingAvgSqDiscriminator,迭代,...initialLearnRate、gradientDecayFactor squaredGradientDecayFactor);(输出。发电机、trailingAvgGenerator trailingAvgSqGenerator] =...adamupdate (output.generator gradientsGenerator,...trailingAvgGenerator trailingAvgSqGenerator,迭代,...initialLearnRate、gradientDecayFactor squaredGradientDecayFactor);scoreGeneratorValue =...双(收集(extractdata (scoreGenerator)));scoreDiscriminatorValue =...双(收集(extractdata (scoreDiscriminator)));scoreCombinedValue = 1-2*max(abs(scoreDiscriminatorValue-0.5),abs(scoreGeneratorValue-0.5));recordMetrics(监控、迭代...scoreGenerator = scoreGeneratorValue,...scoreDiscriminator = scoreDiscriminatorValue,...scoreCombined = scoreCombinedValue);如果班长。停止|| isnan(scoreGeneratorValue) || isnan(scoreDiscriminatorValue)返回结束结束班长。进度= (epoch/numEpochs)*100;结束结束

附录2:自定义培训助手函数

该函数使用以下步骤对数据进行预处理:

  1. 从传入单元格数组中提取图像数据并连接到数值数组中。

  2. 将图像重新缩放到范围[-1,1]。

函数X = preprocessMiniBatch(data) X = cat(4,data{:});(X,-1,1,InputMin=0,InputMax=255);结束

该函数将生成器和鉴别器作为输入dlnetwork对象(dlnetGenerator而且dlnetDiscriminator),一小批输入数据(dlX),一个随机值数组(dlZ),以及需要翻转的真实标签的百分比(flipFactor),并返回损失相对于网络中可学习参数的梯度、生成器状态以及两个网络的分数。由于鉴别器输出不在[0,1]范围内,modelGradients应用乙状结肠函数将此值转换为概率。

函数[gradientsGenerator, gradientsDiscriminator stateGenerator、scoreGenerator scoreDiscriminator] =...modelGradients(dlnetGenerator,dlnetDiscriminator,dlX,dlZ,flipFactor) dlYPred = forward(dlnetDiscriminator,dlX);[dlXGenerated,stateGenerator] = forward(dlnetGenerator,dlZ);dlYPredGenerated = forward(dlnetDiscriminator,dlXGenerated);probGenerated = sigmoid(dlYPredGenerated);probReal = sigmoid(dlYPred);scoreDiscriminator = ((mean(probReal)+mean(1-probGenerated))/2);scoreGenerator = mean(probGenerated);numObservations = size(probReal,4);idx = randperm(numObservations,floor(flipFactor*numObservations));probReal(:,:,:,idx) = 1-probReal(:,:,:,idx); [lossGenerator,lossDiscriminator] = GANLoss(probReal,probGenerated); gradientsGenerator = dlgradient(lossGenerator,...dlnetGenerator.Learnables RetainData = true);gradientsDiscriminator = dlgradient(lossDiscriminator,...dlnetDiscriminator.Learnables);结束

此函数返回鉴别器和生成器网络的损失。

函数[lossGenerator, lossDiscriminator] =...GANLoss(probReal,probGenerated) lossDiscriminator = -mean(log(probReal))-mean(log(1-probGenerated));lossGenerator = -mean(log(probGenerated));结束

附录3:生成测试图像

这个函数创建一批25个随机向量输入到生成器网络,并显示生成的图像。使用此函数可以直观地检查生成器是否生成了各种图像而没有许多重复。如果图像几乎没有多样性,其中一些几乎相同,那么您的生成器可能会受到模式崩溃的影响。

函数generateTestImages(trainingOutput) dlnetGenerator = trainingOutput.generator;executionEnvironment = trainingOutput.executionEnvironment;numLatentInputs = 100;numTestImages = 25;ZTest = randn(numLatentInputs,numTestImages,“单身”);dlZTest = dlarray(ZTest,“CB”);如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlZTest = gpuArray(dlZTest);结束dlXGeneratedTest = predict(dlnetGenerator,dlZTest);I = imtile(extractdata(dlXGeneratedTest));I = rescale(I);图像(I)轴标题(“生成的图像”结束

另请参阅

应用程序

对象

相关的话题