美文网首页
复现maml论文模型-3

复现maml论文模型-3

作者: China空鸟 | 来源:发表于2020-06-18 14:30 被阅读0次

    两个图像数据集的分类模型的训练代码还没有深入看,先给出实验的一些参数对应的训练效果。
    数据集下载
    链接:https://pan.baidu.com/s/1hcdzRB0BVRwh3Ei4VO2SNQ
    提取码:fmrv

    一、数据和参数分析

    1.数据集
    Omniglot数据集.png
    MiniImagenet数据集.png
    2.基础模型设计在原论文第五章第二小节,我还未细看
    3.损失函数
    损失函数.png
    4.原论文的实验参数
    实验参数.png

    整理后的参数
    4.1 Omniglot


    Omniglot实验参数.png

    4.2 MiniImagenet


    MiniImagenet实验参数.png
    5.实验结果
    实验结果.png

    二、Omniglot

    又回到readme

    readme.png
    需要先执行一下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%置信度。

    5way1shot实验结果.png
    之后没跑起来5way5shot的实验,我只是尝试改了上文中表格中的部分参数(也就是命令行提供的参数),但是似乎问题不在那,而在生成数据上,代码运行往往卡在下图这个位置。
    实验进行不下去的地方.png
    但是我并没有尝试去改源码中的一些参数,而将代码迁移到centos7上去跑模型了(因为可以返校了;跑着模型的笔记本真的啥也不能干)。
    我的主机信息,cpu:Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz, 内存8g(在跑代码时我禁用了图形界面,使用字符界面)
    在cpu上跑了5way5shot,大概用了一天半左右的时间,结果如下图:
    5way5shot实验结果.png
    之后因为觉得耗时有点长,所以打算使用GPU,这部分环境的搭建,在这篇博客中:https://www.jianshu.com/p/52570d1e70b2
    其余两个20way1shot和20way5shot时间差不多都在半天左右的时间,实验结果分别如下图:
    20way1shot实验结果.png
    20way5shot实验结果.png
    其实20way5shot是最后一个训练好的模型,因为一直跑不起来,经过我的简单计算,以及小测试,将上面提到的源码中的参数修改了一下,
    源码参数修改.png
    这个参数按照我的理解,就是和创建的总数据集个数相关,命令行中的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 过去了,但是代码继续向下进行,又卡在了这里,
    命令行参数修改.png
    看原因,和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数据集上我用的训练命令行参数如下:
    命令行参数.png

    三、MiniImagenet

    同样地,按照readme执行对应的预处理数据集的python文件,proc_images.py,但是这个文件也是不能直接运行的。我的数据预处理都是在windows下进行的,这个文件适用于linux系统,所以做了如下修改(主要就是创建文件夹,改名字,在windows上直接用函数,而在linux上os.system()直接执行命令):

    预处理源码修改.png

    使用GPU环境进行训练,大概也是半天时间(就是前一天的下午或晚上开始训练,第二天早上就训练完成),训练结果如下:


    5way1shot实验结果.png
    5way5shot实验结果.png

    (5way5shot也修改了源代码参数num_total_batches = 50000)

    四、结果对比

    实验结果对比.png

    分析上面的结果,基本接近论文的实验结果,说明了该论文实验结果的可重复性。从深入回归任务部分的代码,可以看出maml模型(gradient by gradient)相较于预训练模型,得到了更优的模型初始化参数。
    文中还提到了一阶求导和二阶求导的性能对比


    一阶导&二阶导.png
    公式推导.png

    从性能对比来看,二阶导并没有有效提升性能,同时二阶导的计算也增加了计算时间。

    最近还要忙着找工作,得开始刷题了,所以把这段时间做的东西稍稍总结一下,下次要接着做也能有个回顾的。

    相关文章

      网友评论

          本文标题:复现maml论文模型-3

          本文链接:https://www.haomeiwen.com/subject/mnhexktx.html