最近在用孪生网络跑笔迹鉴别,传送门https://github.com/sorenbouma/keras-oneshot,作者不仅上传了代码,还链接了相关的论文和实验用的数据。写一下思路:
1、 设计网络
该网络是传统的卷积层+池化层的组合,具体如下图
2、 获取训练数据
get_batch
在介绍如何获取训练数据之前,首先介绍一下数据集,数据集中包括
个文件夹,每个单独的文件夹包括
幅图片,同一个文件夹中的文字是同一个人书写,不同文件夹对应着不同的书写人。数据集中
个文件夹被分成训练集和测试集,我将数据集中
的数据即
的文件夹用来作为训练集,剩余的
的数据即
的文件夹作为测试集。
首先设置batch_size大小,在实验中我设置为10,因为孪生网络是判断两幅图片是不是同一人书写的,所以每次向网络输入的是成对的照片,我们将batch-size设置为10即我们每次训练的时候向网络输入10对即20幅图片。
上面图片的意思是,前
batch_size的图片是来自同一个文件夹,后
batch_size的图片是来自不同的文件夹,我们设置数据的label,因为前
对的图片来自同一个书写人,所以前
的label设置为1,后
的label设置为0,将数据和对应的label输入网络。
3、训练
train_on_batch
'''
训练是在一个batch_size上进行评估,返回值是loss值。
将第二步中的数据和label输入到网络中,其中x对应数据,y对应标签
'''
train_on_batch(self,x,y,batch_size,verbose = 0)
4、测试
make_oneshot_task
从第1个文件夹中选择一张图片,与上面选出的图片进行比较。label设置:label[0]=1,其余label为0。如果比较结果与label一致,则判断正确,反之判断错误。