主要内容

基于小波散射的数字分类

这个例子展示了如何使用小波散射进行图像分类。这个例子需要小波工具箱™,深度学习工具箱™和并行计算工具箱™。

对于分类问题,将数据映射到一些替代表示是很有用的,这些替代表示丢弃了不相关的信息,同时保留了每个类的区别属性。小波图像散射构造了对平移和小变形不敏感的图像的低方差表示。因为图像中的平移和小变形不会影响类的隶属度,所以散射变换系数提供了可以用来构建健壮分类模型的特征。

小波散射是通过一系列小波变换、非线性和平均[1][3][4]来级联图像的。结果是特征提取就是在散射变换表示中,同一类的图像向彼此移动得更近,而不同类的图像向彼此移动得更远。虽然小波散射变换与深度卷积神经网络在结构上有许多相似之处,包括卷积运算符、非线性和平均,但散射变换中的滤波器是预先定义的和固定的。

数字图像

本例中使用的数据集包含10,000张从0到9的合成图像。这些图像是通过对使用不同字体创建的这些数字的图像应用随机转换生成的。每个数字图像是28 × 28像素。数据集包含每个类别相同数量的图像。使用imageDataStore读取图像。

digitDatasetPath = fullfile (matlabroot,“工具箱”“nnet”“nndemos”“nndatasets”“DigitDataset”);imd = imageDatastore (digitDatasetPath,“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

从数据集中随机选择并绘制20张图像。

图numImages = 10000;rng (100);烫= randperm (numImages 20);Np = 1:20 subplot(4,5, Np);imshow (Imds.Files{烫发(np)});结束

你可以看到8s表现出相当大的可变性,而所有都可以被识别为8。样本中其他重复的数字也是如此。这与自然手写是一致的,在自然手写中,每个人的任何数字都有很大的不同,甚至在同一个人的手写中,关于平移、旋转和其他小的变形。使用小波散射,我们希望建立这些数字的表示,掩盖不相关的可变性。

小波图像散射特征提取

合成图像是28乘28的。建立小波图像散射框架,并设置不变尺度与图像大小相等。在两个小波散射滤波器组中设置旋转的次数为8。小波散射框架的构造要求我们只设置两个超参数InvarianceScaleNumRotations

科幻小说= waveletScattering2 (“图象尺寸”28 [28],“InvarianceScale”28岁...“NumRotations”[8]);

本例利用MATLAB™的并行处理能力数组接口。如果并行池当前没有运行,您可以通过执行以下代码启动一个并行池。或者,第一次创建数组时,创建并行池。

如果parpool isempty (gcp);结束
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。

为了再现性,设置随机数生成器。洗牌的文件imageDatastore并将这10000张图片分成两组,一组用于训练,另一组用于测试。将80%的数据(即8000张图像)分配到训练集,并将剩余的2000张图像保留下来进行测试。创建来自训练和测试数据集的数组。使用helper函数helperScatImages从散射变换系数中创建特征向量。helperScatImages得到散射变换特征矩阵的对数以及每幅图像的行维和列维的均值。的代码helperScatImages是在这个例子的最后。对于本例中的每个图像,helper函数创建一个217乘1的特征向量。

rng (10);imd = shuffle (imd);[trainImds, testImds] = splitEachLabel (imd, 0.8);Ttrain =高(trainImds);tt =高(testImds);trainfeatures = cellfun (@ (x) helperScatImages(科幻,x), Ttrain,“UniformOutput”、假);testfeatures = cellfun (@ (x) helperScatImages(科幻,x), tt,“UniformOutput”、假);

使用收集能够将所有的培训和测试功能连接起来。

Trainf =收集(trainfeatures);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 3 min 51 sec
trainfeatures =猫(2,Trainf {:});Testf =收集(testfeatures);
使用Parallel Pool 'local'计算tall表达式:Pass 1 of 1: Completed in 49 sec
testfeatures =猫(2,Testf {:});

前面的代码得到两个矩阵,行维217,列维分别等于训练集和测试集中的图像数。因此,每一列都是对应图像的特征向量。原始图像包含784个元素。散射系数表示每幅图像的大小大约减少了4倍。

PCA模型与预测

这个例子基于每个类的散射特征向量的主分量构造了一个简单的分类器。分类器在函数中实现helperPCAModelhelperPCAClassifierhelperPCAModel根据散射特征确定每个数字类的主成分。的代码helperPCAModel是在这个例子的最后。helperPCAClassifier对保留的测试数据进行分类,方法是在每个测试特征向量的主成分与训练集之间找到最接近的匹配(最佳投影),并相应地分配类。的代码helperPCAClassifier是在这个例子的最后。

模型= helperPCAModel (trainfeatures 30 trainImds.Labels);predlabels = helperPCAClassifier (testfeatures模型);

在构建模型并对测试集进行分类后,确定测试集分类的准确性。

=总和(testImds准确性。标签= = predlabels)。/元素个数(testImds.Labels) * 100
精度= 99.6000

我们对测试数据的正确分类达到了99.6%。要查看这2000张测试图像是如何分类的,请绘制混淆矩阵。每10个类的测试集中都有200个例子。

图;confusionchart (testImds.Labels predlabels)标题(“测试集混淆矩阵—小波散射”

美国有线电视新闻网

在本节中,我们训练一个简单的卷积神经网络(CNN)来识别数字。构造CNN,使其由20个具有1 × 1步幅的5 × 5滤波器的卷积层组成。遵循卷积层与RELU激活和最大池化层。使用一个完全连接层,然后是一个softmax层来将完全连接层的输出归一化到概率。使用交叉熵损失函数进行学习。

imageSize = [28 28 1];层= [...imageInputLayer([28 28 1])卷积2dlayer (5,20) reluLayer maxPooling2dLayer(2, 20)“步”,2) fulllyconnectedlayer (10) softmaxLayer classificationLayer;

使用带动量的随机梯度下降法,学习率为0.0001进行训练。设置最大周期数为20。为了重现性,设置ExecutionEnvironment“cpu”

选择= trainingOptions (“个”...“MaxEpochs”, 20岁,...“InitialLearnRate”1的军医,...“详细”假的,...“阴谋”“训练进步”“ExecutionEnvironment”“cpu”);

培训网络。为了训练和测试,我们使用与散射变换相同的数据集。

重置(trainImds);重置(testImds);网= trainNetwork (trainImds层,选项);

训练结束时,CNN在训练集上的表现接近100%。使用训练过的网络对保留的测试集进行预测。

testImds YPred =分类(净,“ExecutionEnvironment”“cpu”);DCNNaccuracy = sum(YPred == testImds.Labels)/numel(YPred)*100
DCNNaccuracy = 95.5000

简单的CNN在保留测试集上取得了95.5%的正确分类。为CNN绘制混淆图。

图;confusionchart (testImds.Labels YPred)标题(“测试集混淆图——CNN”

总结

这个例子使用小波图像散射来创建数字图像的低方差表示,用于分类。使用固定滤波器权重的散射变换和一个简单的主成分分类器,我们在一个保留测试集上获得了99.6%的正确分类。在一个简单的CNN中学习滤波器,我们获得了95.5%的正确率。这个例子并不是用来直接比较散射变换和cnn的。在每种情况下,都可以进行多个超参数和架构更改,这将显著影响结果。这个例子的目的仅仅是演示深度特征提取器(如小波散射变换)在生成用于学习的数据的稳健表示方面的潜力。

参考文献

布鲁纳J.和S.马拉特。“不变散射卷积网络”模式分析与机器智能学报.第35卷第8期,2013年,1872-1886页。

[2] Mallat, S。“集团不变的散射。”纯粹和应用数学交流.第65卷第10期,2012年,1331-1398页。

Sifre, L.和S. Mallat。旋转,缩放和变形不变散射用于纹理识别2013 IEEE计算机视觉与模式识别学术会议.2013年,页1233 - 1240。10.1109 / CVPR.2013.163。

附录-支持功能金宝app

helperScatImages

函数特点= helperScatImages(科幻,x)%这个函数只支持小波工具箱中的示例。金宝app%它可能会在未来的版本中改变或被删除。版权所有2018 MathWorkssmat = featureMatrix(科幻,x,“转换”“日志”);特点=平均(平均(smat, 2), 3);结束

helperPCAModel

函数模型= helperPCAModel(特性、M标签)%这个函数只是支持小波图像散射的例子金宝app%小波工具箱。它可能会在未来的版本中更改或删除。% model = helperpcamdel(特征,M,标签)版权所有2018 MathWorks初始化结构数组以保存仿射模型模型=结构(“暗”[],“亩”[],“U”[],“标签”分类([]),“年代”[]);模型。昏暗的= M;%获取类的数量LabelCategories =类别(标签);类=元素个数(类别(标签));kk = 1:Nclasses Class = LabelCategories{kk};找到每个类对应的索引idxClass = label == Class;%提取每个类的特征向量tmpFeatures =特性(:,idxClass);确定每个类的平均值模型。μ{kk} =意味着(tmpFeatures, 2);[model.U {kk},模型。年代{kk}] = scatPCA (tmpFeatures);如果(model. u {kk},2) > M模型。U {kk} = model.U {kk} (:, 1: M);模型。年代{kk} = model.S {kk} (1: M);结束model.Labels (kk) =类;结束函数(u, v) = scatPCA (x, M)%计算x沿二维的主分量。如果nargin > 1 && M >%如果M不为零,计算前M个主成分。(u, v) =圣言(x-sig_mean (x) M);s = abs(诊断接头(s) /√(大小(x, 2) 1)) ^ 2;其他的%否则,计算所有的主成分。%每一行是一个观测值,即散射路径的数目%每一列是一个类观察(u, d) = eig (x (x '));位于[s] =排序(诊断接头(d),“下”);u = u(:,印第安纳州);结束结束结束

helperPCAClassifier

函数标签= helperPCAClassifier(特性,模型)%这个函数只是支持小波图像散射的例子金宝app%小波工具箱。它可能会在未来的版本中更改或删除。% model是一个包含字段M、mu、v和Labels的结构数组%特征为测试数据的矩阵,为n -by- l, n为%散射路径,L为测试例数。每一列的%特性是一个测试示例。版权所有2018 MathWorkslabelIdx = determineClass(特性,模型);标签= model.Labels (labelIdx);%返回与imageDatastore标签一致的列向量标签=标签(:);%--------------------------------------------------------------------------函数labelIdx = determineClass(特性,模型)%确定类的数量类=元素个数(model.Labels);初始化误差矩阵errMatrix =正(类、尺寸(功能,2));数控= 1:类%类质心μ= model.mu{数控};u = model.U{数控};% 1-by-L: errMatrix (nc) = projectionError(特性、μu);结束沿着类尺寸确定最小值[~, labelIdx] = min (errMatrix [], 1);%--------------------------------------------------------------------------函数totalerr = projectionError(特性、μu)人大=大小(u, 2);L =大小(功能,2);%减去类均值:Ns-by-L减去Ns-by-1s = features-mu;% 1-by-LnormSqX =总和(abs (s)。^ 2,1)';呃=正(人大+ 1,L);:犯错(1)= normSqX;犯错(2:,:)= abs (u ' *。^ 2;% 1-by-Ltotalerr =√sum(呃,1));结束结束结束

另请参阅

相关的例子

更多关于