两个图像数据集的分类模型的训练代码还没有深入看,先给出实验的一些参数对应的训练效果。
数据集下载
链接:https://pan.baidu.com/s/1hcdzRB0BVRwh3Ei4VO2SNQ
提取码:fmrv
一、数据和参数分析
1.数据集
2.基础模型设计在原论文第五章第二小节,我还未细看
3.损失函数
4.原论文的实验参数
整理后的参数
4.1 Omniglot
4.2 MiniImagenet
5.实验结果
二、Omniglot
又回到readme
需要先执行一下
data/omniglot_resized/resize_images.py
这个python文件头部告诉了我们怎么放置这个数据集,但是可能有些文件夹层数的关系,没找到对应文件,所以我稍微修改了下源代码,修改如下:
第一处,resize_images.py
image_path = '*/*/*/'
第二处,data_generator.py
class DataGenerator->def init->elif 'omniglot' in FLAGS.datasource->character_folders(这是一个变量)
character_folders = [os.path.join(data_folder, family, character_dir, character) \
for family in os.listdir(data_folder) \
if os.path.isdir(os.path.join(data_folder, family)) \
for character_dir in os.listdir(os.path.join(data_folder, family)) \
if os.path.isdir(os.path.join(data_folder, family, character_dir))
for character in os.listdir(os.path.join(data_folder, family, character_dir))]
开始训练
我的笔记本是:windows10,cpu是Intel(R) Core(TM) i7-8550U CPU @1.80GHz 1.99GHz,内存8g
在不开其他应用的条件下,在命令提示符终端只能跑5way-1shot的实验,其它的在内存达到98%,99%时就自动被杀掉了。这个实验跑的时间大概是2天左右,我总感觉它可能跑着跑着就停了,但是可能在计算中吧(模型训练进度好像可以可视化,但是我还没有试,包名是tqdm)。实验结果:
第一行数据是0~10次少量数据更新权值后计算测试集对应的准确率accuracy;
第二行数据是0~10次少量数据更新权值后计算测试集对应的标准差;
第三行数据0~10次少量数据更新权值后计算测试集对应的95%置信度。
之后没跑起来5way5shot的实验,我只是尝试改了上文中表格中的部分参数(也就是命令行提供的参数),但是似乎问题不在那,而在生成数据上,代码运行往往卡在下图这个位置。
但是我并没有尝试去改源码中的一些参数,而将代码迁移到centos7上去跑模型了(因为可以返校了;跑着模型的笔记本真的啥也不能干)。
我的主机信息,cpu:Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz, 内存8g(在跑代码时我禁用了图形界面,使用字符界面)
在cpu上跑了5way5shot,大概用了一天半左右的时间,结果如下图:
之后因为觉得耗时有点长,所以打算使用GPU,这部分环境的搭建,在这篇博客中:https://www.jianshu.com/p/52570d1e70b2
其余两个20way1shot和20way5shot时间差不多都在半天左右的时间,实验结果分别如下图:
其实20way5shot是最后一个训练好的模型,因为一直跑不起来,经过我的简单计算,以及小测试,将上面提到的源码中的参数修改了一下,
这个参数按照我的理解,就是和创建的总数据集个数相关,命令行中的meta-iterations指的是number of metatraining iterations,这个数乘以meta_batch_size(number of tasks sampled per meta-update)是训练所用到的任务数量。而刚才的参数num_total_batches可根据meta_batch_size的不同,组合成一个个训练batch。比如,这里源码中的num_total_batches=200000,假设训练任务是20way-1shot,meta_batch_size=16,meta-iterations=60000,那么训练时一个batch的16个任务,就是从200000个数据集任意挑出16个,一共需要随意挑选60000次。那么刚刚说20way5shot一直跑不起来,而20way1shot可以跑起来,我就进行了简单的计算:
(200000*20*1)/(20*5)=40000
,因为不知道上限是多少,所以我用了50000进行训练,结果是跑了起来。这步,也就是Generating filenames 过去了,但是代码继续向下进行,又卡在了这里,
看原因,和examples_per_batch,batch_size两个参数有关系,examples_per_batch是和我们当前的训练任务,就是NwayKshot有关,所以不能更改,只能修改batch_size,也就是命令行参数meta_batch_size。同样和已经跑起来的20way1shot比较,结合源码中的计算公式
capacity=min_queue_examples + 3 * batch_image_size
,把图中的min_queue_examples = 256
省略,简单计算来看,就是(3*20*1*16)/(3*20*5) = 3.2
,就约等于3(这里因为已经试了好多次,所以就没有测试最可用的值,直接用了计算得到的可用值3)因此,Omniglot数据集上我用的训练命令行参数如下:
三、MiniImagenet
同样地,按照readme执行对应的预处理数据集的python文件,proc_images.py
,但是这个文件也是不能直接运行的。我的数据预处理都是在windows下进行的,这个文件适用于linux系统,所以做了如下修改(主要就是创建文件夹,改名字,在windows上直接用函数,而在linux上os.system()直接执行命令):
使用GPU环境进行训练,大概也是半天时间(就是前一天的下午或晚上开始训练,第二天早上就训练完成),训练结果如下:
(5way5shot也修改了源代码参数num_total_batches = 50000)
四、结果对比
分析上面的结果,基本接近论文的实验结果,说明了该论文实验结果的可重复性。从深入回归任务部分的代码,可以看出maml模型(gradient by gradient)相较于预训练模型,得到了更优的模型初始化参数。
文中还提到了一阶求导和二阶求导的性能对比
从性能对比来看,二阶导并没有有效提升性能,同时二阶导的计算也增加了计算时间。
最近还要忙着找工作,得开始刷题了,所以把这段时间做的东西稍稍总结一下,下次要接着做也能有个回顾的。