主要内容gydF4y2Ba

训练一个暹罗网络降维gydF4y2Ba

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

暹罗网络是一种深度学习网络,它使用两个或多个相同的子网,具有相同的架构,共享相同的参数和权重。暹罗网络通常用于寻找两个可比较事物之间的关系。暹罗网络的一些常见应用包括面部识别、签名验证[1]或释义识别[2]。Siamese网络在这些任务中表现良好,因为它们共享的权值意味着在训练过程中需要学习的参数更少,而且它们可以在相对少量的训练数据中产生良好的结果。gydF4y2Ba

暹罗网络在存在大量类别且每个类别的观测值较少的情况下特别有用。在这种情况下,没有足够的数据来训练深层卷积神经网络将图像分类到这些类别中。相反,暹罗网络可以确定两个图像是否在同一类别中。网络k通过降低训练数据的维数并使用基于距离的成本函数来区分不同的类来实现这一点。gydF4y2Ba

本例使用暹罗网络对手写数字图像集进行降维。Siamese架构通过将同一类图像映射到低维空间的附近点来降低维数。然后使用降维特征表示从数据集中提取与测试图像最相似的图像。本例中的训练数据是尺寸为28 × 28 × 1的图像,初始特征维数为784。Siamese网络将输入图像的维数降为两个特征,并训练为具有相同标签的图像输出相似的降维特征。gydF4y2Ba

您还可以使用暹罗网络通过直接比较来识别相似的图像。例如,请参见gydF4y2Ba训练暹罗网络来比较图像gydF4y2Ba.gydF4y2Ba

加载和预处理训练数据gydF4y2Ba

加载训练数据,它由手写数字的图像组成。这个函数gydF4y2BadigitTrain4DArrayDatagydF4y2Ba加载数字图像及其标签。gydF4y2Ba

[XTrain, YTrain] = digitTrain4DArrayData;gydF4y2Ba

XTraingydF4y2Ba是一个28 × 28 × 1 × 5000的数组,包含5000个单通道图像,每个大小为28 × 28。每个像素的值是betweengydF4y2Ba0gydF4y2Ba和gydF4y2Ba1gydF4y2Ba.gydF4y2BaYTraingydF4y2Ba是一个包含每个观测值的标签的分类向量,这些标签是从0到9的数字,对应于所写数字的值。gydF4y2Ba

显示随机选择的图像。gydF4y2Ba

perm = randperm(numel(YTrain), 9);imshow (imtile (XTrain(:,:,:,烫),gydF4y2Ba“缩略图大小”gydF4y2Ba,[100 100]));gydF4y2Ba

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

为了训练网络,数据必须被分组成一对对相似或不同的图像。在这里,相似的图像被定义为具有相同的标签,而不同的图像具有不同的标签。这个函数gydF4y2BagetSiameseBatchgydF4y2Ba(定义见gydF4y2Ba万博1manbetx支持功能gydF4y2Ba创建相似或不相似图像的随机对,gydF4y2Ba配对1gydF4y2Ba和gydF4y2Ba配对2gydF4y2Ba.该函数还返回标签gydF4y2BapairLabelgydF4y2Ba,它可以识别这对图像是相似的还是不同的。相似的图像有gydF4y2BapairLabel = 1gydF4y2Ba,而不同的一对则有gydF4y2BapairLabel = 0gydF4y2Ba.gydF4y2Ba

例如,创建一个由五对图像组成的具有代表性的小集合gydF4y2Ba

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

显示生成的图像对。gydF4y2Ba

为gydF4y2Bai = 1: batchSize次要情节(2、5、i) 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×28×1图像的网络,并输出用于简化特征表示的两个特征向量。该网络将输入图像的维数降低为2,这是一个易于绘制和编辑的值比784的初始维度更直观。gydF4y2Ba

对于前两个完全连接的层,指定1024的输出大小并使用He权重初始化式。gydF4y2Ba

对于最终的完全连接层,指定输出大小为2并使用He权重初始化器。gydF4y2Ba

[imageInputLayer([28 28],]),gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“input1”gydF4y2Ba,gydF4y2Ba“正常化”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba) fullyConnectedLayer (1024,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“fc1”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“他”gydF4y2Ba) reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu1”gydF4y2Ba) fullyConnectedLayer (1024,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“取得”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“他”gydF4y2Ba) reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu2”gydF4y2Ba)完全连接层(2,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“一个fc3”文件gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“他”gydF4y2Ba));lgraph = layerGraph(层);gydF4y2Ba

为了使用自定义的训练循环来训练网络并使其能够自动区分,将层图转换为gydF4y2Ba数据链路网络gydF4y2Ba对象。gydF4y2Ba

dlnet = dlnetwork (lgraph);gydF4y2Ba

定义模型梯度函数gydF4y2Ba

创建函数gydF4y2BamodelGradientsgydF4y2Ba(定义见gydF4y2Ba万博1manbetx支持功能gydF4y2Ba这个例子的一部分)。的gydF4y2BamodelGradientsgydF4y2Ba功能以暹罗语为例gydF4y2Ba数据链路网络gydF4y2Ba对象gydF4y2BadlnetgydF4y2Ba和gydF4y2Ba一小批输入数据gydF4y2BadlX1gydF4y2Ba和gydF4y2BadlX2gydF4y2Ba与他们的标签gydF4y2BapairLabelsgydF4y2Ba.该函数返回损耗值和损耗相对于网络的可学习参数的梯度。gydF4y2Ba

Siamese网络的目标是为每幅图像输出一个特征向量,使相似图像的特征向量相似,而不同图像的特征向量明显不同。通过这种方式,网络可以区分两个输入。gydF4y2Ba

找出最后一个完全连通层的输出之间的对比损失,即特征向量gydF4y2Bafeatures1gydF4y2Ba和gydF4y2Bafeatures1gydF4y2Ba从gydF4y2Ba配对1gydF4y2Ba和gydF4y2Ba配对2gydF4y2Ba,分别。一对的对比损耗由[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

指定ADAM优化选项:gydF4y2Ba

  • 设置学习率为gydF4y2Ba0.0001gydF4y2Ba.gydF4y2Ba

  • 初始化尾随平均梯度和尾随平均梯度平方衰减率gydF4y2Ba[]gydF4y2Ba.gydF4y2Ba

  • 将渐变衰减因子设置为gydF4y2Ba0.9gydF4y2Ba梯度衰减因子的平方gydF4y2Ba0.99gydF4y2Ba.gydF4y2Ba

学习率=1e-4;trailingAvg=[];trailingAvgSq=[];梯度衰减=0.9;梯度衰减=0.99;gydF4y2Ba

在GPU上训练(如果有)。使用GPU需要并行计算工具箱™ 和支持的GPU设备。有关支持的设备的信息,请参阅万博1manbetxgydF4y2BaGPU版万博1manbetx本支持gydF4y2Ba(并行计算工具箱)gydF4y2Ba.如果需要自动检测是否有可用的图形处理器,并将相关数据放置在该图形处理器上,请设置gydF4y2BaexecutionEnvironmentgydF4y2Ba来gydF4y2Ba“自动”gydF4y2Ba.如果你没有GPU,或者不想使用GPU进行训练,请设置值gydF4y2BaexecutionEnvironmentgydF4y2Ba来gydF4y2Ba“cpu”gydF4y2Ba.要确保使用GPU进行训练,请设置gydF4y2BaexecutionEnvironmentgydF4y2Ba来gydF4y2Ba“图形”gydF4y2Ba.gydF4y2Ba

executionEnvironment =gydF4y2Ba“自动”gydF4y2Ba;gydF4y2Ba

为了监控培训进度,您可以在每次迭代之后绘制培训损失图。创建一个变量gydF4y2Ba情节gydF4y2Ba包含gydF4y2Ba“训练进步”gydF4y2Ba.如果您不想绘制训练进度,请将此值设置为gydF4y2Ba“没有”gydF4y2Ba.gydF4y2Ba

情节=gydF4y2Ba“训练进步”gydF4y2Ba;gydF4y2Ba

初始化训练损失进度图的绘图参数。gydF4y2Ba

plotRatio = 16/9;gydF4y2Ba如果gydF4y2Ba情节= =gydF4y2Ba“训练进步”gydF4y2BatrainingPlot =图;trainingPlot.Position (3) = plotRatio * trainingPlot.Position (4);trainingPlot。可见=gydF4y2Ba“上”gydF4y2Ba;甘氨胆酸trainingPlotAxes =;lineLossTrain = animatedline (trainingPlotAxes);包含(trainingPlotAxesgydF4y2Ba“迭代”gydF4y2Ba) ylabel (trainingPlotAxesgydF4y2Ba“损失”gydF4y2Ba)标题(trainingPlotAxesgydF4y2Ba“损失在训练”gydF4y2Ba)gydF4y2Ba结束gydF4y2Ba

为了评估网络在降维方面的表现,在每次迭代后,计算并绘制一组测试数据的降维特征。加载测试数据,它由类似于训练数据的手写数字图像组成。将测试数据转换为gydF4y2BadlarraygydF4y2Ba并指定尺寸标签gydF4y2Ba“SSCB”gydF4y2Ba(spatial, spatial, channel, batch)。如果您正在使用GPU,请将测试数据转换为gydF4y2BagpuArraygydF4y2Ba.gydF4y2Ba

[XTest,YTest]=digittest4daraydata;dlXTest=dlarray(单个(XTest),gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba%如果在GPU上进行训练,则将数据转换为gpuArray。gydF4y2Ba如果gydF4y2Ba(b)执行环境==gydF4y2Ba“自动”gydF4y2Ba&& canUseGPU) || executionEnvironment ==gydF4y2Ba“图形”gydF4y2BadlXTest = gpuArray (dlXTest);gydF4y2Ba结束gydF4y2Ba

初始化测试数据的简化特征图的绘图参数。gydF4y2Ba

dimensionPlot=图形;dimensionPlot.Position(3)=绘图比率*dimensionPlot.Position(4);dimensionPlot.Visible=gydF4y2Ba“上”gydF4y2Ba;甘氨胆酸dimensionPlotAxes =;uniqueGroups =独特(欧美);颜色= hsv(长度(uniqueGroups));gydF4y2Ba

初始化计数器以跟踪迭代的总数。gydF4y2Ba

迭代= 1;gydF4y2Ba

火车模型gydF4y2Ba

使用自定义训练循环训练模型。在每次迭代时循环训练数据并更新网络参数。gydF4y2Ba

每一次迭代:gydF4y2Ba

  • 提取一批图像对和标签使用gydF4y2BagetSiameseBatchgydF4y2Ba函数gydF4y2Ba创建批量镜像对gydF4y2Ba.gydF4y2Ba

  • 将图像数据转换为gydF4y2BadlarraygydF4y2Ba具有底层类型的对象gydF4y2Ba单gydF4y2Ba并指定尺寸标签gydF4y2Ba“SSCB”gydF4y2Ba(spatial, spatial, channel, batch)。gydF4y2Ba

  • 对于GPU训练,将图像数据转换为gydF4y2BagpuArraygydF4y2Ba对象。gydF4y2Ba

  • 使用gydF4y2BadlfevalgydF4y2Ba和gydF4y2BamodelGradientsgydF4y2Ba函数。gydF4y2Ba

  • 使用gydF4y2BaadamupdategydF4y2Ba函数。gydF4y2Ba

%在小批量上循环。gydF4y2Ba为gydF4y2Ba迭代= 1:numIterationsgydF4y2Ba%提取小批图像对和对标签gydF4y2Ba(X1, X2, pairLabels) = getSiameseBatch (XTrain、YTrain miniBatchSize);gydF4y2Ba%将小批量数据转换为dlarray。指定维度标签gydF4y2Ba% 'SSCB'(空间、空间、通道、批处理)用于图像数据gydF4y2BadlX1 = dlarray(单(X1)、gydF4y2Ba“SSCB”gydF4y2Ba);dlX2=dlx阵列(单个(X2),gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba%如果在GPU上进行训练,则将数据转换为gpuArray。gydF4y2Ba如果gydF4y2Ba(b)执行环境==gydF4y2Ba“自动”gydF4y2Ba&& canUseGPU) || executionEnvironment ==gydF4y2Ba“图形”gydF4y2BadlX1 = gpuArray (dlX1);dlX2 = gpuArray (dlX2);gydF4y2Ba结束gydF4y2Ba%评估模型梯度和生成器状态使用gydF4y2Ba的% dlfeval和模型梯度函数gydF4y2Ba%例如。gydF4y2Ba(渐变,亏损)= dlfeval (@modelGradients、dlnet dlX1, dlX2, pairLabels,保证金);lossValue =双(收集(extractdata(损失)));gydF4y2Ba%更新Siamese网络参数。gydF4y2Ba[dlnet。可学的,trailingAvg trailingAvgSq] =gydF4y2Ba...gydF4y2Baadamupdate(dlnet.learnable、gradient、,gydF4y2Ba...gydF4y2BatrailingAvg trailingAvgSq,迭代,learningRate、gradDecay gradDecaySq);gydF4y2Ba%更新培训损失进度图。gydF4y2Ba如果gydF4y2Ba情节= =gydF4y2Ba“训练进步”gydF4y2Baaddpoints (lineLossTrain迭代,lossValue);gydF4y2Ba结束gydF4y2Ba%更新测试数据的简化特征图。gydF4y2Ba%计算测试数据的简化特征:gydF4y2BadlFTest =预测(dlnet dlXTest);英国《金融时报》= extractdata (dlFTest);图(dimensionPlot);gydF4y2Ba为gydF4y2Bak = 1:长度(uniqueGroups)gydF4y2Ba%使用相同的数值获取测试数据中每个图像的索引gydF4y2Ba%标签(由唯一组定义):gydF4y2Ba印第安纳州=次= = uniqueGroups (k);gydF4y2Ba%绘制此组:gydF4y2Ba情节(dimensionPlotAxes,收集(英国《金融时报》(印第安纳州)'),收集(英国《金融时报》(印第安纳州)'),gydF4y2Ba“。”gydF4y2Ba,gydF4y2Ba“颜色”gydF4y2Ba,gydF4y2Ba...gydF4y2Ba颜色(k,:));持有gydF4y2Ba在gydF4y2Ba结束gydF4y2Ba传奇(uniqueGroups)gydF4y2Ba%用训练进度信息更新简化特征图的标题。gydF4y2Ba标题(尺寸标绘轴,gydF4y2Ba数字图像的二维特征表示。迭代= "gydF4y2Ba+gydF4y2Ba...gydF4y2Ba迭代);传奇(dimensionPlotAxesgydF4y2Ba“位置”gydF4y2Ba,gydF4y2Ba“eastoutside”gydF4y2Ba);包含(dimensionPlotAxesgydF4y2Ba”功能1”gydF4y2Ba) ylabel (dimensionPlotAxesgydF4y2Ba“功能2”gydF4y2Ba)举行gydF4y2Ba从gydF4y2BadrawnowgydF4y2Ba结束gydF4y2Ba

网络现在已经学会了用二维向量表示每个图像。从测试数据的简化特征图可以看到,在这个2d表示中,相似数字的图像聚在一起。gydF4y2Ba

使用经过训练的网络查找相似的图像gydF4y2Ba

您可以使用经过培训的网络从组中查找彼此相似的图像。在这种情况下,请使用测试数据作为图像组。将图像组转换为gydF4y2BadlarraygydF4y2Ba对象和gydF4y2BagpuArraygydF4y2Ba对象,如果你使用的是GPU。gydF4y2Ba

groupX = XTest;dlGroupX = dlarray(单(groupX),gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba如果gydF4y2Ba(b)执行环境==gydF4y2Ba“自动”gydF4y2Ba&& canUseGPU) || executionEnvironment ==gydF4y2Ba“图形”gydF4y2BadlGroupX = gpuArray (dlGroupX);gydF4y2Ba结束gydF4y2Ba

从组中提取单个测试图像并显示它。将测试图像从组中删除,这样它就不会出现在一组类似的图像中。gydF4y2Ba

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

dlGroupX (::,:, testIdx) = [];gydF4y2Ba

使用方法找到测试图像的简化特征gydF4y2Ba预测gydF4y2Ba.gydF4y2Ba

trialF =预测(dlnet testImg);gydF4y2Ba

使用经过训练的网络查找组中每个图像的二维简化特征表示。gydF4y2Ba

FGroupX =预测(dlnet dlGroupX);gydF4y2Ba

使用简化的特征表示来找到组中最接近测试图像的9幅图像,使用欧几里得距离度量。显示图像。gydF4y2Ba

距离=向量范数(提取数据(trialF-FGroupX));[~,idx]=排序(距离);sortedImages=groupX(:,:,:,idx);图imshow(imtile(sortedImages(:,:,:,1:9)),gydF4y2Ba“InitialMagnification”gydF4y2Ba, 500);gydF4y2Ba

通过将图像降维,网络能够识别与试验图像相似的图像。降维特征表示允许网络区分相似和不相似的图像。暹罗网络通常用于面部或签名识别。例如,你不能rain使用暹罗网络接受人脸图像作为输入,并从数据库返回一组最相似的人脸。gydF4y2Ba

万博1manbetx支持功能gydF4y2Ba

模型梯度函数gydF4y2Ba

这个函数gydF4y2BamodelGradientsgydF4y2Ba的暹罗gydF4y2Ba数据链路网络gydF4y2Ba对象gydF4y2BadlnetgydF4y2Ba,一对小批量输入数据gydF4y2BaX1gydF4y2Ba和gydF4y2BaX2gydF4y2Ba,以及标签gydF4y2BapairLabelsgydF4y2Ba.该函数返回损失相对于网络中可学习参数的梯度,以及成对图像的降维特征之间的对比损失。在本例中,函数gydF4y2BamodelGradientsgydF4y2Ba章节里有介绍吗gydF4y2Ba定义模型梯度函数gydF4y2Ba.gydF4y2Ba

函数gydF4y2Ba[gradient, loss] = modelGradients(net,X1,X2,pairLabel,margin)gydF4y2Ba模型梯度函数计算的对比度损失gydF4y2Ba%配对图像并返回损失和梯度的损失gydF4y2Ba%关于网络可学习参数gydF4y2Ba%通过网络转发图像对的前半部分gydF4y2BaF1 =前进(净,X1);gydF4y2Ba%通过网络转发第二组图像对gydF4y2BaF2 =前进(净X2);gydF4y2Ba%计算对比损失gydF4y2Ba损失= contrastiveLoss (F1、F2、pairLabel保证金);gydF4y2Ba计算损失相对于网络可学习的梯度gydF4y2Ba%的参数gydF4y2Bagradient = dlgradient(loss, net.Learnables);gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba损失= contrastiveLoss (F1, F2, pairLabel,边缘)gydF4y2Ba% contrast veloss函数计算之间的对比损失gydF4y2Ba%成对图像的减少特征gydF4y2Ba%定义小值以防止取0的平方根gydF4y2Baδ= 1 e-6;gydF4y2Ba%求欧几里得距离度量gydF4y2Ba距离=√(sum((F1 - F2).^2,1) + delta);gydF4y2Ba% label(i) = 1如果features1(:,i)和features2(:,i)是特性gydF4y2Ba%表示类似图像,否则为0gydF4y2BalossSimilar=pairLabel.*(距离。^2);lossDissimilar=(1-pairLabel)。*(最大值(边距-距离,0)。^2);loss=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%不同的对。gydF4y2BapairLabels = 0 (1, miniBatchSize);imgSize =大小(X (:,:,: 1));if ([imgSize 1 miniBatchSize] = 0); / /指定一个最小的字节[imgSize 1 miniBatchSize] = 0; / /设置一个最小的批次gydF4y2Ba为gydF4y2Bai = 1: minbatchsize choice = rand(1);gydF4y2Ba如果gydF4y2Baselect < 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]=GetDisimilarPair(类标签)gydF4y2Ba% getDissimilarPair返回图像的随机索引对gydF4y2Ba%属于不同类且不同对标签=0的。gydF4y2Ba找到所有唯一的类。gydF4y2Ba类=独特(classLabel);gydF4y2Ba%随机选择两个不同的类,将用于得到一个不同的对。gydF4y2BaclassesChoice=randperm(numel(classes),2);gydF4y2Ba%从第一和第二类中找到所有观察的指数。gydF4y2Baidxs1 =找到(classLabel = =类(classesChoice (1)));idxs2 =找到(classLabel = =类(classesChoice (2)));gydF4y2Ba%从每个类中随机选择一张图片。gydF4y2BapairIdx1Choice=randi(numel(idxs1));pairIdx2Choice=randi(numel(idxs2));pairIdx1=idxs1(pairIdx1Choice);pairIdx2=idxs2(pairIdx2Choice);pairLabel=0;gydF4y2Ba结束gydF4y2Ba

参考文献gydF4y2Ba

[gydF4y2Ba[1]陈志强,陈志强,陈志强。gydF4y2Ba使用“暹罗”时滞神经网络的签名验证。gydF4y2Ba“第六届神经信息处理系统国际会议论文集(NIPS 1993), 1994, pp737-744。可以在gydF4y2Ba使用“暹罗”时滞神经网络的签名验证gydF4y2Ba在NIPS程序网站上。gydF4y2Ba

[2] Wenpeg, Y.和H Schütze。”gydF4y2Ba用于释义识别的卷积神经网络。gydF4y2Ba《中华人民大学学报(自然科学版)》,2015,pp901-911。可以在gydF4y2Ba用于释义识别的卷积神经网络gydF4y2Ba在ACL Anthology网站上。gydF4y2Ba

[3] Hadsell, R., S. Chopra和Y. LeCun。”gydF4y2Ba通过学习不变映射降维gydF4y2Ba《计算机视觉与模式识别》,2006,pp1735-1742。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba