主要内容gydF4y2Ba

火车降维的暹罗网络gydF4y2Ba

这个例子展示了如何训练暹罗网络比较手写数字使用降维。gydF4y2Ba

暹罗网络是一种深入学习网络,使用相同的两个或两个以上相同的子网,架构和共享相同的参数和权值。暹罗网络通常用于任务涉及找到两个类似的事物之间的关系。一些常见的应用程序为暹罗网络包括面部识别、签名验证[1],或者解释识别[2]。暹罗网络执行这些任务,因为他们共享权重意味着有更少的参数学习培训期间,他们可以产生好结果相对少量的训练数据。gydF4y2Ba

暹罗网络是特别有用的情况下有大量的类和少量的观测。在这种情况下,没有足够的数据来训练深卷积神经网络将图像划分为这些类。相反,暹罗网络可以确定两幅图像是否在同一个班。网络通过减少训练数据的维数和使用一个基于距离的成本函数来区分这类。gydF4y2Ba

这个示例使用降维的暹罗网络图像手写数字的集合。暹罗架构降低了维数与同一个类映射图像附近的点在一个低维空间。reduced-feature表示用于从数据集中提取图像最相似的一个测试图像。本例中的训练数据是28-by-28-by-1大小的图像,给一个初始特征维数为784。暹罗网络降低了输入图像的维数两个特性和训练的输出特性降低图像相同的标签。gydF4y2Ba

您还可以使用暹罗网络识别类似的图像直接进行比较。例如,看到的gydF4y2Ba火车暹罗网络比较图像gydF4y2Ba。gydF4y2Ba

负载和训练数据进行预处理gydF4y2Ba

加载训练数据,包括手写数字的图像。这个函数gydF4y2BadigitTrain4DArrayDatagydF4y2Ba加载数字图片和标签。gydF4y2Ba

[XTrain, TTrain] = digitTrain4DArrayData;gydF4y2Ba

XTraingydF4y2Ba是28 - - 28 - 1 - 5000 - 5000数组包含单通道图像,每个28-by-28大小。每个像素的值gydF4y2Ba0gydF4y2Ba和gydF4y2Ba1gydF4y2Ba。gydF4y2BaTTraingydF4y2Ba是一个分类向量包含标签为每个观察,它们从0到9的数字对应的值写数字。gydF4y2Ba

显示一个随机选择的图像。gydF4y2Ba

烫= randperm(元素个数(TTrain), 9);imshow (imtile (XTrain(:,:,:,烫),ThumbnailSize = (100 - 100)));gydF4y2Ba

创建对相似和不同的图像gydF4y2Ba

训练网络,数据必须分为对相似或不同的图像。在这里,类似的图像被定义为拥有相同的标签,而不同的图片有不同的标签。这个函数gydF4y2BagetSiameseBatchgydF4y2Ba(定义在gydF4y2Ba金宝app支持功能gydF4y2Ba这个例子)创建的随机双相似或不同的图像,gydF4y2BapairImage1gydF4y2Ba和gydF4y2BapairImage2gydF4y2Ba。函数返回标签gydF4y2BapairLabelgydF4y2Ba标识,如果对图像的相似或相异的。类似的双图像gydF4y2BapairLabel = 1gydF4y2Ba,而不同的配对gydF4y2BapairLabel = 0gydF4y2Ba。gydF4y2Ba

作为一个例子,创建一个小代表的五双图像gydF4y2Ba

batchSize = 10;[pairImage1, pairImage2 pairLabel] = getSiameseBatch (XTrain, TTrain batchSize);gydF4y2Ba

显示生成的双图像。gydF4y2Ba

图tiledlayout (gydF4y2Ba“流”gydF4y2Ba)gydF4y2Ba为gydF4y2Bai = 1: batchSize nexttile imshow ([pairImage1 (::,:, i) pairImage2(::,:,我)]);gydF4y2Ba如果gydF4y2BapairLabel (i) = = 1 s =gydF4y2Ba“相似”gydF4y2Ba;gydF4y2Ba其他的gydF4y2Bas =gydF4y2Ba“不同”gydF4y2Ba;gydF4y2Ba结束gydF4y2Ba标题(年代)gydF4y2Ba结束gydF4y2Ba

在这个示例中,创建一个新的批180配对图像的每个迭代训练循环。这确保了网络训练的大量随机双图像大致相等比例的相似和相异的对。gydF4y2Ba

定义网络体系结构gydF4y2Ba

暹罗网络体系结构见下图。gydF4y2Ba

在这个例子中,两个相同的子网定义为一系列完全连接层与ReLU层。创建一个网络,接受28-by-28-by-1图像和输出用于减少特性的两个特征向量表示。网络减少了输入图像的维数,值更容易比784年的初始维度情节和可视化。gydF4y2Ba

第一两个完全连接层指定输出大小为1024,并使用他体重初始值设定项。gydF4y2Ba

最后完全连接层,指定输出的大小两个并使用他权重的初始值设定项。gydF4y2Ba

28层= [imageInputLayer([28],标准化=gydF4y2Ba“没有”gydF4y2Ba)fullyConnectedLayer(1024年,WeightsInitializer =gydF4y2Ba“他”gydF4y2Ba)reluLayer fullyConnectedLayer(1024年,WeightsInitializer =gydF4y2Ba“他”gydF4y2Ba)reluLayer fullyConnectedLayer (2, WeightsInitializer =gydF4y2Ba“他”gydF4y2Ba));gydF4y2Ba

训练网络使用一个自定义训练循环和启用自动分化、层数组转换为一个gydF4y2BadlnetworkgydF4y2Ba对象。gydF4y2Ba

网= dlnetwork(层);gydF4y2Ba

定义模型损失函数gydF4y2Ba

创建函数gydF4y2BamodelLossgydF4y2Ba(定义在gydF4y2Ba金宝app支持功能gydF4y2Ba这个示例的部分)。的gydF4y2BamodelLossgydF4y2Ba函数的暹罗gydF4y2BadlnetworkgydF4y2Ba对象gydF4y2Ba净gydF4y2Ba和gydF4y2Bamini-batch的输入数据gydF4y2BaX1gydF4y2Ba和gydF4y2BaX2gydF4y2Ba与他们的标签gydF4y2BapairLabelsgydF4y2Ba。损失函数返回值和梯度的损失对网络的可学的参数。gydF4y2Ba

暹罗的目标网络输出每个图像的特征向量,特征向量相似类似图片,特别是不同不同的图像。通过这种方式,网络可以区分两个输入。gydF4y2Ba

从过去找到输出之间的对比损失完全连接层、特征向量gydF4y2Bafeatures1gydF4y2Ba和gydF4y2Bafeatures1gydF4y2Ba从gydF4y2BapairImage1gydF4y2Ba和gydF4y2BapairImage2gydF4y2Ba,分别。一对的对比损失是由[3]gydF4y2Ba

损失gydF4y2Ba =gydF4y2Ba 1gydF4y2Ba 2gydF4y2Ba ygydF4y2Ba dgydF4y2Ba 2gydF4y2Ba +gydF4y2Ba 1gydF4y2Ba 2gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba - - - - - -gydF4y2Ba ygydF4y2Ba )gydF4y2Ba 马克斯gydF4y2Ba (gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba - - - - - -gydF4y2Ba dgydF4y2Ba ,gydF4y2Ba 0gydF4y2Ba )gydF4y2Ba 2gydF4y2Ba ,gydF4y2Ba

在哪里gydF4y2Ba ygydF4y2Ba 的值是一对标签(gydF4y2Ba ygydF4y2Ba =gydF4y2Ba 1gydF4y2Ba 类似的图像;gydF4y2Ba ygydF4y2Ba =gydF4y2Ba 0gydF4y2Ba 在不同的图像),gydF4y2Ba dgydF4y2Ba 是两个特征向量之间的欧几里得距离吗gydF4y2Ba f1gydF4y2Ba 和gydF4y2Ba f2gydF4y2Ba :gydF4y2Ba dgydF4y2Ba =gydF4y2Ba 为gydF4y2Ba f1gydF4y2Ba - - - - - -gydF4y2Ba f2gydF4y2Ba 为gydF4y2Ba 2gydF4y2Ba 。gydF4y2Ba

的gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 参数是用于约束:如果两个图像在两个不同的,那么至少应该他们的距离gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba ,或将招致损失。gydF4y2Ba

对比损失有两个条件,但是只有一个是零的对于一个给定的图像对。类似的图片,第一项可以是零,通过减少图像特征之间的距离最小化gydF4y2Ba f1gydF4y2Ba 和gydF4y2Ba f2gydF4y2Ba 。对于不同的图像,第二项可以零,并最小化通过增加图像特征之间的距离,至少距离gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 。的值越小gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 限制越少,在距离一双不同可以在遭受亏损。gydF4y2Ba

指定培训选项gydF4y2Ba

指定的值gydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ggydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 使用在训练。gydF4y2Ba

利润= 0.3;gydF4y2Ba

培训期间指定要使用的选项。3000年火车迭代。gydF4y2Ba

numIterations = 3000;miniBatchSize = 180;gydF4y2Ba

指定的选项为亚当优化:gydF4y2Ba

  • 设置学习速率gydF4y2Ba0.0001gydF4y2Ba。gydF4y2Ba

  • 初始化后平均梯度和拖曳gradient-square平均衰减率gydF4y2Ba[]gydF4y2Ba。gydF4y2Ba

  • 设置渐变衰减系数gydF4y2Ba0.9gydF4y2Ba和衰减系数的平方梯度gydF4y2Ba0.99gydF4y2Ba。gydF4y2Ba

learningRate = 1的军医;trailingAvg = [];trailingAvgSq = [];gradDecay = 0.9;gradDecaySq = 0.99;gydF4y2Ba

初始化参数训练损失情节进展的阴谋。gydF4y2Ba

图C = colororder;lineLossTrain = animatedline(颜色= C (2:));ylim([0正])包含(gydF4y2Ba“迭代”gydF4y2Ba)ylabel (gydF4y2Ba“损失”gydF4y2Ba网格)gydF4y2Ba在gydF4y2Ba

火车模型gydF4y2Ba

火车模型使用自定义训练循环。循环训练数据和更新网络参数在每个迭代。gydF4y2Ba

每一次迭代:gydF4y2Ba

  • 提取一批图像对和标签使用gydF4y2BagetSiameseBatchgydF4y2Ba函数中定义的部分gydF4y2Ba创建批图像对gydF4y2Ba。gydF4y2Ba

  • 将图像数据转换为gydF4y2BadlarraygydF4y2Ba对象与基本类型gydF4y2Ba单gydF4y2Ba并指定尺寸标签gydF4y2Ba“SSCB”gydF4y2Ba(空间、空间、通道、批)。gydF4y2Ba

  • 火车在GPU上,如果一个是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appgydF4y2BaGPU的金宝app支持版本gydF4y2Ba(并行计算工具箱)gydF4y2Ba。gydF4y2Ba

  • 评估损失和梯度模型使用gydF4y2BadlfevalgydF4y2Ba和gydF4y2BamodelLossgydF4y2Ba函数。gydF4y2Ba

  • 更新网络参数使用gydF4y2BaadamupdategydF4y2Ba函数。gydF4y2Ba

开始=抽搐;gydF4y2Ba%在mini-batches循环。gydF4y2Ba为gydF4y2Ba迭代= 1:numIterationsgydF4y2Ba%提取mini-batch图像对和对标签gydF4y2Ba(X1, X2, pairLabels) = getSiameseBatch (XTrain、TTrain miniBatchSize);gydF4y2Ba% dlarray mini-batch的数据转换。指定尺寸的标签gydF4y2Ba%”SSCB”(空间、空间、通道、批)图像数据gydF4y2BaX1 = dlarray(单(X1)、gydF4y2Ba“SSCB”gydF4y2Ba);X2 = dlarray(单(X2),gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba%如果训练在GPU,然后将数据转换成gpuArray。gydF4y2Ba如果gydF4y2BacanUseGPU X1 = gpuArray (X1);X2 = gpuArray (X2);gydF4y2Ba结束gydF4y2Ba%评估模型和梯度使用dlfeval modelLoss损失gydF4y2Ba%末尾列出函数的例子。gydF4y2Ba(损失,梯度)= dlfeval (pairLabels @modelLoss,净,X1, X2,保证金);gydF4y2Ba%更新暹罗网络参数。gydF4y2Ba【净。可学的,trailingAvg trailingAvgSq] =gydF4y2Ba…gydF4y2Baadamupdate (net.Learnables、渐变gydF4y2Ba…gydF4y2BatrailingAvg trailingAvgSq,迭代,learningRate、gradDecay gradDecaySq);gydF4y2Ba%更新培训损失情节进展。gydF4y2BaD =持续时间(0,0,toc(开始),格式=gydF4y2Ba“hh: mm: ss”gydF4y2Ba);=双重损失(损失);addpoints (lineLossTrain、迭代、失去)标题(gydF4y2Ba”经过:“gydF4y2Ba+ drawnow字符串(D))gydF4y2Ba结束gydF4y2Ba

可视化图像的相似性gydF4y2Ba

评估网络是如何做降维,计算和绘制一组测试数据的特性。负载测试数据,包括手写数字的图像类似于训练数据。把测试数据gydF4y2BadlarraygydF4y2Ba并指定尺寸标签gydF4y2Ba“SSCB”gydF4y2Ba(空间、空间、通道、批)。如果您正在使用GPU,把测试数据gydF4y2BagpuArraygydF4y2Ba。gydF4y2Ba

(XTest, tt) = digitTest4DArrayData;XTest = dlarray(单(XTest),gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba如果gydF4y2BacanUseGPU XTest = gpuArray (XTest);gydF4y2Ba结束gydF4y2Ba

计算测试数据的特点。gydF4y2Ba

英尺=预测(净,XTest);gydF4y2Ba

为每个组、情节的前两个减少特征测试数据。gydF4y2Ba

uniqueGroups =独特(tt);颜色= hsv(长度(uniqueGroups));图保存gydF4y2Ba在gydF4y2Ba为gydF4y2Bak = 1:长度(uniqueGroups)印第安纳= tt = = uniqueGroups (k);情节(英国《金融时报》(印第安纳州),英国《金融时报》(印第安纳州),gydF4y2Ba“。”gydF4y2Ba颜色,颜色= (k,:));gydF4y2Ba结束gydF4y2Ba持有gydF4y2Ba从gydF4y2Ba包含(gydF4y2Ba”功能1”gydF4y2Ba)ylabel (gydF4y2Ba“功能2”gydF4y2Ba)标题(gydF4y2Ba“数字图像的二维特性表示。”gydF4y2Ba);传奇(uniqueGroups、位置=gydF4y2Ba“eastoutside”gydF4y2Ba);gydF4y2Ba

使用训练网络找到类似的图像gydF4y2Ba

您可以使用训练网络找到选择的图像相似的一组。从测试数据中提取一个测试图像和显示它。gydF4y2Ba

testIdx =兰迪(5000);testImg = XTest (:,:,:, testIdx);trialImgDisp = extractdata (testImg);图imshow (trialImgDisp InitialMagnification = 500);gydF4y2Ba

创建一个组的图像包含测试数据但不包括提取的测试图像。gydF4y2Ba

groupX = XTest;groupX (::,:, testIdx) = [];gydF4y2Ba

找到减少测试图像使用的特点gydF4y2Ba预测gydF4y2Ba。gydF4y2Ba

trialF =预测(净,testImg);gydF4y2Ba

找到二维减少组中的每个图像的特征表示使用训练网络。gydF4y2Ba

FGroupX =预测(净,groupX);gydF4y2Ba

使用减少特性表示找到9个图像组中最接近测试图像,利用欧氏距离度量。显示图像。gydF4y2Ba

距离= vecnorm (extractdata (trialF - FGroupX));[~,idx] =排序(距离);sortedImages = groupX (:,:,:, idx);sortedImages = extractdata (sortedImages);图imshow (imtile (sortedImages (:,:,: 1:9)), InitialMagnification = 500);gydF4y2Ba

通过减少图像维数较低,网络是能够识别图像,类似于审判的形象。减少功能表示允许网络区分图像相似和不同。暹罗网络中经常使用的面部或签名认可。举例来说,你可以训练一个暹罗网络接受的图像作为输入,并返回一个从数据库设置的最相似的面孔。gydF4y2Ba

金宝app支持功能gydF4y2Ba

损失函数模型gydF4y2Ba

这个函数gydF4y2BamodelLossgydF4y2Ba的暹罗gydF4y2BadlnetworkgydF4y2Ba对象gydF4y2Ba净gydF4y2Ba,一双mini-batch输入数据gydF4y2BaX1gydF4y2Ba和gydF4y2BaX2gydF4y2Ba和标签gydF4y2BapairLabelsgydF4y2Ba。函数返回之间的对比损失减少维数的特征配对的梯度图像和损失对网络中可学的参数。在这个例子中,函数gydF4y2BamodelLossgydF4y2Ba介绍了部分gydF4y2Ba定义模型损失函数gydF4y2Ba。gydF4y2Ba

函数gydF4y2Ba(损失,梯度)= modelLoss(净,X1, X2, pairLabel,边缘)gydF4y2Ba% modelLoss函数计算之间的对比损失gydF4y2Ba%配对的梯度图像并返回损失和损失gydF4y2Ba%对网络可学的参数gydF4y2Ba%通过图像对上半年通过网络gydF4y2BaF1 =前进(净,X1);gydF4y2Ba%通过第二组的图像通过网络对前进gydF4y2BaF2 =前进(净X2);gydF4y2Ba%计算对比损失gydF4y2Ba损失= contrastiveLoss (F1、F2、pairLabel保证金);gydF4y2Ba%计算梯度的损失对网络可学的gydF4y2Ba%的参数gydF4y2Ba梯度= dlgradient(损失、net.Learnables);gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba损失= contrastiveLoss (F1, F2, pairLabel,边缘)gydF4y2Ba% contrastiveLoss函数计算之间的对比损失gydF4y2Ba%的减少特征配对图像gydF4y2Ba%定义小值,以防止√0gydF4y2Baδ= 1 e-6;gydF4y2Ba%找到欧氏距离度量gydF4y2Ba距离=√总和(F1, F2)。^ 2, 1) +δ);gydF4y2Ba%标签(i) = 1如果features1(:,我)和features2(:,我)特性gydF4y2Ba%为类似图片,否则和0gydF4y2BalossSimilar = pairLabel。*(距离。^ 2);lossDissimilar = (1 - pairLabel)。* (max(保证金——距离,0)^ 2);损失= 0.5 *总和(lossSimilar + lossDissimilar,gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

创建批图像对gydF4y2Ba

下面的函数创建随机双相似或不同的图像,基于他们的标签。在这个例子中,函数gydF4y2BagetSiameseBatchgydF4y2Ba介绍了部分gydF4y2Ba创建对相似和不同的图像gydF4y2Ba。gydF4y2Ba

函数gydF4y2Ba(X1, X2, pairLabels) = getSiameseBatch (X, Y, miniBatchSize)gydF4y2Ba% getSiameseBatch返回一个随机选择的批配对图像。gydF4y2Ba平均%,这个函数生成一个组相似和平衡gydF4y2Ba%不同的配对。gydF4y2BaminiBatchSize pairLabels = 0 (1);imgSize =大小(X (:,:,: 1));X1 = 0 ([imgSize 1 miniBatchSize]);X2 = 0 ([imgSize 1 miniBatchSize]);gydF4y2Ba为gydF4y2Bai = 1: miniBatchSize选择=兰德(1);gydF4y2Ba如果gydF4y2Ba选择< 0.5 [pairIdx1、pairIdx2 pairLabels (i)) = getSimilarPair (Y);gydF4y2Ba其他的gydF4y2Ba[pairIdx1, pairIdx2 pairLabels (i)) = getDissimilarPair (Y);gydF4y2Ba结束gydF4y2BaX1 (::,:, i) = X (:,:,:, pairIdx1);X2 (::,:, i) = X (:,:,:, pairIdx2);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[pairIdx1, pairIdx2 pairLabel] = getSimilarPair (classLabel)gydF4y2Ba% getSimilarPair返回一个随机的双指数图像gydF4y2Ba%,在同一类和类似的标签= 1。gydF4y2Ba%找到所有独特的类。gydF4y2Ba类=独特(classLabel);gydF4y2Ba%随机选择一个类用来得到一个相似的一对。gydF4y2BaclassChoice =兰迪(元素个数(类));gydF4y2Ba%找到的所有观测的指标选择类。gydF4y2Baidx =找到(classLabel = =类(classChoice));gydF4y2Ba%从所选的类随机选择两个不同的图像。gydF4y2BapairIdxChoice = randperm(元素个数(idx), 2);pairIdx1 = idx (pairIdxChoice (1));pairIdx2 = idx (pairIdxChoice (2));pairLabel = 1;gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba[pairIdx1, pairIdx2 pairLabel] = getDissimilarPair (classLabel)gydF4y2Ba% getDissimilarPair返回一个随机的双指数图像gydF4y2Ba%的不同类别和不同的一对标签= 0。gydF4y2Ba%找到所有独特的类。gydF4y2Ba类=独特(classLabel);gydF4y2Ba%选择将使用两个不同的类随机获得不同的一对。gydF4y2BaclassesChoice = randperm(元素个数(类),2);gydF4y2Ba%的指数的所有观测第一和第二课。gydF4y2Baidxs1 =找到(classLabel = =类(classesChoice (1)));idxs2 =找到(classLabel = =类(classesChoice (2)));gydF4y2Ba%从每个类随机选择一个映像。gydF4y2BapairIdx1Choice =兰迪(元素个数(idxs1));pairIdx2Choice =兰迪(元素个数(idxs2));pairIdx1 = idxs1 (pairIdx1Choice);pairIdx2 = idxs2 (pairIdx2Choice);pairLabel = 0;gydF4y2Ba结束gydF4y2Ba

引用gydF4y2Ba

  1. 布罗姆利,J。,I. Guyon, Y. LeCun, E. Säckinger, and R. Shah. "签名验证使用时间延迟神经网络“暹罗”。gydF4y2Ba“第六届国际研讨会论文集在神经信息处理系统(少量的1993),1994年,pp737 - 744。可以在gydF4y2Ba签名验证使用时间延迟神经网络“暹罗”gydF4y2Ba在少量的程序的网站。gydF4y2Ba

  2. Wenpeg Y。,和H Schütze. "卷积神经网络释义识别。gydF4y2Ba“2015年研讨会论文集的北美Cahapter ACL, 2015年,pp901 - 911。可以在gydF4y2Ba卷积神经网络释义识别gydF4y2Ba在ACL选集网站上。gydF4y2Ba

  3. 哈德。R。,S. Chopra, and Y. LeCun. "通过学习一个不变的降维映射gydF4y2Ba”。2006年《IEEE计算机学会计算机视觉与模式识别会议(CVPR 2006), 2006年,pp1735 - 1742。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba