深度学习

理解和使用深度学习网络

在嘈杂的海洋中寻找信息

以下是MathWorks首席应用工程师Brett Shoelson博士的客座文章

对于今天的博客,我想提出一个问题:

假设你有很多数据代表一些非常随机的东西,但它有一个非常小的“提示”,将数据区分为两个不同的类别——例如,嘈杂的基因组群体中的一个核苷酸缺陷。(好吧,也许这有点夸张。)但是,在一个嘈杂的数据集中,给定一个信息“位”,你如何发现它的信息呢?

内容

让我们创建(并可视化)一个设置问题的数据集

首先,创建10,000个随机的20 × 20矩阵。

rng (0);N = 10000;Sz = [20 20];A = rand(sz(1), sz(2), 1, n);

创建一个“Tell”:

现在我们将把一个随机选择的像素转换为class1/class2的“tell”或“indicator”:

randomInformationalElement = randi(sz(1) * sz(2)) [rowIndTrue, colIndTrue] = ind2sub(size(a), randomInformationalElement);在随机选择的位置,我们将设置一半的图像为。%有一个随机值,而另一半有一个不同的随机值%值:% 1级:class1Val = rand(1);a(rowIndTrue, colIndTrue, ii) = class1Val;% 1结束%二班:class2Val = rand(1);ii = n/2 + 1: a(rowIndTrue, colIndTrue, ii) = class2Val;% 0.5结束%并且我们将创建分类标签来跟踪“类”:标签= [repmat(categorical(“class1”), n/2, 1);repmat(分类(“class2”), n/2, 1)];总结(标签)
randomInformationalElement = 193 class1 5000 class2 5000

让我们来看看每个班的三个例子。你能看出来吗?

图(“名字”“样本”);Inds = [1:3, n-2:n];布局= tiledlayout(2,3,“TileSpacing”“紧凑”);Ax = gobjects(2,3);Ind = 1;Ii = inds ax(ind) = nexttile(布局);请稍等(a(:,:, ii))如果2 .题目(“1级”“颜色”“r”“字形大小”, 18);elseif题目:二班的“颜色”“r”“字形大小”, 18);结束Ind = Ind + 1;结束

现在呢?

2 = 1:6 plot(ax(ii), colIndTrue, rowIndTrue,“gs”“MarkerSize”12“线宽”, 2)结束linkaxes (ax)组(ax,“xlim”, [0.85*colIndTrue, 1.15*colIndTrue],...“ylim”, [0.85*rowIndTrue, 1.15*rowIndTrue])

秘密在哪里?

这里的目标是找到一个模型来检测信息位——从而将矩阵分为两类。敏锐的读者可能会意识到,一个人可以简单地看矩阵的最小标准差,例如,找到信息位:

图(“名字”“找到了!”) stdA = std(a, 1, ndims(a));imshow (stdA []);标题(“标准差”)检测=查找(stdA == min(stdA(:)));[rowIndDetected, colIndDetected] = ind2sub(size(a), detection);持有情节(colIndTrue rowIndTrue,“gs”“MarkerSize”12“线宽”, 4) plot(colIndDetected, rowIndDetected,“rs”“MarkerSize”12...“线宽”, 1.5);如果detection == randomInformationalElement detected =“真正的”其他的发现=“假”结束标题("信息位= "+检测+”?(“+检测+")"

混淆

显然这有点做作。我们可以通过改变一些模糊的值来进一步混淆它。例如:

Jj = 1:10 confounder = randi(sz(1) * sz(2));[rowInd, colInd] = ind2sub(size(a), confounder);R = rand(1);2:n a(rowInd, colInd, ii) = R;结束R = rand(1);2:n a(rowInd, colInd, ii) = R;结束结束图(“名字”“混淆”) stdA = std(a, 1, ndims(a));imshow (stdA []);标题(“标准差”)检测=查找(stdA == min(stdA(:)));[rowIndDetected, colIndDetected] = ind2sub(size(a), detection);持有情节(colIndTrue rowIndTrue,“gs”“MarkerSize”12“线宽”, 4) plot(colIndDetected, rowIndDetected,“rs”“MarkerSize”12...“线宽”, 1.5);如果detection == randomInformationalElement detected =“真正的”其他的发现=“假”结束标题("信息位= "+检测+”?(“+检测+")"

现在的信息更加模糊了!

一个挑战:

尝试使用“经典机器学习”(CML)模型,利用像classificationLearner应用.根据我的经验,classificationLearner提供的模型将会持续很长一段时间(甚至几个小时!),而且没有一个模型会收敛到高于50%的值。也就是说,模型将是100%无用的!(我把这个尝试留给读者。但我将送一件MATLAB t恤给第一个与我分享用该应用程序训练的模型的人,这个模型可靠地解决了这个问题!)

约束!

为什么CML模型失败?一句话:约束!通常,要创建图像分类器,我们可能首先使用“功能包”.然后,使用这些聚合的特征,我们可以训练一个“图像分类器”。(trainImageCategoryClassifier函数使这些工作变得微不足道。)注意使用bagOfFeatures隐式计算上网功能,而且trainImageCategoryClassifier隐式训练多类支持向量机(SVM)万博1manbetx.特征描述了像素之间的关系,尚不清楚SURF或SVM是否适合当前的任务。即使您使用非默认的检测器、提取器和分类器,您仍然会有一个受约束的模型!

进入深度学习

相比之下,深度学习,相对不受约束的;我们不需要告诉模型要看什么关系。相反,我们可以指定一个“网络架构”并提供一堆“基本事实”,然后让计算机找出要查找的内容!

例如,我们在这里创建了最简单的“典型”网络架构来分类图像:

sizeOfKernel = [5,5];numberOfFilters = 20;nClasses = 2;layers = [imageInputLayer([sz(1) sz(2) 1]) convolution2dLayer(sizeOfKernel, numberOfFilters,“名字”“conv”reluLayer maxPooling2dLayer(2,“步”2) fullyConnectedLayer(n类,“名字”“俱乐部”) softmaxLayer classificationLayer()];

在设计用于图像分析的深度学习网络中,“卷积、relu和池化”层的“三位一体”非常常见。但是请注意,我们没有过分限制模型只考虑特定的特性或模型类型;我们简单地告诉模型计算20个5x5的卷积。更重要的是,我们甚至没有指定要寻找什么模式(卷积核)。

因此,让我们创建验证和测试集,并训练模型

创建验证集将帮助我们确保模型不会过拟合,而测试集将帮助我们在训练后评估模型。

%首先,验证集:Inds = 1:100:size(a, 4);validationData = a(:,:,:, inds);validationLabels =标签(inds);%从训练集中删除验证标签:A (:,:,:, inds) = [];标签(inds) = [];%现在测试集:Inds = 1:100:size(a, 4);testSet = a(:,:,:, inds);testLabels =标签(inds);A (:,:,:, inds) = [];标签(inds) = [];%……指定一些培训选项:miniBatchSize = 100;options = trainingOptions(“亚当”...“InitialLearnRate”, 0.005,...“MaxEpochs”, 1000,...“MiniBatchSize”miniBatchSize,...“阴谋”“训练进步”...“ValidationData”, {validationData, validationLabels},...“ValidationFrequency”10...“ValidationPatience”30岁的...“OutputFcn”, @(info) stopifaccuracynotimprove (info, 50));%……和培训!net = trainNetwork(a,标签,图层,选项);
单GPU训练。

哇……

在不到半分钟的时间里,这个简单的“深度”学习模型似乎已经收敛到95%的准确率!

predictedLabels = net. classification (testSet);ind = randi(size(testSet, ndim (a)));网分类(testSet(:,:,:, ind));togglefig (混淆矩阵的) m = confusichart (testLabels, predictedLabels);testAccuracy = sum(predictedLabels == testLabels) / numel(testLabels)
testAccuracy = 0.94949

这是怎么呢

这很有用,但也令人困惑:如果模型已经找出了“泄密”的位置(它肯定已经做到了,否则它不可能超过50%),那么为什么它不是100%的准确呢?

这个问题的答案在于网络架构。我们使用的典型卷积神经网络(CNN)层的“三位一体”包括一个池化层。由于我们的信息是单个位,池化是在“涂抹”信息!如果我们去掉这一层呢?

layers = [imageInputLayer([sz(1) sz(2) 1]) convolution2dLayer(sizeOfKernel, numberOfFilters,“名字”“conv”(2)“名字”“俱乐部”) softmaxLayer classificationLayer()];net = trainNetwork(a,标签,图层,选项);predictedLabels = net. classification (testSet);testAccuracy = sum(predictedLabels == testLabels) / numel(testLabels)
单GPU训练。

甜蜜的!

大约10秒达到100%的准确率!这有助于我们理解一些层在做什么,以及为什么我们需要根据手头的任务调整网络!(注意我们也可以删除relu层;在这种特殊情况下,它既没有帮助也没有阻碍模型。)

太棒了!但是我们能否确定位置说什么?

是的!“深梦”是你的朋友!

Channels = [1,2];图层= 4;%完全连接I = deepDreamImage(net, layer, channels,“PyramidLevels”1);togglefig (“梦”);subplot(1,2,1) channel1Image = I(:,:,:, 1);imshow (channel1Image);标题(“深梦频道1(1级)”次要情节(1、2、2)channel2Image =我 (:, :, :, 2);imshow (channel2Image);标题(“深梦频道2(1级)”) [rmax, cmax] = find(channel1Image == min(channel1Image(:)));% Or [rmax, cmax] = find(channel2Image == max(channel2Image(:)));流(的目标:\ t \ tRowInd = %我;\ tColInd = %我;\ nDETECTION: \以为= %我;\ t \ tCol = % \ n ', rowIndTrue, colIndTrue, rmax, cmax)
|==============================================| | 迭代| |金字塔激活水平| | |力量  | | |==============================================| | 1 | 1.55 | 1 | | 2 | 265.54 | 1 | | 3 | 533.66 | 1 | | 4 | 804.17 | 1 | | 5 | 1075.66 | 1 | | 6 | 1347.60 | 1 | | 7 | 1619.17 | 1 | | 8 | 1891.03 | 1 | | 9 | 2163.16 | 1 | | 10 | 2435.12 | 1  | |==============================================| 目标:RowInd = 13;ColInd = 10;检测:行= 13;Col = 10

最后一个评论

当我们谈论深度学习时,“深度”通常指的是网络架构中的层数。这个模型在这方面并不深入。但我们做了实现端到端学习(即直接从数据中学习)——这是深度学习的另一个特征。

我希望你觉得这篇文章有趣,即使它有点做作。欢迎您的评论!




发布与MATLAB®R2020b

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。