Few-Shot Learning:Siamese Network(孪生网络)

用Siamese Network (孪生网络) 解决Few-shot learning (小样本学习)。Siamese Network并不是Meta Learning最好的方法,但是通过学习Siamese Network,非常有助于理解其他Meta Learning算法。

基本思想

1.用一个大的数据集训练Siamese Network,使模型理解事物的异同;

2.经过训练的Siamese Network完成预测来解决few-shot learning问题,即query与Support Set中的样本比较,输出相似度最大或距离最小的类别

介绍两种学习Siamese Network的方法,第一种方法是每次取两个样本,比较相似度。

Learning Pairwise Similarity Scores

需要一个大的数据集来训练神经网络,数据有标注,每一类都要有很多样本。

在这里插入图片描述

用训练集构造正样本和负样本,准备同样数量的正样本和负样本进行训练。正样本指同类样本,负样本指不同类样本。

每次从训练集随机抽取一张图片,然后从同一类中随机抽取另一张图片,这是正样本,把标签设置为1.意思是相似度是满分。

每次从训练集随机抽取一张图片,然后从其他类中随机抽取另一张图片,这是负样本,把标签设置为0.意思是相似度为0。

在这里插入图片描述

搭建卷积神经网络来提取特征,输入图片x,输出提取的特征向量f(x)

在这里插入图片描述

现在开始训练神经网络,我们已经准备好了训练数据,比如输入的是两只老虎,标签是1。把这两张图片x1,x2输入同一个卷积神经网络(记为函数f),输出特征向量h1,h2,将h1-h2向量中的每一个元素取绝对值后得到的向量记作向量z,z表示两个特征向量之间的区别,再用一些全连接层处理向量得到一个标量,最后使用sigmoid激活函数得到一个0-1之间的实数,作为两张图片之间的相似度。

在这里插入图片描述

之前我们已经准备好了标签,我们希望神经网络的预测接近标签,我们将预测与标签之间的差别作为损失函数,有了损失函数,就可以用反向传播计算梯度,用梯度下降更新模型参数。

在这里插入图片描述

模型主要用两个部分,一个是卷积神经网络用来从图片提取特征;一个是全连接层用来预测相似度

训练的过程就是更新这两部分的参数。做反向传播,梯度从损失函数传回到向量z以及全连接层的参数,有了损失函数关于全连接层的梯度就可以更新全连接层的参数了;然后梯度进一步从向量z传到卷积神经网络f,用计算出的梯度来更新卷积层的参数,这样就完成了一轮训练。

在这里插入图片描述
对负样本做同样处理。

完成训练后,模型可以进行one-shot prediction。

few-shot learning的特点是query和Support Set的类别不在训练集中

在例子中,一共有6个类别,每个类别只有1个样本。query一定是六个类别中的一个,通过将query和Support Set中的图片逐一对比计算相似度,输出相似度最大的类别。如图,Query为松鼠。

在这里插入图片描述

现在来讲另一种训练Simaese Network的方法

Triplet loss

每次从训练集中选择3张图片完成一次训练。首先从训练集中随机选择一张图片,记作anchor;然后从这张图片所属类中随机抽取一张图片,记作正样本;最后从其他类中随机抽取一张图片,记作负样本。

现在有了一组样本,比如两张老虎和一张大象,把3张图片输入同一个CNN提取特征,得到3个特征向量。计算anchor和正样本在特征空间中的距离d+(两向量相减后求2范数的平方)以及anchor和负样本在特征空间中的距离d-。

在这里插入图片描述

我们希望训练出来的神经网络相同类别的特征向量都聚在一起,不同类别的特征向量都能分开,即d+越小越好,d-越大越好

在这里插入图片描述

因此定义损失函数时,d+小,d-大,如果d-大于d+加上α,就认为这一组样本的分类是正确的,loss=0;否则loss等于d+加上α减去d-。

在这里插入图片描述

综上,损失函数Loss(xa,x+,x-)=max{0,d+ +α -d-}

有了损失函数就可以进行反向传播,计算损失函数关于神经网络参数的梯度,做梯度下降更新参数。

在这里插入图片描述

完成训练的模型进行one-shot prediction,选择dist最小的类别就是query的类别

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Bluebro/article/details/127832778