此示例示出了如何准备的数据存储用于使用所述训练的图像 - 图像回归网络转变
和结合
功能ImageDatastore
。
这个例子展示了如何使用一个适合训练去噪网络的管道来预处理数据。本例然后使用预处理的噪声数据来训练一个简单的卷积自编码器网络来去除图像噪声。
此示例使用,其中输入图像的像素的一小部分要么设置为椒盐噪声模型0
要么1
(黑色和白色,分别)。嘈杂的图像作为网络的输入。原始图像充当预期的网络响应。网络学会了检测和去除盐和胡椒的噪音。
在数字数据集中加载原始图像imageDatastore
。数据存储区中包含从0到9的图像的数字万个合成影像通过施加随机转换来使用不同的字体创建的数字图像被生成。每个数字图像是28逐28个像素。数据存储区中包含每个类别的图像的数目相等。
digitDatasetPath = fullfile (matlabroot,'工具箱','NNET',…“nndemos”,'nndatasets','DigitDataset');IMDS = imageDatastore(digitDatasetPath,…'IncludeSubfolders',真的,…'LABELSOURCE',“foldernames”);
指定一个较大的读取尺寸,以尽量减少文件I / O的成本。
imds.ReadSize = 500;
设置全局随机数发生器的种子结果的可重复性,以帮助。
rng (0)
使用拖曳
功能洗牌前的数字数据训练。
IMDS =洗牌(IMDS);
使用splitEachLabel
功能划分洛桑国际管理发展学院
转换为包含原始图像的三个图像数据存储,用于培训、验证和测试。
[imdsTrain,imdsVal,imdsTest] = splitEachLabel(IMDS,0.95,0.025);
使用转变
函数创建每个输入图像的噪声版本,作为网络输入。的转变
函数从基础数据存储读取数据,并使用helper函数中定义的操作处理数据addNoise
(在本例末尾定义)。的输出转变
函数是一个TransformedDatastore
。
dsTrainNoisy =变换(imdsTrain,@ addNoise);dsValNoisy =变换(imdsVal,@ addNoise);dsTestNoisy =变换(imdsTest,@ addNoise);
使用结合
函数应用于所述噪声图像和原始图像组合成,要馈送的数据的单个数据存储trainNetwork
。这样的组合数据存储将成批的数据读取到一个两列单元格数组中trainNetwork
。的输出结合
函数是一个CombinedDatastore
。
dsTrain =结合(dsTrainNoisy,imdsTrain);dsVal =结合(dsValNoisy,imdsVal);dsTest =结合(dsTestNoisy,imdsTest);
使用转变
函数来执行所共有的输入和响应数据存储两个附加的预处理操作。的commonPreprocessing
辅助功能(在本实施例的端定义)调整大小的输入和响应图像为32×32像素以匹配网络的输入尺寸,并且每个图像中的数据归一化到[0,1]的范围内。
dsTrain =变换(dsTrain,@ commonPreprocessing);dsVal =变换(dsVal,@ commonPreprocessing);dsTest =变换(dsTest,@ commonPreprocessing);
最后,使用转变
函数随机扩增加入到训练集。的augmentImages
helper函数(在本例的最后定义)对数据应用随机的90度旋转。相同的旋转应用于网络输入和相应的期望响应。
dsTrain =变换(dsTrain,@ augmentImages);
增强可以减少过拟合,并增加了训练网络中旋转存在的鲁棒性。验证或测试数据集不需要随机增加。
由于有几个必要准备训练数据预处理操作,预览经过预处理的数据,以确认它之前的训练看起来是正确的。使用预览
功能预览数据。
成对的嘈杂的可视化的实施例和使用所述原始图像蒙太奇
(图像处理工具箱)函数。训练数据看起来是正确的。椒盐噪声出现在左边栏输入图像。除了增加的噪声,输入图像和响应图像是相同的。随机旋转90度以相同的方式施加到两个输入端和响应图像。
exampleData =预览(dsTrain);输入= exampleData(:,1);响应= exampleData(:,2);minibatch =猫(2,输入,响应);蒙太奇(minibatch”,'尺寸'[8 2])标题(“输入(左)和响应(右)”)
卷积自动编码是图像去噪的通用架构。卷积自动编码由两个阶段组成:编码器和解码器。该编码器压缩的原始输入图像分割为潜表示,其是在宽度和高度,有每个空间位置的许多特征地图比原始输入图像变小,但在更深的意义。压缩潜表示失去空间分辨率的一些量在其恢复原始图像中的高频特性的能力,但它也学会不包括在原始图像的编码噪声的伪影。解码器重复上采样所述经编码信号,将其移动回其原始宽度,高度,和信道数目。由于编码器的噪声消除,解码最终图像具有较少的噪声伪影。
这个例子定义了使用来自深度学习工具箱层™,包括卷积自动编码器网络:
imageInputLayer
- 图像输入层
convolution2dLayer
- 卷积层为卷积神经网络
reluLayer
-直线单元层
maxPooling2dLayer
- 2-d最大池层
transposedConv2dLayer
- 换位卷积层
clippedReluLayer
- 削波整流的线性单元层
regressionLayer
- 回归输出层
创建图像输入层。为了简化相关的下采样和上采样因子的两个填充的担忧,选择32×32大小的输入,因为32是由图2,图4,和图8干净整除。
imageLayer = imageInputLayer([32,32,1]);
创建编码层。编码器的下采样是通过最大池大小为2,步长为2来实现的。
encodingLayers = […convolution2dLayer(3,16,'填充','相同')…reluLayer,…maxPooling2dLayer(2,'填充','相同',“步”,2),…convolution2dLayer(3,8,'填充','相同')…reluLayer,…maxPooling2dLayer(2,'填充','相同',“步”,2),…convolution2dLayer(3,8,'填充','相同')…reluLayer,…maxPooling2dLayer(2,'填充','相同',“步”, 2)];
创建解码层。解码器使用上采样的转置卷积层的编码信号。通过创建一个具有正确的采样系数转置卷积层createUpsampleTransponseConvLayer
helper函数。这个函数在本例的最后定义。
网络使用clippedReluLayer
作为最终激活层到强制输出是在[0,1]的范围内。
decodingLayers = […createUpsampleTransponseConvLayer(2,8),…reluLayer,…createUpsampleTransponseConvLayer(2,8),…reluLayer,…createUpsampleTransponseConvLayer (16),…reluLayer,…convolution2dLayer(3,1,'填充','相同')…clippedReluLayer (1.0),…regressionLayer];
将图像输入层、编码层、解码层串联起来,形成卷积式自编码器网络架构。
层= [imageLayer、encodingLayers decodingLayers];
使用Adam优化器训练网络。属性指定超参数设置trainingOptions
函数。列车100个时代。综合数据存储(当您使用创建结合
功能)不支持互换,以便指定在S金宝apphuffle
参数,“永远”
。
选项= trainingOptions(“亚当”,…“MaxEpochs”, 100,…“MiniBatchSize”imds.ReadSize,…'ValidationData',dsVal,…“洗牌”,“永远”,…“阴谋”,“训练进步”,…“放牧”,假);
配置好数据源和训练选项后,使用trainNetwork
函数。一个支持CUDA的NVIDIA GPU™计算能力3.0或更高版本强烈建议进行培训。
注:培训承担的英伟达™泰坦XP GPU约25分钟。
净= trainNetwork(dsTrain,层,选项);
通过使用获得来自测试组输出图像预测
函数。
ypred =预测(净,dst);
可视化的样品输入图像和从所述网络相关联的输出的预测得到的去噪如何工作的感觉。正如预期的那样,从网络输出图像已经除去大部分从输入图像中的噪声伪影。去噪图像是作为编码和解码处理的结果略微模糊。
inputImageExamples =预览(dsTest);蒙太奇({inputImageExamples {1},ypred(:,:,:,1)});
通过分析峰值信噪比(PSNR)来评估网络性能。
REF = inputImageExamples {1,2};originalNoisyImage = inputImageExamples {1,1};psnrNoisy = PSNR(originalNoisyImage,REF)
psnrNoisy =单18.6498
psnrDenoised = psnr (ypred(::,:, 1),裁判)
psnrDenoised =单21.8640
输出图像的PSNR比噪声的输入图像更高的,如所预期。
这个示例展示了如何使用转变
和结合
功能ImageDatastore
建立对数字数据集进行卷积自动编码器训练和评估所需的数据预处理。
的addNoise
辅助函数,通过使用添加了椒盐噪声到图像imnoise
(图像处理工具箱)函数。的addNoise
函数需要输入数据的格式是图像数据的单元阵列,其中数据由返回的格式相匹配读
功能ImageDatastore
。
功能dataOut = data;为IDX = 1:大小(数据,1)DATAOUT {IDX} = imnoise(数据{IDX}'椒盐');结束结束
的commonPreprocessing
辅助函数定义是共同的训练,验证和测试集的预处理。该辅助函数执行这些预处理步骤。
辅助功能需要输入数据的格式为图像数据的两列的单元阵列,其中数据由返回的格式相匹配读
功能CombinedDatastore
。
功能DATAOUT = commonPreprocessing(数据)DATAOUT =小区(大小(数据));为COL = 1:大小(数据,2)为idx = 1:尺寸(数据,1)temp =单(数据{idx,坳});temp = imresize (temp,[32岁,32]);temp =重新调节(临时);dataOut {idx,坳}= temp;结束结束结束
的augmentImages
方法为数据添加随机的90度旋转rot90
函数。相同的旋转应用于网络输入和相应的期望响应。该功能需要输入数据的格式为图像数据的两列的单元阵列,其中数据由返回的格式相匹配读
功能CombinedDatastore
。
功能DATAOUT = augmentImages(数据)DATAOUT =小区(大小(数据));为rot90Val = randi(4,1,1)-1;dataOut (idx:) = {rot90(数据{idx 1}, rot90Val), rot90(数据{idx 2}, rot90Val)};结束结束
的createUpsampleTransposeConvLayer
辅助函数定义了一个转置的卷积层,它按指定的因子向上采样层输入。
功能OUT = createUpsampleTransponseConvLayer(因子,numFilters)filterSize = 2 *因子 - MOD(因子,2);裁剪=(因子-MOD(因子,2))/ 2;numChannels = 1;OUT = transposedConv2dLayer(filterSize,numFilters,…'NumChannels'numChannels,“步”因素,“裁剪”,裁剪);结束
结合
|imageDatastore
|trainingOptions
|trainNetwork
|转变