精华内容
下载资源
问答
  • 一篇论文复现步骤如下 一、读论文 一篇论文的abstract、applications、method、quantitative evaluation部分比较重要,着重看。在这一阶段对网络的架构等做一定的了解。 二、论文代码解读 1. ReadMe 了解网络实现...


    一篇论文的复现步骤如下

    一、读论文

    一篇论文的abstract、applications、method、quantitative evaluation部分比较重要,着重看。在这一阶段对网络的架构等做一定的了解。

    二、论文代码解读

    1. ReadMe

    了解网络实现功能,前期环境准备,如何开始训练网络,网络所需参数等。

    2. 代码结构

    程序入口文件:train.py、main_train.py等类似文件
    程序实现功能文件
    评价函数
    模型定义文件夹

    3. 核心代码

    代码文件说明:
    A. 参数定义
    B. 数据处理
    C. 模型框架定义
    D. 优化器
    E. 学习率衰减
    F. 损失定义及反传

    三、论文复现

    1. 与torch代码相对应的各种所需参数定义和初始化
    2. 数据的读取和预处理操作实现(对数据做了哪些操作,如何实现,输入输出维度复现后是否一致)
    3. 模型框架的定义和初始化
    4. 网络流程定义,包括优化器、学习率、损失函数、反传操作、梯度惩罚等

    四、评估模型

    查看复现出的代码指标是否与论文中指标一致。

    五、小结

    1. 读github网页的readme文件
    2. 了解代码文件结构
    3. 阅读模型文件,了解模型框架结构(与论文做对应)
    4. 逐步阅读入口文件及其中所用到的函数,了解训练流程
      每个文件实现什么功能均在readme中有提示。
    展开全文
  • 使用Keras复现论文深度神经网络

    千次阅读 2019-07-08 19:59:34
    对于深度学习网络复现,很多最新论文不会将神经网络开源,但是又需要借用这个网络来解决自己的问题。所以根据论文的网络示意图来编写网络程序将是一个很重要的技能。深度学习能不能跑起来,一个是网络搭建,一个是...

    目录

    什么是keras?

    一、任务分析

    二、详细方案

    三、总结


    写在前面的话
    对于深度学习网络复现,很多最新论文不会将神经网络开源,但是又需要借用这个网络来解决自己的问题。所以根据论文的网络示意图来编写网络程序将是一个很重要的技能。深度学习能不能跑起来,一个是网络搭建,一个是训练样本的制作。在基础研究中,训练样本使用开源的几个数据集做测试,二训练网络并不是想要论文作者开源就能开源的,所以我们用keras来打开这扇大门。

    什么是keras?

     

    以上则是keras的百度百科介绍,可以说keras就是集成度超高的API调用工具,对于较复杂的网络层搭建,keras则可能一行代码就能实现。对论文的网络实验,或者测试,以tf、CNTK等网络框架做后端。由于它的高集成度,所以对于完成网络编写也是极大方便了研究人员。

    一、任务分析

     

    上图就是一个简单的卷积神经网络示意图,基本步骤是卷积-下采样-全连接-分类。本文即将以此网络示意图进行详细讲解根据网络图搭建神经网络。网络示意图的观看顺序,一般从左至右或者从上至下。此图是从左至右,可以从整体上看,首先查看网络的输入和输出为格式32*32的图片与对应的10个分类。在网络设计中,首先了解网络的输入输出是一个较为重要的步骤,关系到后续网络层的设计。如果弄错输入格式,网络很有可能要从新设计。

    二、详细方案

    1、下图就是网络设计的第一层,输入+卷积。图中涉及到的参数有INPUT格式32X32,以及输入到下一层的关系为卷积,卷积的滤波器个数为6个,滤波器的尺寸大小为5X5,以及从32X32图片到28X28的格式则在卷积时不会使用填充这一操作,图中能获取的参数就是这些,但是还有一些没有的参数,例如,激活函数,一般对照着论文就能知道这些参数。

     

    model.add(Conv2D(filters=6,      #对应图中6个模板,也就是6个filter
                     kernel_size=(5,5),       #对应的5*5的尺寸
                     padding='valid',          #对应图中32*32的图片缩小到28*28,所以这个参数对应的是valid
                     input_shape=(32,32,1),   #对应左边的INPUT,输入一张图片
                     activation='relu'))           #对于cnn常用的激活函数relu

     

    oling2D(pool_size=(2, 2)))  #降采样用最大池化操作,池化尺寸2*2也就是将图片缩小一半
    

    3、接下来是卷积层参数是使用16个5X5的滤波器,卷积层输出为16个10X10的特征图。

     

    model.add(Conv2D(filters=16,      #对应图中16个滤波器
                     kernel_size=(5,5),       #对应图中的5*5的尺寸
                     padding='valid',          #对应图中14*14的图片缩小到10*10
                     activation='relu'))           #对于cnn常用的激活函数relu
    

    4、继续下采样,10X10的图片缩小到5X5,滤波器数量为16

     

    model.add(MaxPooling2D(pool_size=(2, 2)))
     #降采样用最大池化操作,池化尺寸2*2也就是将图片缩小一半
    

    5、第五层到输出层将放在一起做代码详解,可以看到从2维图片格式变为1维向量就在这一步实现,在keras里也是一个API即可完成这一步骤,剩下的作用则就是全连接+分类。

     

    keras

    model.add(Flatten())
    # 全连接,120
    model.add(Dense(120, activation='relu'))
    model.add(Dropout(0.5))    #避免过拟合
    # output layer
    model.add(Dense(10,activation='softmax'))    #分类常用激活函数。
    

    以上则是整个完整方案详解。需要对网络原理进行了解的请关注后续的更文。

    三、总结

    作为论文的网络复现,用keras进行验证、创建网络是十分方便的,需要后续的产品输出也有强大的tensorflow做后端,不愁将自己的ideal实现成产品。本文的目的旨在抛砖引玉,实际小编在论文中接触到的网络复杂的多,但是万变不离其宗,后续的不管是更复杂的操作,在keras中表现形式一般就是一个参数的调动,或者就是更新的API函数,只要细读keras文档,都能找到对应功效的网络层操作。此处附上keras的中文文档:https://keras.io/zh/

    往期回顾

    1.你还在一个文件一个文件的进行复制操作吗?

    2.医学图像分割之—脑区域分割

    3.目标检测中Bounding Box的详细解读与Python实现

    4.深度学习CV?图像数据不足咋办?看这里

    5.不知道咋批量爬取想要图片?老司机带你驰骋“百度图片”库

     

    小白CV将在第一时间发布AI新动态,整理好文章

    (文章原创,转载请后台联系我们)

    展开全文
  • 如何复现论文中的算法

    千次阅读 2020-01-14 14:00:22
    本文将给出一种从科学论文复现算法的简单指导,以为个人经历而言,我已经成功从书籍或者科学文献资料中复现了许多复杂算法,本文包括了我从搜索、阅读、编程和调试中所学到的经验。本文提供的指导显然也仅限于与...

    转载地址:https://blog.csdn.net/qq_35503971/article/details/88935591

    本文将给出一种从科学论文中复现算法的简单指导,以为个人经历而言,我已经成功从书籍或者科学文献资料中复现了许多复杂算法,本文包括了我从搜索、阅读、编程和调试中所学到的经验。本文提供的指导显然也仅限于与计算机科学相关的领域的文献资料。然而,我更希望你们能够将本文提供的指导和实践方法应用于其他类型的论文或算法复现。

    在你阅读科学论文之前
    在你阅读科学论文并准备复现之前,你应该注意以下几点,并保证你能够根据这些点一一进行自我检查。

    先找找开源资源,避免重复编程
    除非是你想要通过算法复现更深入地学习一个领域的知识,你才有必要亲自去复现它们。如果你并不是想要复现整个论文的算法,而只是想应用它们,那你就应当在做任何复现工作之前,花上几天时间在网络上寻找开源资料。试想一下,你是愿意花两天时间找开源代码,还是希望浪费两个月时间复现一个已经开源的代码呢?

    寻找实现你目标的更简便的途径
    问问你自己你的目标是什么?为了达到你的目标,是不是有更简便的解决办法呢?你能不能用其他的技术?即使只能得到你想要的结果的80%,这也意味着你不需要再去亲自动手复现整个代码,这样的话,你也许会在接下来的两天内将现有的算法或者开源的算法运行起来。关于这方面如果你想要了解更多,可以查看我的文章《20/80生产力法则》。

    注意软件专利
    如果你在美国,你应该注意软件专利。有些论文申请了专利,如果你把它们的算法应用到商业用途,你可能会陷入侵权问题。

    学习相关领域的更多论文
    假如你在阅读一篇关于在神经科学背景下使用支持向量机(SVM)的论文,那么你应该读一段机器学习的简单介绍以及不同可以代替支持向量机的分类器,并且你应该阅读计算神经科学的概论性的文章来了解该领域目前正在进行什么样的研究。

    保持学习动力
    如果你从来没有复现过一篇论文的算法,或者你对该论文的领域非常陌生,那么论文的阅读就会非常困难。无论发生什么,不要让大量的复杂的数学方程使你气馁。此外,欲速则不达,尽管你的理解速度比你想象的要慢,只要你继续努力,你就会慢慢地、稳步地理解论文所提出的概念,并一个接一个地克服所有困难。

    三种论文分类
    随机选择一篇论文,然后立刻开始代码复现并不是一个好主意。从知识库里可以找到大量的论文,这也意味着其中不乏有许多垃圾论文,就我而言,我认为论文可以分为三类:

    开创性论文
    一写论文非常有趣,也写的很出色,代表了作者的原创研究。大部分这类论文来自顶尖大学,或者出自那些那些已经在该领域做了大约6到10年的不知名大学的研究团队。这样的研究团队很容易识别出来:他们通常在论文中引用自己的文献资料,表明他们已经在这个问题上研究有一段时间了,并且他们的新工作是建立在之前有可靠记录的文献资料上。此外,一些开创性的论文也通常发表在该领域最好的期刊上。

    抄袭论文
    一些研究团队一直关注开创性团队的工作,并对其成果提出改进意见然后发表他们的改进结果。这些论文中,许多论文缺乏适当的统计分析,并常常会得到错误的结论,认为这些改进确实优于原来的算法。大多数时候,除了带来了额外的复杂工作以外,他们实际上没有提出任何创新或更好的东西。但并不是所有的模仿者都是不好的,有些也能给出新的见解,但是很少。

    垃圾论文
    有些研究员并不知道他们在做什么,或者他们本身目的就是邪恶的。他们只是试图在自己所属的学术机构或者他们任教的领域保持地位和特权。为此他们需要通过发表一些论文来获得必要的资金资助,他们中有些诚实的人会告诉你实验失败了,并且在只有N%的时间内是准确的(N是一个糟糕的值)。但是也不乏其中邪恶的人会撒谎说取得了巨大的成功。当你读了一段时间的文献资料后,你就很容易区分出垃圾论文,并扔掉他们了。

    如何阅读科学论文
    关于这个主题已经有很多文章了,所以我只是简单提一提。一个好的学习起点是: Srinivasan Keshav的论文如何阅读一篇论文。下面是我在阅读文献时发现的一些有用的观点:

    找到正确的论文
    你想要代码复现的应该是是开创了一个全新的领域原创论文,但有有时候,如果你觉得抄袭论文也带来了真正的改进并也算的上一篇不成熟的但却具有创新性的论文,那么选择一篇抄袭的论文也是可以的。
    假设你现在找到了一篇论文作为起点。首先,你需要围绕它做一些背景研究,方法是查阅相关文献,以及在这些论文末尾的“参考文献”部分列出的文献资料,去谷歌学术搜索标题和作者。是否在你找到的论文中有比你原来的论文做得更好论文?如果答案是肯定的,那就把你正在看的论文搁在一旁,以你新找到的那篇为新起点。谷歌学术的另一个很酷的特性是,你可以找到引用给定论文的论文。这真的很棒,因为你所要做的就是沿着从一篇论文到下一篇论文的引用链发现该领域最新的论文。从一个起点找到一篇好的论文简单来说就是寻找被当前论文引用的论文,以及引用当前论文的论文。沿着引用链并随着时间的推移,你应该会找到既高质量又符合你需要的论文。
    重要提示:注意这个简单探索和计算的阶段,你不必阅读和完全理解这些论文。寻找正确的论文应该通过略读论文并且利用你的直觉来发现垃圾论文(基于你的阅读论文经验而言)。

    不要在屏幕上阅读
    打印文献资料并阅读纸质版本。另外,不要为了在每页上打印更多的内容而降低字体大小。虽然这样做你可以节省三张纸,但是你会浪费时间,因为你会因为更快地阅读这些小字体而感到疲倦。适合阅读的字体大小在11到13字号之间。

    良好的时间和地点
    不要在半夜看论文,要在白天你的大脑还清醒的时候看。此外,找一个安静的地方,使用良好的照明。当我阅读时,我会在桌面上放置台灯,并且光线对准我的文件。

    标记和注释
    用记号笔标出重要信息,并在空白处写下你阅读时脑海中闪现的任何想法。
    了解所有术语的定义

    当你习惯主要阅读新的文章和小说时,你的大脑会训练你用上下文作为推理工具,为你不认识的单词填入意义。阅读科文献却是一种不同的方法,最大的错误之一就是推测出一个单词的错误意思。例如这句话:“The results of this segmentation approach still suffer from blurring artifacts”。在这里,“segmentation”和“artifacts”这两个词在英语中具有一般意义,但在计算机视觉领域中又具有特殊意义。如果你不知道这些词在这篇文章中有一个特定的意思,那么当你不刻意注意这些术语时,你的大脑就会填入一般的解释,为此,你可能会错过一些非常重要的信息。因此你必须:

    避免推测单词的意思,每当有疑问查找这些术语的专业解释,通常是通过该领域的主要论文文献;
    在一张纸上写下所有你不认识的相关文献资料概念和词汇的术语表。如果你第一次遇到诸如“fiducial points”和“piece-wise affine transform”之类的概念,那么你应该查找它们的精确定义并将其记录在术语表中。概念是语言支持的大脑捷径,可以让你更快地理解作者的意图。
    

    在结论中寻找统计分析
    如果作者只给出了他们算法结果的一条曲线和另一条曲线,并说“看,它比另一条精确20%”,那么你就知道你读的是垃圾论文。你想读的论文结果是:“通过N个实例的测试,我们的算法表现出了显著的改进,使用两个样本T检验,p值为5%。统计分析的使用表明,在论文复现时与作者的结果差异最小,这很好地证明了,这些结果在推广时是可信的(除非作者为了让自己的结果看起来更真实而说谎,然而这种情况也经常发生)。

    确保论文结果满足你的需求
    假设你想要可以在一张图片中找到任何一张脸的算法,论文的作者说他们的模型是通过训练使用80不同的人的10套姿势(10 x 80 = 800张照片)得到的,并且训练出的模型用于面部检测的准确性为98%,但是用于测试时准确的只有70%(用于测试的图片不是从训练图片中选出来的)。这意味着,该算法还需要解决一些问题才能得到适当地推广。它在训练时的表现很好(但这是无用的),在实际情况下使用表现却很差。因此,你应该得出的结论是,这篇论文可能不够好,不能满足你的需求。

    注意作者使用的输入数据
    如果你想使用网络摄像头进行人脸检测,而作者使用的是高清相机拍摄的照片,那么算法在你的情况下可能不会像在作者的情况下那样出色。确保算法在类似于你的情况下进行了测试,否则你得到一个并不适合你的情况的论文复现。

    作者也是人
    作者也是人,因此他们会犯错误。不要假设作者是绝对正确的,如果一个方程真的很难理解,你应该问问自己,作者是否犯了错误。这可能只是论文中的一个错字,或者是数学公式上的一个错误。无论哪种情况,找出答案的最好方法是自己推出方程,并尝试验证它们的结果。

    理解变量和操作符
    论文复现过程中的主要任务是将文章中的数学方程转化为代码和数据,这意味着在开始编写代码之前,你必须100%理解这些方程和推导这些方程的过程。例如,“C = A . B可能有不同的意思,A和B可以是简单的数字,还有".“操作可能只是一个数量积,在这种情况下,C是两个数字A和B的数乘积。但是也许A和B是矩阵,而“.”操作表示矩阵点乘,在这种情况下,C就是矩阵A和B点乘结果。另一种可能性是,A和B是矩阵,“.”是逐项积算子,在这种情况下,每个元素C(i,j)都是A(i,j)和B(i,j)的乘积。变量和运算符的符号可以从一种数学规定更变为另一种数学规定,也可以从一个研究小组规定更改为另一个研究小组的规定。确保你知道每个变量是什么(标量、向量、矩阵或其他东西),以及每个操作符对这些变量所做的操作。

    了解数据流程
    一篇论文由一连串的方程式构成。在开始编码之前,你必须知道如何将方程N的输出插入方程N+1的输入。

    原型
    一旦你阅读并理解了这篇论文,接下来就该创建一个原型了,这是非常重要的一步,避免了浪费时间和资源。用C、C++或Java等语言实现复杂算法可能非常耗时,即使你对这篇论文复现有一定的信心并且认为这个算法会成功,它仍然有可能完全失败。所以你想要以偷懒的方式,尽可能快地编码,只是为了检查它是否正常工作。

    原型解决方案
    最好的解决方案是使用更高级语言或环境,如Matlab、R、Octave或SciPy/NumPy。用C++表示一个数学方程,然后打印结果来手动检查并不容易。相反,在Matlab中编写方程,然后打印出来却是非常简单的。在C++中需要两到三周的东西在Matlab中可能只需要两天。

    原型有助于调试过程
    拥有原型的一个优点是,将来编写C++版本时,你将能够比较Matlab原型和C++实现的结果。这将在下面的“调试”小节中进一步开发。

    从原型中获得改进
    你肯定会在原型中犯程序设计错误,这是一件好事,因为你将能够确定流程或数据处理的困难所在。当你编写C++版本的代码时,你将知道如何更好地构建代码,并且你将生成比没有原型化步骤时更简洁、更稳定的代码(这是Frederick Brooks在《The Mythical Man-Month》中提出的“抛弃系统”思想)。

    验证论文给出的结果
    仔细阅读论文的“实验”部分,尽可能使用与作者相似的测试数据,以达到接近重现的实验条件,这增加了你再现作者所获得结果的可能性。不使用相似的实验条件可能会导致你误判自己的复现代码可能出现问题,而不是判断为错误的数据而导致的失败。只要你能够基于相似的数据再现实验结果,那么你就可以开始在不同类型的数据上进行测试。

    选择正确的语言和库
    在这个阶段,你必须清楚地理解文献中提出的算法和概念,并且必须有一个运行的原型,以确保算法确实在你输入想要的数据是能够得到正确的结果。现在是进入下一个步骤的时候了,该步骤包括使用你希望在复现中使用的语言和框架。

    现有系统
    很多时候,编程语言和库是由现有系统决定的。例如,在用Java编码的库中,你有一组用于图片光照规范化的算法,并且你想要从该文献中添加一个新的算法。在这种情况下,很明显,你不会用C++编写这个新算法,而是用Java编写。

    预测复现代码的未来用途
    如果没有现存系统强制你使用一种语言,那么应该根据算法的未来用途来选择该语言。举个例子,如果你相信在四到六个月,可能你的应用程序可以移植到iPhone,那么你应该选择C / C++ / Java,因为它是不需要一切从头开始将代码整合到一个Objective - C应用程序的简便方法。

    完全或部分解决算法的可用库
    可用库的差异还可以决定再现代码的编程语言。假设你希望实现的算法使用了注明的代数技术比如如主成分分析(PCA)和奇异值分解(SVD),虽然你也可以重写他们的代码,并花上一周时间调试,但是我建议你用一个已经实现了这些技术的库,并使用这个库的约定和矩阵类编写实现代码。理想情况下,你应该能够将复现代码分解为子任务,并尝试尽可能找到已经实现了这些子任务的库。如果你找到一组只适用于给定语言的合适的库,那么你应该选择该语言。另外,请注意库的选择应该在引用现有代码和最小化依赖关系之间进行权衡,尽管为实现所需的每个子任务的编程代码很好,但是如果这需要创建超过20个不同库的依赖关系,那么它可能不太实用,甚至可能危及实现的复现算法的稳定性。

    算法复现
    以下是我在复现论文算法的一些经验。

    正确得选择精度
    应该仔细选择你将用于计算的类型。通常使用double而不是float会更好,虽然内存的使用会增大,但计算的精度也会提高。此外,你应该了解32位和64位系统之间的差异,只要可以,就创建自己的类型来封装底层类型(float或double、32位或64位),并在代码中使用这种类型。这可以通过定义为C/ C++或Java中的类来实现。

    归档编程过程
    尽管过度文档化确会显著地降低项目的速度,但是对于复杂科学论文的实现,你需要对所有内容进行存档和解释,即使你是这个项目的唯一工作人员,你也应该记录你的文件、类和方法。选择一个像Doxygen或reStructuredText这样的管理,并坚持下去。在开发的后期,你可能会忘记某个类是如何工作的,或者你是如何实现某个算法,你会感谢自己为代码编写了文档!

    在代码中添加对论文的引用
    对于你实现的论文中的每个方程式,你都需要添加论文引用(作者和年份)的注释,以及段落号或方程编号。这样,当以后重新阅读代码时,你将能够直接将代码连接到论文中的精确位置。这些引用注释应该如下:

    避免使用数学符号命名变量
    假设算法中的某个量是一个矩阵,记作A。接下来,算法要求矩阵在二维上的梯度,记作dA = (dA/dx, dA/dy),那么变量就不该命名为“dA_dx”和“dA_dy”,而应该是“gradient_x”和“gradient_y”。类似地,如果一个方程系统需要收敛判定,那么变量不应该命名为“prev_dA_dx”和“dA_dx”,而应该是“error_previous”和“error_current”。根据它们所表示的物理量来命名,而不是根据论文作者使用的任何字母符号(例如“gradient_x”而不是“dA_dx”),并且从左到右表示更具体的内容(例如“gradient_x”而不是“x_gradient”)。

    第一遍不做优化
    把所有的优化留到以后。因为你永远无法绝对确定代码的哪一部分需要优化。每当你看到一个可能的优化,添加一条注释,并用几行代码解释如何实现优化,例如:

    这样,以后就可以找到代码中所有可能进行优化的位置,并获得关于如何优化技巧。一旦复现完成,你就可以通过运行诸如Valgrind之类的分析器或你使用的编程语言中的任何可用工具来找到优化的位置。

    计划创建一个API?
    如果你计划使用当前代码作为API的基础并且此API随着时间的推移而将会增长,那么你应该了解创建实际可用的接口的技术。为此,我推荐Joshua Bloch在他的作品《如何设计一个好的API》(How to Design a Good API)中总结的“针对库编码”技术。

    调试
    实现一个新的算法就像烹饪一道你从来没有吃过菜。即使它尝起来不错,你也永远不知道这是不是本来应该有的味道。现在我们很幸运,因为编程与烹饪有不同之处,程序开发有一些有用的技巧来增加我们对复现的信心。

    将结果与其他复现进行比较
    消除错误的一个好方法是将代码的结果与相同算法的现有实现的结果进行比较。假设你正确地完成了上面一节中的所有任务,但是你没有找到任何可用的算法复现方法,因此,你在此阶段拥有的惟一其他复现方法就是编写的原型。
    因此,核心想法是比较原型和复现的每一步结果,如果结果不同,那么这两种中必有一个错误了,你必须找出哪个错了和错误的原因。注意精度可以改变(原型可以给出x = 1.8966,而复现代码x = 1.8965),比较时当然应该考虑到这一点。

    与读过该论文的人交谈
    一旦实现(原型和复现)的所有步骤都给出了完全相同的结果,你就获得了一些信心,确信你的代码没有bug。然而,你仍然可能会有出现阅读论文时错误的可能性。在这种情况下,这两种实现方法对于每个步骤都会给出相同的结果,并且你认为你的复现是好的,而这恰恰可能是两个实现方法都犯了同样错误。不幸的是,据我所知,没有办法检查到这类问题,你最好的选择是找一个读过这篇论文的人,问他关于算法中你不确定的部分,你甚至可以试着问作者,但得到答案的机会非常小。

    将变量形象化
    在开发过程中,关注算法使用的变量的内容总是好的。我说的不仅仅是打印矩阵和数据中的所有值,而是找到适合于实现中的任何变量的可视化技巧。例如,假设一个矩阵表示图像的梯度,那么在编程和调试期间,应该弹出一个窗口,显示梯度图像,而不仅仅是图像矩阵中的数值。这样,你可以将把实际的图像与正在处理的数据关联起来,并且你将能够检测到其中一个变量何时出现问题,而这又能显示可能的错误。创造性的可视化技巧包括图像、散点图、图表或任何不只是一个愚蠢的1000个数字的列表的东西,你可以根据它联想到脑海中的图像。

    用于测试的数据集
    生成用于实验复现的数据可能非常耗时。只要有可能,就尝试寻找数据库(脸部数据库、文本提取数据库等)或生成此类数据的工具。如果没有,那么不要浪费时间手工生成1000个样本,用20行代码编写一个快速数据生成器创造他们。

    结论
    在本文中,我介绍了复现论文代码的良好实践方法。请记住,这些只是基于我个人的经验,不应该盲目地逐字逐句地遵循。在阅读和编写代码时一定要注意,并使用你的判断来确定上面提出的哪些指南适合你的项目,也许有些实践对你的项目的弊大于利,这都取决于你自己。现在去实现一些很酷的算法吧!

    展开全文
  • 基于飞桨PaddlePaddle复现论文U-GAN-IT 百度顶会论文复现营 U-GAN-IT论文原文地址 U-GAN-IT项目github地址 引言 图像到图像的翻译旨在学习在两个不同域中映射图像的功能。由于该主题的广泛应用,包括图像修复,风格...

    基于飞桨PaddlePaddle复现论文U-GAN-IT

    百度顶会论文复现营
    U-GAN-IT论文讲解视频
    U-GAN-IT论文原文地址
    U-GAN-IT项目github地址
    感谢百度AI Studio平台以及论文复现营的老师同学助教们!一起进步鸭!

    1、引言

    图像到图像的翻译旨在学习在两个不同域中映射图像的功能。由于该主题的广泛应用,包括图像修复,风格迁移,因此在机器学习和计算机视觉领域引起了研究人员的广泛关注。当给出配对样本时,可以使用条件生成模型以监督方式训练映射模型。在没有成对数据的无监督环境下,则需要进行多项工作,比如使用共享潜在空间和周期一致性假设实现图像的转换。

    尽管取得了这些进步,但先前的方法仍显示出性能差异,具体取决于域之间形状和纹理的变化量。例如,它们对于映射局部纹理的样式转换任务(例如photo2vangogh和photo2portrait)是成功的,但是当遇到图像中形状变化较大的图像翻译任务(例如selfi2anime和cat2dog)是不成功的。 因此,通常需要通过限制数据分布的复杂性来避免图像裁剪和对齐等预处理步骤. 此外,现有的方法无法通过固定的网络体系结构和超参数获得保留形状的图像转换(例如horse2zebra)和更改形状的图像转换(例如cat2dog)所需的结果。需要针对特定数据集调整网络结构或超参数设置。

    2、本文实现的工作

    1. 提出了一种无监督的图像到图像翻译的新方法,可以满足纹理和图像差别很大的两个图像域之间的转换问题。该方法具备新的attention模块和新的归一化功能AdaLIN。
    2. attention模块通过基于辅助分类器获得的attention map增强生成器的生成能力,从而区分源域和目标域,也增强了判别器的判别能力,更好地区分了原始图像和生成图像。
    3. AdaLIN功能帮助我们的attention-guided模型灵活地控制形状和纹理的变化量,而无需修改模型架构或超参数。即在相同的模型架构和超参数情况下实现保留形状的图像转换(例如horse2zebra)和更改形状的图像转换(例如cat2dog)。如下图所示
      在这里插入图片描述

    3、预备知识

    3.1 GAN

    GAN即生成对抗网络,由一个生成器和一个判别器组成。以图像生成模型为例,生成器的目标是要尽可能地生成接近真实的图像,而判别器的目标是要尽可能地区分真假图片,在生成器和判别器的这种博弈关系中,构成了GAN。GAN的模型可以简化为:生成器生成图片->判别器学习区分生成的图片和真实图片->生成器根据判别器的结果改进自己->生成新的图片-> ······。

    3.2 cycleGAN

    cycleGAN论文地址
    在这里插入图片描述

    此模型包含两个映射函数G:X→Y和F:Y→X,以及相关的对抗性标识符DY和DX。DY鼓励G将X转换为与域Y不可区分的输出,对于DX和F则反之亦然。为了进一步规范化映射,我们引入了两个循环一致性损失函数,如果我们从一个域转换为另一域然后再转换为最初的域,则应该和最初的域几乎一致:(b)前向循环一致性损失:X→G(X)→F(G(X))≈X,以及©后向循环一致性损失:Y→F(Y)→ G(F(Y))≈Y。

    4、模型

    在这里插入图片描述

    从模型结构上来看生成器和判别器的结构几乎相同,但是生成器比判别器多了AdaLIN和Decoder部分

    从模型的流程上来看生成器首先对输入的图像进行下采样,然后通过残差模块得到编码特征图,然后将该特征图经过全连接层得到一个节点的预测,再将全连接层的参数和编码特征图相乘得到attention特征图,再对attention特征图通过AdaLIN引导至可适应残差块,最后上采样得到转换后的图像。

    对于本文的U-GAT-IT来说,是由两个GAN网络组成的,一个网络实现将源图像变为目标图像,另一个GAN网络则可以将目标图像变为原图像的模式。

    5、AdaLIN

    本文提出的AdaLIN自适应归一化方法是在传统的归一化方法上进行的改进。一般来说实例级归一化Instance Normalization (IN)和层级归一化Layer
    Normalization(LN)使用场景较多,LN更多的是考虑输入通道之间的相关性,所以在不同图像风格的转换上更加彻底,而IN更多的是考虑到的是单个通道的内容,从而可以更好地保存原图像的语义信息,所以本文将这两种归一化方式结合起来,提出了AdaLIN,它可以在IN和LN之间动态选择。
    在这里插入图片描述
    要注意的是AdaLIN仅对图像的map做归一化。

    6、损失函数

    6.1 对抗损失

    对抗损失用于使翻译后的图像的分布与目标图像的分布相匹配:在这里插入图片描述

    6.2 周期损失

    周期损失是为了减轻模式坍塌问题,我们将周期一致性约束应用于生成器。给定一个图像X∈Xs,在X从Xs到Xt以及从Xt到Xs的顺序转换之后,图像应成功转换回原始域:
    在这里插入图片描述

    6.3 身份损失

    身份损失是为了确保输入图像和输出图像的颜色分布相似,我们将身份一致性约束应用于生成器。给定图像X∈Xt,使用Gs→t转换X后,图像不应改变。
    在这里插入图片描述

    6.4 CAM损失

    生成器中对图像域分类,希望源域和目标域可以尽可能分开,这部分利用交叉熵损失。
    在这里插入图片描述

    7、实验

    本文用五个不成对的图像数据集(包括四个代表性的图像翻译数据集)和一个新创建的由真实照片和动画作品(即selfie2anime)组成的数据集评估了每种方法的性能。所有图像均调整为256×256进行训练。

    8、实验结果

    计算真实图像和生成图像之间的最大均值差异,值越小表示真是图像与生成图像之间有更多视觉相似性,图像翻译的效果越好。

    在这里插入图片描述
    在这里插入图片描述

    其中从顶到下数据集分别为selfie2anime,horse2zebra, cat2dog, photo2portrait, and photo2vangogh,(a)Source images, (b)U-GAT-IT, ©CycleGAN, (d)UNIT, (e)MUNIT, (f)DRIT, (g)AGGAN

    可以很明显地看出U-GAT-IT的效果最好。

    9、代码分析

    在这里插入图片描述

    • 其中main.py是程序的入口,训练时运行该程序即可
    • UGATIT.py给出了训练步骤和流程,其中包括了优化器的定义,网络的调用以及反向传播等操作
    • 网络的结构在networks.py文件中进行了定义,其中包括生成器和判别器的定义,以及网络各层的搭建和定义
    • dataset.py主要是进行数据的读取和预处理
    • utils.py进行了一些网络需要的参数的定义

    持续更新中。。。。。。

    展开全文
  • 如何在自己的电脑上复现开源论文里的代码 刚开始入门科研的小伙伴们总是苦于开源论文中的代码无法在自己的电脑上复现,接下来以文章High speed and high dynamic range video with an event camera作为线索来讲解...
  • 复现SSD算法基本步骤

    千次阅读 2019-03-04 11:39:17
    这是论文地址:...前言:复现github上开源的比较知名算法的时候一定要看页面下方或者repository里面的README.md文件(read之所以大写就是为了提醒读者看),里面涵盖了详细的实现步骤...
  • 读ML论文步骤

    2019-11-18 19:24:07
    【第一遍】浏览论文,理解大意 看:标题->摘要->引言->段落和小结标题(不看数学部分)->总结->扫引用 目标: 明确作者的目的; 论文主要贡献; 论文解决的问题是否是我感兴趣的内容。 【第二遍...
  • 这次百度给予了一个了解Paddle的机会,提供了大量AIStudio的算力来支持我们复现顶会论文的工作。因为我想着后续研究视频识别,因此选择了TPN进行复现。 任务:TPN TPN是视频识别方向的任务,在数据训练方面比较...
  • 复现顶会论文autophrase 使用docker搭建开发环境 我在这里使用的是docker环境,根据作者的readme文件,首先使用命令 docker run -v /Users/qingbaobao/Desktop/AutoPhrase/models:/autophrase/data -v /Users/...
  • 论文题目】U-GAT-IT: Unsupervised Generative Attentional Networks with Adaptive Layer-Instance Normalization for Image-to-Image Translation 【作者】Junho Kim, Minjae Kim, Hyeonwoo Kang, Kwanghee Lee...
  • 对于一篇论文来说,大部分人讨论的都是论文中新的思路和创新点,又或是采用的新的结构,但是在第一次复现论文代码的过程中你将发现:论文的思路并不能完全作为你复现代码的完整思路。本文将概括性的描述论文复现的...
  • CVPR2018目标跟踪算法STRCF实验复现步骤 参考链接:https://blog.csdn.net/qq_17783559/article/details/82024573?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-6&spm=1001.2101...
  • 前段时间参加了百度深度学习论文复现营——视频分类论文复现,在此做一些学习记录,希望可以帮助到有需要的朋友 学习资源 百度顶会论文复现营 https://aistudio.baidu.com/aistudio/education/group/info/1340 1. ...
  • 最近百度推出了一款重磅课程《全球顶会论文作者,28天免费手把手带你复现顶会论文》。这个课程真的是很硬核的课程,这里简单记录下自己的学习过程。...第三阶段:搭模型,老师会分享复现步骤和经验,帮.
  • 对于每一名研究者来说,复现论文是理解一篇论文的必经之路,然而也是最令人头疼的环节。什么样的论文可以被复现?什么样的论文无法被复现?这实际上也是一个科学问题。 在 NeurIPS 2019 上,元科学研究者 Edward ...
  • 本文作者认为复现论文是提升机器学习技能的最好方式之一,所以选择了 OpenAI 论文《Deep Reinforcement Learning from Human Preferences》作为 target,虽获得最后成功,却未实现初衷。如果你也打算复现强化学习...
  • 上面就是部分和论文内容相关的了(贫僧只摘录了部分内容,其实感觉不是很必要继续看,先按着项目主页复现了再回来看也不迟,所以这里只是略微提一下比较重要的地方),而下面的内容是和工程相关的东西。 首先,这篇...
  • 论文复现一直是机器学习领域的难题,虽然最近多个学术会议提倡大家提交代码,但解决论文复现问题仍然任重而道远。在试图复现机器学习论文时,我们经常遇到哪些问题呢?新加坡机器学习工程师 Derek Chia 对此进行了...
  • 如何从论文中实现算法复现(译)

    万次阅读 多人点赞 2019-03-31 21:10:50
    作者:Emmanuel Goossaert ...本文将给出一种从科学论文复现算法的简单指导,以为个人经历而言,我已经成功从书籍或者科学文献资料中复现了许多复杂算法,本文包括了我从搜索、阅读、编程和调试中所学到的...
  • 价格-需求模型论文复现 背景描述 给定N个商品集合,确定包含K组商品价格的价格集合以及每个商品的库存约束后,希望通过观察T=1,2,…,t时的价格-需求关系推测出T=t+1时满足库存约束的利润最大价格K 需求 主要涉及到三...
  • Deep TextSpotter论文复现

    2019-01-09 18:29:18
    3.按照代码链接中的步骤进行caffe编译及工程编译 出现错误及解决链接: ctc_loss_layer问题, https://github.com/yalecyu/crnn.caffe/issues/4 ImportError: No module named google.protobuf.internal ...
  • 记录一下自己复现论文的经历。 之前从GitHub上找了一个项目,由于依赖包不完全没能成功运行。 这次从看的论文里找了源码,记录一下自己的步骤,以待后续有长进。 首先下载代码,解压到自己的pycharmprojects,导入。...
  • 复现论文代码: https://github.com/JiahuiYu/generative_inpainting 环境搭建 Readme中有详细的步骤 • Install python3. • Install tensorflow (tested on Release 1.3.0, 1.4.0, 1.5.0, 1.6.0, 1.7.0). • ...
  • 文章目录前言keras学习keras 建模keras的三个层级sequential model 的要点keras layer的理解sequential 简单演示Function API总结实战:使用function API复现2015年cvpr论文任务概述 前言 keras学习 keras 建模 目标...
  • MultiPoseNet论文解读及复现

    千次阅读 2018-10-23 21:15:43
    论文思路大致解读 论文提出的网络结构大概分成三部分: 首先第一部分是Backbone网络,用于提取图片在多尺度下的特征; 第二部分包括两个分开、独立的网络,其中一个用来检测图片中所有的人体关键点(keypoint_...
  • YOLOV3+ASFF论文复现笔记

    千次阅读 2020-05-24 21:33:29
    论文地址:https://arxiv.org/pdf/1911.09516v2.pdf ...写在前面 ...在复现代码的时候,最简单、方便、快捷的途径当然是去网上搜教程,有教程真的比自己对着read.me瞎搞快很多。目前我网上看到的大都是对
  • 又出现runtimeerror,改batch size,代码中没说batch size,但论文中有说batch size是64个人每人4张图,于是将main.py的106行改为8,成功解决训练问题。 6.测试,在main.py中mode改为test,resume_test_path设为/...
  • siamRPN论文理解与复现

    千次阅读 热门讨论 2020-05-31 18:25:18
    论文讲解: siamRPN的网络结构由两部分组成,siam+RPN Siam部分:主要功能是提取特征 RPN部分:功能为产生候选框以及二分类vector RPN流程: ①从主干网络得到template Frame 特征向量和detection Frame特征向量...
  • SKU110K_CVPR19复现步骤(train and test)

    千次阅读 热门讨论 2020-05-26 10:41:12
    1.可行环境 ubuntu16.04 python3.5 keras==2.2.4 keras-resnet six scipy Pillow pandas tensorflow-gpu tqdm opencv-python==3.1.0.4 windows(only cpu) python3.6 ...opencv-python==3.2.0.6
  • 最近在写论文,要做一些对比实验,需要以Sphereface为基础。其实实验早该做了,就是一直拖拖拖…唉拖延症患者。今天总算是把github上的代码跑通了,...然而具体的操作步骤说明是有错误的 通过参考:https://www.c...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,920
精华内容 1,168
关键字:

复现论文的步骤