Few-Shot Learning 基本思想:
????????在大规模训练集中训练Siamese network ????????????????? 从 k-way 和 n-shot 中给出一组support set ????????????????????????? k-way 意味着k类 ????????????????????????? n-shot 表示每个类别有n个样本 ????????????????????????? 培训集不包含k类 ????????????????? 给出一个查询,预测其类别 ????????????????????????? 使用Siamese network计算相似性或距离
数据集:
?......
开始训练神经网络
????????搭一个卷积神经网络,用来提取特征。这个神经网络有很多卷积层、pool层以及一个Flatten层。输入是一张图片,输出是提取的特征向量,把输入记为x,把输出的特征向量记作f(x)。
?????????准备好训练数据,比如输入是两只老虎,标签是1。把这两张图片输入神经网络,刚才搭建的卷积神经网络记作函数f。卷积神经网络输出提取的特征向量,把第一张图片X1的特征向量记作h1,把第二张图片X2的特征向量记作h2(强调一下,只有一个卷积神经网络,这两个f指的是同一个神经网络)。然后拿h1-h2,得到一个向量,在对这个向量的所有元素,求绝对值记作向量z,表示两个特征向量之间的区别(即z=|h1-h2|)。再用一些全连接层来处理这个z向量,最终输出一个标量。最后用Sigmoid激活函数,得到的输出是一个介于0到1之间的实数,这个输出就可以衡量两个图片之间的相似度。如果两张图片是同一个类别,那么输出应该接近1,如果两张图片不同,那么输出应该接近0。之前我们已经准备好了标签,这两张图片都是老虎,所以标签是1。希望神经网络的输出接近标签,把标签与预测之间的差别作为损失函数。
????????有了损失函数,就可以用反向传播来计算梯度,然后用梯度下降来更新模型参数。模型主要有两个部分,一个是卷积神经网络f(用来从图片提取特征),另一部分就是这些全连接层(用来预测相似度)。训练的过程就是更新这两部分的参数,做反向传播,梯度从损失函数传回到向量z以及全连接层的参数。有了损失函数,关于全连阶层的梯度就可以更新全连阶层的参数了。然后梯度进一步从向量z传播到卷积神经网络f,用计算出的梯度来更新卷积层的参数,这样就完成了一轮训练。
????????做训练的时候,要准备同样数量的正样本和负样本。负样本的意思是这两张图片是不同的事物,负样本的标签设置为0,希望神经网络的预测接近0,意思是这两张图片不同,还是用同样的方法做反向传播,然后更新卷积层和全连接层的参数。
?????????训练好模型之后,可以拿它来做One-Shot Prediction,这个例子里的Support set是six-way one- shot 一共有六个类别,每个类别只有一张图片。注意一下,这六个类别都不在训练集里,这就是future learn的困难之处。现在来了一个Query(知道它一定属于support六个类别中的一个),判断它属于哪一个?。具体做法就是逐一对比Query与Support的图片,Siamese network会输出一个介于0到1之间的值。有了所有这些相似度,查找相似度最高的发现,Query与松鼠的相似度最高,所以判断Query是松鼠。
?未完待续.......
参考内容:
Meta Learning(元学习)_哔哩哔哩_bilibili
元学习概述(Meta-Learning)_一只工程狮的博客-CSDN博客_meta-learning
|