精华内容
下载资源
问答
  • 在训练学到什么
    千次阅读
    2022-02-15 11:55:03

           大多数情况下,我们能够用于训练模型的算力和数据都很有限,要完成一个大型神经网络的训练非常困难,因此我们希望能够尽量重复利用已经训练好的神经网络以节约训练和数据资源。如果我们在执行预测任务时,能够找到一个曾经执行过相似任务、并被训练得很好的大型架构,那我们就可以使用这个大 型架构中位置较浅的那些层来帮助我们构筑自己的网络。借用已经训练好的模型来构筑新架构的技术就叫做“迁移学习”(transfer learning),也叫做预训练(pre-train)。预训练是我们训练大型模型时、用于降低数据需求以及加快训练速度的关键技术之一。

    如何借用已经训练好的模型架构呢?

           答案是借用训练好的模型上的权重。在迁移学习中,我们要复用的是一个已经训练好的架构,包括它的架构本身以及每层上的权重。例如我们沿用某现存架构上的前三个隐藏层以及它们的权重,并在这三个隐藏层后再加入两个我们自定义的层,来构筑新的架构。训练时有两种选择:

    1)将迁移层上的权重作为初始化工具(Initialization tool):将迁移层的权重作为新架构的初始化权重,在此基础上对所有层进行训练,给模型指一条“明路”。在最严谨的文献中,借用原始架构权重,并对所有层进行再训练的流程被称为“预训练”。

    2)将迁移层作为固定的特征提取工具(fixed feature extractor):我们将迁移过来的层上的权重“固定”起来,不让这些权重受到反向传播等过程的影响,而让它们作为架构中的“固定知识”被一直使用。相对的,我们自己添加的、或我们自己选择的层则可以像普通的网络架构一样初始化参数并参与训练,并在每一次迭代中逐渐找到适合自己的权重。在最严谨的文献中,这个流程被称为“迁移学习”。

           这样做有什么意义呢?对神经网络来说,它所学到的知识和能够做出的判断都被储存在权重当中(我们保存模型,也是在保存模型的权重),因此保留权重,就是保留了之前的架构已经学会的东西。

    迁移学习的使用条件不容忽视,使用迁移学习必须注意以下三点:

    1)以前执行的任务A与现在需要执行的任务B有相似之处、有相互可借鉴之处。新任务如果是基于表格数据、或独特的实验室数据来执行的,迁移学习很少能有用。相反,两个任务越相似, 你可以迁移的层数就越多,当任务高度相似时,甚至可以只改变原始任务的输出层,来完成新架构。

    2)任务A与任务B的输入图像尺寸、通道数尽量要相同。迁移学习中我们99%的情况都会保留现存架构的输入层,因为输入层上存在的参数可能是最基础、最浅层的通识,保留输入层将有助于模型的学习, 因此模型输入的图像与显存架构的输入图像必须完全一致(除非我们放弃输入层)。相似的,在迁移学习中,我们很少会混用架构。在任务属性相似、但图像数据各方面差异很大、无法共享输入层的情况下,迁移学习也不一定能有很好的效果。

    3)迁移过来的层不一定是要完全锁死的。在刚将层迁移过来时,我们一般会锁死全部的迁移层,并且先训练模型看看整个模型如何表现。然后我们会试着解锁一两个靠近输出层的迁移层,再次训练来看看模型的表现是否提升,但这种情况下我们会使用很小的学习率,避免在训练中将迁移层上的权重迭代得面目全非。我们拥有的训练数据越多,我们可以解锁的层就越多,拥有的训练数据越少,我们可以在迁移层上增加的新层就越少。

           下面看看PyTorch中如何实现预训练。首先,在导入经典模型时,我们可以使用模型中已经存在的参数“pretrain”来帮助我们加载预训练模型上带的权重。PyTorch中所有模型的预训练都基于ImageNet数据集来完成,这个与训练参数在大多数实际照片上都可以有所帮助,但对表格数据和MNIST这类的数据集帮助不是很大。来看下面的代码:

            新生成的层默认requires_grad=True,因此在锁定模型中的参数后,只要覆盖掉原来的层,或者在原来的层之后加上新的层,新的层默认就是可以训练的。但是新的层会覆盖掉原来层已经训练好的参数,所以我们一般不对conv1进行覆盖。

           在代码上实现迁移学习并不困难,但我们学习的只是迁移学习最浅层的知识。除了pytorch提 供的各个可以迁移的架构外,我们还可以在github上找到大量其他可以供我们迁移的模型,这些模型的权重可能储存在github上的url中,也可能我们可以直接从github下载模型本身。对任意pytorch可以调用的模型来说,训练好的权重都储存在参数state_dict中。我们可以直接从url获取权重,也可以从现有模型中调出权重来迁移使用。

    更多相关内容
  • 先从有监督问题谈起,形式上,无论解析还是非解析,有监督问题都可看作根据已知数据全体映射空间F中寻找最优映射f*(x)=y,其中x为...不知道大家是否考虑过凭什么“每次增1”是规律,而“先增三次1然后保持不变然后再.


    先从有监督问题谈起,形式上,无论解析还是非解析,有监督问题都可看作根据已知数据在全体映射空间F中寻找最优映射f*(x)=y,其中x为输入,y为输出。寻找符合已知数据的映射很简单,难点在于理论上来说,未知输入等可能对应任意输出,这样一来预测则成为无稽之谈(No Free Lunch)。

    举个例子,求解找规律题目“1, 2, 3, 4, ( ), 6”,一般人都会在括号里填5。
    然而理论上来说这个括号里可以是任意数字,比如4。
    不知道大家是否考虑过凭什么“每次增1”是规律,而“先增三次1然后保持不变然后再持续增1”就不可以是规律。
    那是因为我们不知不觉中使用了题目并未给出的一些前提假设,
    比如奥卡姆剃刀原则,“每次增1”看起来明显比后者更简洁优雅,更容易被人接受。

    解释这个概念就不能不提到Inductive Bias,意指在求解学习问题前必须拥有的一系列前提假设。当我们选定一个广义上的model,其实可以看作选定了一组inductive bias。特定的model/inductive bias可以在浩瀚的全体映射空间F中圈定出一个子空间\^{F},然后通过inductive bias提供的方式(一般为某种loss function)寻找符合已知数据的model参数,从而又在\^F中进一步缩小搜索范围直至确定最优次优映射\^f(f*可能根本不在\^F中)。


    所以应了那句话,“All models are wrong, but some are useful.” 得出什么样的答案,很大程度上取决于我们使用什么样的假设。

     

    那么此问题的答案是:模型是求解学习问题的一系列前提假设/inductive bias,根据已知数据寻找模型参数的过程就是训练,最终搜索到的映射\^f被称为训练出来的模型。

     

    注:
    
    1. 这里所谓的“最优”,“次优”,“符合”等描述是根据预先设定好的测量标准/目标函数进行
    阐释的,属于model/inductive bias的一部分。
    
    2. 之所以说“广义上的model”,是因为一般形式上会对prior distribution,model(实际指映射
    表达式)以及loss function等进行区分,这里为方便阐述,不加区分的算成广义上
    的model,因其均为inductive bias。


     

    无监督问题大致上也类似,前提假设甚至会表现得更为明显,有一则段子:

    @南大周志华

    “聚类的故事:老师拿来苹果和梨,让小朋友分成两份。小明把大苹果大梨放一起,小个头的放一起,老师点头,恩,体量感。小芳把红苹果挑出来,剩下的放一起,老师点头,颜色感。小武的结果?不明白。小武掏出眼镜:最新款,能看到水果里有几个籽,左边这堆单数,右边双数。老师很高兴:新的聚类算法诞生了”

     

    PS: 人类的各种错觉,比如视错觉,也可看成是一系列人脑硬编码的inductive bias,用以辅助学习方便解决现实问题,所以各假设都具有其对应的适用范围。

    参考:
    机器学习物语(1):世界观设定 « Free Mind
    Inductive bias
    University of Edinburgh MLPR 2012 Lecture - Introduction

    作者:知乎用户
    链接:https://www.zhihu.com/question/29271217/answer/45665100
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

     

    _____________________________________________________________________________________________________

    你可以把机器想象成一个小孩子,你带小孩去公园。公园里有很多人在遛狗。

    简单起见,咱们先考虑二元分类问题。你告诉小孩这个动物是狗,那个也是狗。但突然一只猫跑过来,你告诉他,这个不是狗。久而久之,小孩就会产生认知模式。这个学习过程,
    就叫“训练”。所形成的认知模式,就是”模型“。

    训练之后。这时,再跑过来一个动物时,你问小孩,这个是狗吧?他会回答,是/否。这个就叫,预测

    一个模型中,有很多参数。有些参数,可以通过训练获得,比如logistic模型中的权重。但有些参数,通过训练无法获得,被称为”超参数“,比如学习率等。这需要靠经验,过着grid search的方法去寻找。

    上面这个例子,是有人告诉小孩,样本的正确分类,这叫有督管学习

    还有无督管学习,比如小孩自发性对动物的相似性进行辨识和分类。

    作者:刘从新
    链接:https://www.zhihu.com/question/29271217/answer/83272460
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 一文读懂迁移学习和预训练

    千次阅读 多人点赞 2018-12-04 16:04:15
    引言跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么?贵。尤其是当我们尝试处理...庆幸的是,有一种叫做“迁移学习”的方式,可以使我们他人训练过的模型基础上进行小改动便可投入使用。...

    转载:https://zhuanlan.zhihu.com/p/27657264

    引言

    跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么?

    贵。

    尤其是当我们在尝试处理现实生活中诸如图像识别、声音辨识等实际问题的时候。一旦你的模型中包含一些隐藏层时,增添多一层隐藏层将会花费巨大的计算资源。

    庆幸的是,有一种叫做“迁移学习”的方式,可以使我们在他人训练过的模型基础上进行小改动便可投入使用。在这篇文章中,我将会讲述如何使用预训练模型来加速解决问题的过程。

    目录

    1. 什么是迁移学习?

    2. 什么是预训练模型?

    3. 为什么我们使用预训练模型?-结合生活实例

    4. 我们可以怎样运用预训练模型?

    提取特征(extract features)

    优化模型(fine tune the model)

    5. 优化模型的方式

    6. 在数字识别中使用预训练模型

    只针对输出密集层(output dense layer)的重新训练

    冻结初始几层网络的权重因子

    1. 什么是迁移学习?

    为了对迁移学习产生一个直观的认识,不妨拿老师与学生之间的关系做类比。

    一位老师通常在ta所教授的领域有着多年丰富的经验,在这些积累的基础上,老师们能够在课堂上教授给学生们该领域最简明扼要的内容。这个过程可以看做是老手与新手之间的“信息转移”。

    这个过程在神经网络中也适用。

    我们知道,神经网络需要用数据来训练,它从数据中获得信息,进而把它们转换成相应的权重。这些权重能够被提取出来,迁移到其他的神经网络中,我们“迁移”了这些学来的特征,就不需要从零开始训练一个神经网络了 。

    现在,让我们从自身进化的角度来讨论这种迁移学习的重要性。这是Tim Urban最近在waitbutwhy.com上的一篇文章中提出的观点。

    Tim说,在语言发明之前,每一代人类都需要自身重新习得很多知识,这也是知识从上一代到下一代一增长缓慢的原因。

    随后,我们发明了语言,这为知识在世代间的传递提供了载体,下图是在语言发明后,同样时间尺度下知识增长速度的示意图。

    是不是看起来很牛逼?而通过权重的传递来进行迁移学习和人类在世代交替中通过语言传播知识,是一个道理。

    2. 什么是预训练模型?

    简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型。你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手。

    比如说,如果你想做一辆自动驾驶汽车,可以花数年时间从零开始构建一个性能优良的图像识别算法,也可以从Google在ImageNet数据集上训练得到的inception model(一个预训练模型)起步,来识别图像。

    一个预训练模型可能对于你的应用中并不是100%的准确对口,但是它可以为你节省大量功夫。

    接下来,我会举个例子来说明。

    3. 为什么我们要用预训练模型?

    上周我一直在尝试解决Crowdanalytix platform上的一个问题:从手机图片中分辨场景。

    这是一个图像分类的问题,训练数据集中有4591张图片,测试集中有1200张图片。我们的任务是将图片相应地分到16个类别中。在对图片进行一些预处理后,我首先采用一个简单的MLP(Multi-later Perceptron)模型,结构如下图所示:

    在对输入图片(224*224*3)平整化后,为了简化上述结构,我用了三个各含有500个神经元的隐藏层。在输出层中,共有16个神经元对应着十六个类别。

    我只能将训练的准确率控制在6.8%,这是个很不理想的结果。我尝试对隐藏层、隐层中神经元的数量以及drop out速率进行调整,但准确度都没有太大的提升。而如果增加隐藏层和其中神经元的数量,每个周期的运行时间则会增加20s以上。(我的开发环境是12GB VRAM,Titan X GPU)

    下面是我用上文所述结构的MLP模型训练输出的结果。

    可以看出,除非指数级地增加训练时长,MLP模型无法提供给我更好的结果。因此,我转而采用CNN(卷积神经网络),看看他们在这个数据集上的表现,以及是否能够提高训练的准确度。

    CNN的结构如下:

    我使用了3个卷积的模块,每个模块由以下部分组成:

    • 32个5*5的filter
    • 线性整流函数(ReLU)作为激活函数
    • 4*4的最大值池化层

    最后一个卷积模块输出的结果经过平整化后会被传递到一个拥有64的神经元的隐藏层上,随后通过一个drop out rate = 0.5处理后传递到输出层。

    最终训练的结果记录如下:

    准确率15.75%,尽管与MLP模型相比有所提升,但每个周期的运行时间也增加了。

    而更重要的是,数据集中最大类别所含图片数量约占总数17.6%左右。

    只要把所有的图片都归到最大的类别,我们就能够得到比MLP、CNN训练出来的模型更好的结果(ノへ ̄、)。

    此外,增加更多的卷积模块也会大大增加训练时长。

    于是,我转而去采用预训练模型,这样我不需要重新训练我的整个结构,只需要针对其中的几层进行训练即可。

    因此,我采用了在ImageNet数据集上预先训练好的VGG16模型,这个模型可以在Keras库中找到。

    模型的结构如下所示:

    在VGG16结构的基础上,我只将softmax层的1000个输出改为16个,从而适应我们这个问题的情景,随后重新训练了dense layer。

    跟MLP和CNN相比,这个结构的准确率能够达到70%。同时,使用VGG16最大的好处是大大减少了训练时间,只需要针对dense layer进行训练,所需时间基本可以忽略。

    4.怎样使用预训练模型?

    当在训练经网络的时候我们的目标是什么?我们希望网络能够在多次正向反向迭代的过程中,找到合适的权重。

    通过使用之前在大数据集上经过训练的预训练模型,我们可以直接使用相应的结构和权重,将它们应用到我们正在面对的问题上。这被称作是“迁移学习”,即将预训练的模型“迁移”到我们正在应对的特定问题中。

    在选择预训练模型的时候你需要非常仔细,如果你的问题与预训练模型训练情景下有很大的出入,那么模型所得到的预测结果将会非常不准确。

    举例来说,如果把一个原本用于语音识别的模型用来做用户识别,那结果肯定是不理想的。

    幸运的是,Keras库中有许多这类预训练的结构。

    ImageNet数据集已经被广泛用作训练集,因为它规模足够大(包括120万张图片),有助于训练普适模型。ImageNet的训练目标,是将所有的图片正确地划分到1000个分类条目下。这1000个分类基本上都来源于我们的日常生活,比如说猫猫狗狗的种类,各种家庭用品,日常通勤工具等等。

    在迁移学习中,这些预训练的网络对于ImageNet数据集外的图片也表现出了很好的泛化性能。

    既然预训练模型已经训练得很好,我们就不会在短时间内去修改过多的权重,在迁移学习中用到它的时候,往往只是进行微调(fine tune)。

    在修改模型的过程中,我们通过会采用比一般训练模型更低的学习速率。

    5. 微调模型的方法

    特征提取

    我们可以将预训练模型当做特征提取装置来使用。具体的做法是,将输出层去掉,然后将剩下的整个网络当做一个固定的特征提取机,从而应用到新的数据集中。

    采用预训练模型的结构

    我们还可以采用预训练模型的结构,但先将所有的权重随机化,然后依据自己的数据集进行训练。

    训练特定层,冻结其他层

    另一种使用预训练模型的方法是对它进行部分的训练。具体的做法是,将模型起始的一些层的权重保持不变,重新训练后面的层,得到新的权重。在这个过程中,我们可以多次进行尝试,从而能够依据结果找到frozen layers和retrain layers之间的最佳搭配。

    如何使用与训练模型,是由数据集大小和新旧数据集(预训练的数据集和我们要解决的数据集)之间数据的相似度来决定的。

    下图表展示了在各种情况下应该如何使用预训练模型:

    场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言)

    在这种情况下,因为数据与预训练模型的训练数据相似度很高,因此我们不需要重新训练模型。我们只需要将输出层改制成符合问题情境下的结构就好。

    我们使用预处理模型作为模式提取器。

    比如说我们使用在ImageNet上训练的模型来辨认一组新照片中的小猫小狗。在这里,需要被辨认的图片与ImageNet库中的图片类似,但是我们的输出结果中只需要两项——猫或者狗。

    在这个例子中,我们需要做的就是把dense layer和最终softmax layer的输出从1000个类别改为2个类别。

    场景二:数据集小,数据相似度不高

    在这种情况下,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,当然最后一层也需要根据相应的输出格式来进行修改。

    因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。

    场景三:数据集大,数据相似度不高

    在这种情况下,因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。

    因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。

    场景四:数据集大,数据相似度高

    这就是最理想的情况,采用预训练模型会变得非常高效。最好的运用方式是保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。

    6. 在手写数字识别中使用预训练模型

    现在,让我们尝试来用预训练模型去解决一个简单的问题。

    我曾经使用vgg16作为预训练的模型结构,并把它应用到手写数字识别上。

    让我们先来看看这个问题对应着之前四种场景中的哪一种。我们的训练集(MNIST)有大约60,000张左右的手写数字图片,这样的数据集显然是偏小的。所以这个问题应该属于场景一或场景二。

    我们可以尝试把两种对应的方法都用一下,看看最终的效果。

    只重新训练输出层 & dense layer

    这里我们采用vgg16作为特征提取器。随后这些特征,会被传递到依据我们数据集训练的dense layer上。输出层同样由与我们问题相对应的softmax层函数所取代。

    在vgg16中,输出层是一个拥有1000个类别的softmax层。我们把这层去掉,换上一层只有10个类别的softmax层。我们只训练这些层,然后就进行数字识别的尝试。

    # importing required libraries
    
    from keras.models import Sequential
    from scipy.misc import imread
    get_ipython().magic('matplotlib inline')
    import matplotlib.pyplot as plt
    import numpy as np
    import keras
    from keras.layers import Dense
    import pandas as pd
    
    from keras.applications.vgg16 import VGG16
    from keras.preprocessing import image
    from keras.applications.vgg16 import preprocess_input
    import numpy as np
    from keras.applications.vgg16 import decode_predictions
    train=pd.read_csv("R/Data/Train/train.csv")
    test=pd.read_csv("R/Data/test.csv")
    train_path="R/Data/Train/Images/train/"
    test_path="R/Data/Train/Images/test/"
    
    from scipy.misc import imresize
    # preparing the train dataset
    
    train_img=[]
    for i in range(len(train)):
    
        temp_img=image.load_img(train_path+train['filename'][i],target_size=(224,224))
    
        temp_img=image.img_to_array(temp_img)
    
        train_img.append(temp_img)
    
    #converting train images to array and applying mean subtraction processing
    
    train_img=np.array(train_img) 
    train_img=preprocess_input(train_img)
    # applying the same procedure with the test dataset
    
    test_img=[]
    for i in range(len(test)):
    
        temp_img=image.load_img(test_path+test['filename'][i],target_size=(224,224))
    
        temp_img=image.img_to_array(temp_img)
    
        test_img.append(temp_img)
    
    test_img=np.array(test_img) 
    test_img=preprocess_input(test_img)
    
    # loading VGG16 model weights
    model = VGG16(weights='imagenet', include_top=False)
    # Extracting features from the train dataset using the VGG16 pre-trained model
    
    features_train=model.predict(train_img)
    # Extracting features from the train dataset using the VGG16 pre-trained model
    
    features_test=model.predict(test_img)
    
    # flattening the layers to conform to MLP input
    
    train_x=features_train.reshape(49000,25088)
    # converting target variable to array
    
    train_y=np.asarray(train['label'])
    # performing one-hot encoding for the target variable
    
    train_y=pd.get_dummies(train_y)
    train_y=np.array(train_y)
    # creating training and validation set
    
    from sklearn.model_selection import train_test_split
    X_train, X_valid, Y_train, Y_valid=train_test_split(train_x,train_y,test_size=0.3, random_state=42)
    
     
    
    # creating a mlp model
    from keras.layers import Dense, Activation
    model=Sequential()
    
    model.add(Dense(1000, input_dim=25088, activation='relu',kernel_initializer='uniform'))
    keras.layers.core.Dropout(0.3, noise_shape=None, seed=None)
    
    model.add(Dense(500,input_dim=1000,activation='sigmoid'))
    keras.layers.core.Dropout(0.4, noise_shape=None, seed=None)
    
    model.add(Dense(150,input_dim=500,activation='sigmoid'))
    keras.layers.core.Dropout(0.2, noise_shape=None, seed=None)
    
    model.add(Dense(units=10))
    model.add(Activation('softmax'))
    
    model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])
    
    # fitting the model 
    
    model.fit(X_train, Y_train, epochs=20, batch_size=128,validation_data=(X_valid,Y_valid))
    

    冻结最初几层网络的权重

    这里我们将会把vgg16网络的前8层进行冻结,然后对后面的网络重新进行训练。这么做是因为最初的几层网络捕获的是曲线、边缘这种普遍的特征,这跟我们的问题是相关的。我们想要保证这些权重不变,让网络在学习过程中重点关注这个数据集特有的一些特征,从而对后面的网络进行调整。

    from keras.models import Sequential
    from scipy.misc import imread
    get_ipython().magic('matplotlib inline')
    import matplotlib.pyplot as plt
    import numpy as np
    import keras
    from keras.layers import Dense
    import pandas as pd
    
    from keras.applications.vgg16 import VGG16
    from keras.preprocessing import image
    from keras.applications.vgg16 import preprocess_input
    import numpy as np
    from keras.applications.vgg16 import decode_predictions
    from keras.utils.np_utils import to_categorical
    
    from sklearn.preprocessing import LabelEncoder
    from keras.models import Sequential
    from keras.optimizers import SGD
    from keras.layers import Input, Dense, Convolution2D, MaxPooling2D, AveragePooling2D, ZeroPadding2D, Dropout, Flatten, merge, Reshape, Activation
    
    from sklearn.metrics import log_loss
    
    train=pd.read_csv("R/Data/Train/train.csv")
    test=pd.read_csv("R/Data/test.csv")
    train_path="R/Data/Train/Images/train/"
    test_path="R/Data/Train/Images/test/"
    
    from scipy.misc import imresize
    
    train_img=[]
    for i in range(len(train)):
    
        temp_img=image.load_img(train_path+train['filename'][i],target_size=(224,224))
    
        temp_img=image.img_to_array(temp_img)
    
        train_img.append(temp_img)
    
    train_img=np.array(train_img) 
    train_img=preprocess_input(train_img)
    
    test_img=[]
    for i in range(len(test)):
    
    temp_img=image.load_img(test_path+test['filename'][i],target_size=(224,224))
    
        temp_img=image.img_to_array(temp_img)
    
        test_img.append(temp_img)
    
    test_img=np.array(test_img) 
    test_img=preprocess_input(test_img)
    
    
    from keras.models import Model
    
    def vgg16_model(img_rows, img_cols, channel=1, num_classes=None):
    
        model = VGG16(weights='imagenet', include_top=True)
    
        model.layers.pop()
    
        model.outputs = [model.layers[-1].output]
    
        model.layers[-1].outbound_nodes = []
    
              x=Dense(num_classes, activation='softmax')(model.output)
    
        model=Model(model.input,x)
    
    #To set the first 8 layers to non-trainable (weights will not be updated)
    
              for layer in model.layers[:8]:
    
           layer.trainable = False
    
    # Learning rate is changed to 0.001
        sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True)
        model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])
    
        return model
    
    train_y=np.asarray(train['label'])
    
    le = LabelEncoder()
    
    train_y = le.fit_transform(train_y)
    
    train_y=to_categorical(train_y)
    
    train_y=np.array(train_y)
    
    from sklearn.model_selection import train_test_split
    X_train, X_valid, Y_train, Y_valid=train_test_split(train_img,train_y,test_size=0.2, random_state=42)
    
    # Example to fine-tune on 3000 samples from Cifar10
    
    img_rows, img_cols = 224, 224 # Resolution of inputs
    channel = 3
    num_classes = 10 
    batch_size = 16 
    nb_epoch = 10
    
    # Load our model
    model = vgg16_model(img_rows, img_cols, channel, num_classes)
    
    model.summary()
    # Start Fine-tuning
    model.fit(X_train, Y_train,batch_size=batch_size,epochs=nb_epoch,shuffle=True,verbose=1,validation_data=(X_valid, Y_valid))
    
    # Make predictions
    predictions_valid = model.predict(X_valid, batch_size=batch_size, verbose=1)
    
    # Cross-entropy loss score
    score = log_loss(Y_valid, predictions_valid)
    

    相关资源

    原文:Transfer learning & The art of using Pre-trained Models in Deep Learning

    VGG-16:<br>gist.github.com/baraldi

    Keras库中的ImageNet预训练模型:<br>keras.io/applications/

    手写数字数据集MNIST:<br>MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

    展开全文
  • 利用迁移学习,不是从零开始学习,而是从之前解决各种问题时学到的模式开始。这样,你就可以利用以前的学习成果(例如VGG、 Inception、MobileNet),避免从零开始。我们把它看作是站巨人的肩膀上。 计算机视觉...

    1、迁移学习

    迁移学习在计算机视觉领域中是一种很流行的方法,因为它可以建立精确的模型,耗时更短。利用迁移学习,不是从零开始学习,而是从之前解决各种问题时学到的模式开始。这样,你就可以利用以前的学习成果(例如VGG、 Inception、MobileNet),避免从零开始。我们把它看作是站在巨人的肩膀上。

    在计算机视觉领域中,迁移学习通常是通过使用预训练模型来表示的。预训练模型是在大型基准数据集上训练的模型,用于解决相似的问题。由于训练这种模型的计算成本较高,因此,导入已发布的成果并使用相应的模型是比较常见的做法。

    2、卷积神经网络(CNN)

    在迁移学习中,常用的几个预训练模型是基于大规模卷积神经网络。一般来说,CNN被证明擅长于解决计算机视觉方面的问题。它的高性能和易训练的特点是最近几年CNN流行的两个主要原因。

    典型的CNN包括两个部分:

    (1)卷积基,由卷积层和池化层的堆栈组成。卷积基的主要目的是由图像生成特征。

    (2)分类器,通常是由多个全连接层组成的。分类器的主要目标是基于检测到的特征对图像进行分类。全连接层是其中的神经元与前一层中的所有激活神经元完全连接的层。

    下图显示了一个基于CNN的模型体系结构。这是一个简化的版本,事实上,这种类型的模型,其实际的体系结构比我们在这里说的要复杂得多。

    基于CNN的模型体系结果

    这些深度学习模型的一个重要方面是,它们可以自动学习分层的特征表示。这意味着由第一层计算的特征是通用的,并且可以在不同的问题域中重用,而由最后一层计算的特征是较特殊的,并且依赖于所选择的数据集和任务。根据Yosinski等人在2014年提出的“如果第一层的特征是通用的并且最后一层的特征是特殊的,那么网络中必定有一个从一般到特殊的转变。因此,我们的CNN的卷积基特别是它下面的层(那些更接近输入的层)适用于一般特征,而分类器部分和卷积基中一些较高的层适用于特殊的特征。

    3、预训练模型的复用

    当你根据自己的需要重用预训练模型时,首先要删除原始的分类器,然后添加一个适合的新分类器,最后必须根据以下的三种策略之一对模型进行微调:

    (1)训练整个模型 在这种情况下,利用预训练模型的体系结构,并根据数据集对其进行训练。如果你从零开始学习模型,那么就需要一个大数据集,和大量的计算资源。

    (2)训练一些层而冻结其它的层较低层适用的是通用特征(独立问题),而较高层适用的是特殊特征。这里,我们通过选择要调整的网络的权重来处理这两种情况。通常,如果有一个较小的数据集和大量的参数,你会冻结更多的层,以避免过度拟合。相比之下,如果数据集很大,并且参数的数量很少,那么可以通过给新任务训练更多的层来完善模型,因为过度拟合不是问题了。

    (3)冻结卷积基这种情况适用于训练/冻结平衡的极端情况。其主要思想是将卷积基保持在原始形式,然后使用其输出提供给分类器。把你正在使用的预训练模型作为固定的特征提取途径,如果缺少计算资源,并且数据集很小,或者预训练模型解决了你正要解决的问题,那么这就很有用。

    图2以图表的形式说明了这三种策略。

    与策略3的这种直接简单的应用不同,策略1和策略2要求你小心谨慎地应对卷积部分中使用的学习率。学习率是一个超参数,它控制你调整网络权重的大小。当你正在使用基于CNN的预训练模型时,使用一个低学习率是比较明智的,因为使用高学习率会增加失去之前所积累知识的风险。假设预训练模型经过了比较好的训练,保持低学习率将确保你不会过早和过度地调整CNN权重。

    4、迁移学习过程

    从实践的角度来看, 整个迁移学习过程可以概括如下:

    1. 选择预训练模型 从大量的预训练模型,可以选择一个适合你要解决的问题的。如果你正在使用Tensorflow2.x,你可以在tf.keras.applications下立即使用一系列模型,例如VGG、InceptionV3和ResNet5。

    2. 根据大小相似性矩阵进行分类 在下图中你用矩阵来控制选择,这个矩阵是根据数据集的大小,以及预训练模型被训练之后的数据集的相似性,来对计算机视觉问题进行分类的。根据经验,如果每个类的图像少于1000个,则认为是小数据集。就数据集的相似性而言,常识占了上风。例如,如果是识别猫和狗,那么ImageNet将是一个类似的数据集,因为它有猫和狗的图像。然而,如果是识别癌细胞,ImageNet就不行了。

    3. 微调模型 这里可以使用大小和相似性矩阵来指导你的选择,然后参考前面提到的重用预训练模型的三个策略。见下图。

      微调预训练模型的决策图

    • 象限1 大数据集,但不同于预训练模型的数据集。这种情况将会让你使用策略1。因为有一个大数据集,你就可以从零开始训练一个模型。尽管数据集不同,但在实践中,利用模型的体系结构和权重,通过预训练模型对初始化模型仍然是很有帮助的;

    • 象限2 大数据集与类似于预训练模型的数据集。在这里任何选项都有效,可能最有效的是策略2。由于我们有一个大数据集,过度拟合不应该是个问题,所以我们可以尽可能多地学习。然而,由于数据集是相似的,我们可以通过利用以前的知识来节省大量的训练工作。因此,仅对卷积基的分类器和顶层进行训练就足够了。

    • 象限3 小数据集,不同于预训练模型的数据集,这里唯一适合的就是策略2。很难在训练和冻结的层数之间平衡。如果你涉及的太深入,那么模型就会过度拟合;如果你仅停留在模型的表面,那么你就不会学到任何有用的东西。也许,你需要比象限2更深入,并且需要考虑数据增强技术。

    • 象限4 小数据集,但类似于预训练模型的数据集。你只需删除最后一个全连接层(输出层),并且执行预训练模型作为固定的特征提取器,然后使用结果特征来训练新的分类器。

    欢迎关注微信公众号:大数据AI

    展开全文
  • 什么训练模型,模型是什么,如何训练… 1、机器学习中大概有如下步骤: 确定模型----训练模型----使用模型。 模型简单说可以理解为函数。 确定模型是说自己认为这些数据的特征符合哪个函数。 训练模型就是用已有...
  • 一个劲说预训练模型,所以说到底什么是预训练模型?本文就以最简单的视角切入,以一个例子让你明白预训练到底是什么?它和我们平时最常说的直接训练的区别又是什么? 个人理解 假设有一个任务:现在有个紧急比赛,...
  • 深度学习训练过程训练的是什么

    千次阅读 2019-03-14 18:16:16
    本文来解释一下深度学习训练过程训练的是什么,换句话说,训练生成的模型文件里记录的是什么。 先笼统回答一下,记录的是网络节点的权重、偏置等参数。不懂网络节点指的是什么的话接着看下文。 先看一个常见的卷积...
  • 训练网络(迁移学习

    千次阅读 2021-01-01 13:58:37
    如果这个原始数据集足够大且足够通用,那么预训练网络学到的特征空间层次结构可以作为有效的提取视觉世界特征的模型。 即使新问题和新任务与原始任务完全不同,学习到的特征不同问题之间是可移植的,这也是深度...
  • 目录小样本学习研究现状Are Large-scale Datasets Necessary for Self-Supervised Pre-training?...因此,有研究者指出 2014 年:学习 CNN 的过程相当于估计模型数百万个参数,这需要大量的带标注的数据。 当今应对
  • 针对预训练模型对于个性化图片分类准确度很低,应用了迁移学习的方法,在训练集照片达到30张时,测试集上就能达到80以上的正确率。 一:研究背景 深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)...
  • 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多...
  • 训练模型&迁移学习

    千次阅读 2020-05-11 17:01:31
    当预训练模型学习到的特征容易泛化的时候,迁移学习才能得到比较有效的使用 迁移学习一个基础的数据集上进行任务的训练,生成一个基础网络 然后将学习到的特征重新进行调整或迁移另一个目标网络上,用来训练...
  • 本篇博客将介绍神经网络训练过程中的三个必备技能:使用预训练权重、冻结训练和断点恢复,巧妙运用这三个技巧可以很有效地提高网络的训练效率和效果。
  • 什么是端到端的训练学习

    万次阅读 多人点赞 2019-06-05 15:03:14
    传统的图像识别问题往往通过分治法将其分解为预处理,特征提取和选择,分类器设计等若干步骤。... 深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模...
  • 训练什么意思

    万次阅读 2021-10-24 17:28:11
    训练什么意思预训练训练的简单概括预训练思想的本质学习任务的分解 预训练训练的简单概括 使用尽可能多的训练数据,从中提取出尽可能多的共性特征,从而让模型对特定任务的学习负担变轻。 预训练思想的本质...
  • 离线学习(训练)和在线学习(训练)

    万次阅读 2019-08-26 10:46:43
    https://blog.csdn.net/a133521741/article/details/79221015
  • 传统机器学习的流程往往由多个独立的模块组成,比如一个典型的自然语言处理(Natural Language Processing)问题中,包括分词、词性标注、句法分析、语义分析等多个独立步骤,每个步骤是一个独立的任务,其结果的...
  • 可以使用标准的预训练模型,如VGG16/19、ResNet50或Inception v3模型(ImageNet上预训练了1000个输出类)对花卉图像进行分类,但是由于模型没有学习这些花卉类别,因此这样的模型无法正确识别它们。换句话说,它们...
  • 深度学习训练流程是一套固定的模板 optimizer定义,选择不同的optimizer,权重衰减,梯度更新。 scheduler定义,选择不同的scheduler,进行学习率的更新。(可选,可不使用scheduler进行学习率更新,设为None,则...
  • GAN的学习 - 实际的训练过程

    千次阅读 2020-08-24 21:10:09
    前面的文章中,了解了GAN的基础知识,同时介绍了实际代码(如何利用GAN来生成MNIST的数据),前面两篇文章中,进行了具体的基础知识铺垫,但是我实际的训练过程中,也感受了GAN训练不稳定。本篇文章从这个角度来...
  • 但是经常说的训练函数、学习函数还有性能函数分别指的是什么? 例如以下例子:“ 设定网络隐层和输出层激励函数分别为tansig和logsig函数, 网络训练函数为traingdx, 网络性能函数为mse,隐层神经元数初设为6。...
  • Yolov5如何在训练意外中断后接续训练

    万次阅读 多人点赞 2021-10-07 14:30:50
    在训练YOLOv4tiny时发现GPU占用率非常低,并且经常跳0,导致训练速度很慢 为此博主对几个时间点就行设置,打印出来加载数据花费的时间和真正网络训练花费的时间,结果加载数据花费了20多秒,训练也只
  • 训练、迁移学习和微调理解

    千次阅读 2020-04-24 11:07:12
    1.迁移学习 为了对迁移学习产生一个直观的认识,不妨拿老师与学生之间的关系做类比。 一位老师通常ta所教授的领域有着多年丰富的经验,这些积累的基础上,老师们能够课堂上...这些权重能够被提取出来,迁移...
  • 机器学习当中,什么训练什么是模型?   通过已知的数据和目标,调节算法的参数,这就是训练; 最后得到的映射,就是针对这个问题被训练出来的模型。
  • 7天物联网智能家居实战训练学习分享 学习教程:韦东山老师-7天物联网智能家居实战训练学习分享 链接:韦东山老师-7天物联网智能家居实战训练学习分享 学习路线 学习的基础内功 基于ARM的STM32处理器 MCU和...
  • 如果你认为深度学习非常的吃GPU,或者说非常的耗时间,训练一个模型要非常久,但是你如果了解了迁移学习那你的模型可能只需要几分钟,而且准确率不比你自己训练的模型准确率低,本节我们将会介绍两种方法来实现迁移...
  • 跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么?贵。尤其是当我们尝试处理现实生活中诸如图像识别、声音辨识等实际问题的时候。一旦你的模型中包含一些隐藏层时,增添多一层隐藏层将会花费...
  • " 证明进行迁移学习得到的虹膜识别模型性能高于自己训练的模型。 所以我想尝试微调ImageNet上预训练的ResNet模型进行虹膜识别 两种迁移学习方法 pytorchresnet18上进行迁移学习的两种常用方式 预训练的网络...
  • 训练函数和学习函数是两个不同的函数 ,网络设置中两个都有。简单的说,训练函数确定调整的大算法,是全局调整权值和阈值,考虑的是整体误差的最小; 学习函数决定调整量怎么确定,是局部调整权值和阈值,考虑的是...
  • 前面两篇我们分别进行了不用数据增强和用数据增强技术的条件下一个小数据集上训练一个小的卷积神经网络。采用数据增强可以获得相当程度的改善,但是由于原始数据集毕竟太小,所以很难达到90%的预测准确度。 本文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 815,109
精华内容 326,043
关键字:

在训练学到什么