精华内容
下载资源
问答
  • finetune

    千次阅读 2019-02-18 13:45:02
    finetune的含义是获取预训练好的网络的部分结构和权重,与自己新增的网络部分一起训练。下面介绍几种finetune的方法。 完整代码:https://github.com/toyow/learn_tensorflow/tree/master/finetune 一,如何恢复预...

    finetune的含义是获取预训练好的网络的部分结构和权重,与自己新增的网络部分一起训练。下面介绍几种finetune的方法。

    完整代码:https://github.com/toyow/learn_tensorflow/tree/master/finetune

    一,如何恢复预训练的网络

    方法一:

    思路:恢复原图所有的网络结构(op)以及权重,获取中间层的tensor,自己只需要编写新的网络结构,然后把中间层的tensor作为新网络结构的输入。

    存在的问题:

    1.这种方法是把原图所有结构载入到新图中,也就是说不需要的那部分也被载入了,浪费资源。

    2.在执行优化器操作的时候,如果不锁定共有的结构(layer2=tf.stop_gradient(layer2,name='layer2_stop')),会导致重名提示报错,因为原结构已经有一个优化器操作了,你再优化一下就重名了。

    核心代码:
    1.把原网络加载到新图里
    def train():
    #恢复原网络的op tensor
        with tf.Graph().as_default() as g:
            saver=tf.train.import_meta_graph('./my_ckpt_save_dir/wdy_model-15.meta')#把原网络载入到图g中
    2.获取原图中间层tensor作为新网络的输入
            x_input=g.get_tensor_by_name('input/x:0')#恢复原op的tensor
            y_input = g.get_tensor_by_name('input/y:0')
            layer2=g.get_tensor_by_name('layer2/layer2:0')
            #layer2=tf.stop_gradient(layer2,name='layer2_stop')#layer2及其以前的op均不进行反向传播
    
            softmax_linear=inference(layer2)#继续前向传播
            cost=loss(y_input,softmax_linear)
    
            train_op=tf.train.AdamOptimizer(0.001,name='Adma2').minimize(cost)#重名,所以改名
    
     3.恢复所有权重
            saver.restore(sess,save_path=tf.train.latest_checkpoint('./my_ckpt_save_dir/'))
         

    方法二:

    思路:重新定义网络结构,保持共有部分与原来同名。在恢复权重时,只恢复共有部分。

    1.自定义网络结构
    def inference(x):
        with tf.variable_scope('layer1') as scope:
            weights=weights_variabel('weights',[784,256],0.04)
            bias=bias_variabel('bias',[256],tf.constant_initializer(0.0))
            layer1=tf.nn.relu(tf.add(tf.matmul(x,weights),bias),name=scope.name)
        with tf.variable_scope('layer2') as scope:
            weights=weights_variabel('weights',[256,128],0.02)
            bias=bias_variabel('bias',[128],tf.constant_initializer(0.0))
            layer2=tf.nn.relu(tf.add(tf.matmul(layer1,weights),bias),name=scope.name)
            # layer2=tf.stop_gradient(layer2,name='layer2_stop')#layer2及其以前的op均不进行反向传播
        with tf.variable_scope('layer3') as scope:
            weights=weights_variabel('weights',[128,64],0.001)
            bias=bias_variabel('bias',[64],tf.constant_initializer(0.0))
            layer3=tf.nn.relu(tf.add(tf.matmul(layer2,weights),bias),name=scope.name)
        with tf.variable_scope('softmax_linear_1') as scope:
            weights = weights_variabel('weights', [64, 10], 0.0001)
            bias = bias_variabel('bias', [10], tf.constant_initializer(0.0))
            softmax_linear = tf.add(tf.matmul(layer3, weights), bias,name=scope.name)
        return softmax_linear
    
    
    2.恢复指定的权重
            variables_to_restore = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)[:4]#这里获取权重列表,只选择自己需要的部分
            saver = tf.train.Saver(variables_to_restore)
    
        with tf.Session(graph=g) as sess:
            #恢复权重
            saver.restore(sess,save_path=tf.train.latest_checkpoint('./my_ckpt_save_dir/'))#这个时候就是只恢复需要的权重了
    

    二,如何获取锁层部分的变量名称,如何避免名称不匹配的问题。

       锁住了也可以显示所有变量。
       params_1=slim.get_model_variables()#放心大胆地获取纯净的参数变量,包括batchnorm
       
       params_2 = slim.get_variables_to_restore()  # 包含优化函数里面定义的动量等等变量,exclude       只能写全名。
       params_2 = [val for val in params_2 if 'Logits' not in val.name]#剔除含有这个字符的变量
    
       锁住了(trianable=False)就不显示。
       params_3 = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)  
       params_4 = tf.trainable_variables()
       # 不包含优化器参数
    
    

    解决方法,利用slim.get_variables_to_restore(),紧跟在原网络结构后面。之后再写自己定义的操作。

     

    三,如何给不同层设置不同的学习率

    思路:minizie()函数实际由compute_gradients()和apply_gradients()两个步骤完成。

    compute_gradients()返回的是(gradent,varibel)元组对的列表,把这个列表varibel对应的gradent乘以学习率,再把新列表传入apply_gradients()就搞定了。

    核心代码:

    softmax_linear=inference(x_input)#继续前向传播
    cost=loss(y_input,softmax_linear)
    train_op=tf.train.AdamOptimizer()
    grads=train_op.compute_gradients(cost)#返回的是(gradent,varibel)元组对的列表
    variables_low_LR = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)[:4]#获取低学习率的变量列表
    low_rate=0.0001
    high_rate=0.001
    new_grads_varible=[]#新的列表
    for grad in grads:#对属于低学习率的变量的梯度,乘以一个低学习率
        if grad[1] in variables_low_LR:
            new_grads_varible.append((low_rate*grad[0],grad[1]))
        else:
            new_grads_varible.append((high_rate * grad[0], grad[1]))
    apply_gradient_op = train_op.apply_gradients(new_grads_varible)
    sess.run(apply_gradient_op,feed_dict={x_input:x_train_batch,y_input:y_train_batch})

    三,关于PB文件

    一,保存:

    ckpt类型文件,是把结构(mate)与权重(checkpoint)分开保存,恢复的时候也是可以单独恢复。而PB文件是把结构与权重保存进了一个文件里。其中权重被固化成了常量,无法进行再次训练了。

    可以看到,我指定保存最后一个tensor。只保存了之前的结构和权重,甚至y都没保存。

    核心代码:

    graph = convert_variables_to_constants(sess,sess.graph_def,['softmax_linear/softmax_linear'])
    tf.train.write_graph(graph,'.','graph.pb',as_text=False)

    二,恢复

    恢复的思路跟ckpt恢复网络结构类似,不过因为只保存了我指定tensor之前的结构,所以自然也只能恢复保存了的网络结构。

    with tf.Graph().as_default() as g:
        x_place = tf.placeholder(tf.float32, shape=[None, 784], name='x')
        y_place = tf.placeholder(tf.float32, shape=[None, 10], name='y')
        with open('./graph.pb','rb') as f:
            graph_def = tf.GraphDef()
            graph_def.ParseFromString(f.read())
            tf.import_graph_def(graph_def, name='')
    #恢复tensor
            graph_op = tf.import_graph_def(graph_def,name='',input_map={'input/x:0':x_place},
                                           return_elements=['layer2/layer2:0','layer1/weights:0'])

    或者可以用

    # x_place = g.get_tensor_by_name('input/x:0')
     #y_place = g.get_tensor_by_name('input/y:0')
     #layer2 = g.get_tensor_by_name('layer2/layer2:0')

     

    展开全文
  • caffe fine tune

    2018-04-26 10:08:19
    Caffe fine-tuning 微调网络 转载:https://www.cnblogs.com/louyihang-loves-baiyan/p/5038758.html 目前呢,caffe,theano,torch是当下比较流行的Deep Learning的深度学习框架,楼主最近也在做一些与此相关的...
     
    

    转载:https://www.cnblogs.com/louyihang-loves-baiyan/p/5038758.html

    目前呢,caffe,theano,torch是当下比较流行的Deep Learning的深度学习框架,楼主最近也在做一些与此相关的事情。在这里,我主要介绍一下如何在Caffe上微调网络,适应我们自己特定的新任务。一般来说我们自己需要做的方向,比如在一些特定的领域的识别分类中,我们很难拿到大量的数据。因为像在ImageNet上毕竟是一个千万级的图像数据库,通常我们可能只能拿到几千张或者几万张某一特定领域的图像,比如识别衣服啊、标志啊、生物种类等等。在这种情况下重新训练一个新的网络是比较复杂的,而且参数不好调整,数据量也不够,因此fine-tuning微调就是一个比较理想的选择。

    微调网络,通常我们有一个初始化的模型参数文件,这里是不同于training from scratch,scrachtch指的是我们训练一个新的网络,在训练过程中,这些参数都被随机初始化,而fine-tuning,是我们可以在ImageNet上1000类分类训练好的参数的基础上,根据我们的分类识别任务进行特定的微调。

    这里我以一个车型的识别为例,假设我们有431种车型需要识别,我的任务对象是车,现在有ImageNet的模型参数文件,在这里使用的网络模型是CaffeNet,是一个小型的网络,其实别的网络如GoogleNet也是一样的原理。那么这个任务的变化可以表示为:

     任务:分类
     类别数目:1000(ImageNet上1000类的分类任务)------> 431(自己的特定数据集的分类任务431车型)

    那么在网络的微调中,我们的整个流程分为以下几步:

    1. 依然是准备好我们的训练数据和测试数据
    2. 计算数据集的均值文件,因为集中特定领域的图像均值文件会跟ImageNet上比较General的数据的均值不太一样
    3. 修改网络最后一层的输出类别,并且需要加快最后一层的参数学习速率
    4. 调整Solver的配置参数,通常学习速率和步长,迭代次数都要适当减少
    5. 启动训练,并且需要加载pretrained模型的参数

    简单的用流程图示意一下:

    1.准备数据集

    这一点就不用说了,准备两个txt文件,放成list的形式,可以参考caffe下的example,图像路径之后一个空格之后跟着类别的ID,如下,这里记住ID必须从0开始,要连续,否则会出错,loss不下降,按照要求写就OK。
    这个是训练的图像label,测试的也同理

    2.计算数据集的均值文件

    使用caffe下的convert_imageset工具

    具体命令是

    /home/chenjie/louyihang/caffe/build/tools/convert_imageset /home/chenjie/DataSet/CompCars/data/cropped_image/ ../train_test_split/classification/train_model431_label_start0.txt ../intermediate_data/train_model431_lmdb -resize_width=227 -resize_height=227 -check_size -shuffle true

    其中第一个参数是基地址路径用来拼接的,第二个是label的文件,第三个是生成的数据库文件支持leveldb或者lmdb,接着是resize的大小,最后是否随机图片顺序

    3.调整网络层参数

    参照Caffe上的例程,我用的是CaffeNet,首先在输入层data层,修改我们的source 和 meanfile, 根据之前生成的lmdb 和mean.binaryproto修改即可
    最后输出层是fc8,
    1.首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的。
    1.调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍。

    原来是fc8,记得把跟fc8连接的名字都要修改掉,修改后如下

    4.修改Solver参数

    原来的参数是用来training from scratch,从原始数据进行训练的,因此一般来说学习速率、步长、迭代次数都比较大,在fine-tuning 微调呢,也正如它的名字,只需要微微调整,以下是两个对比图

    主要的调整有:test_iter从1000改为了100,因为数据量减少了,base_lr从0.01变成了0.001,这个很重要,微调时的基本学习速率不能太大,学习策略没有改变,步长从原来的100000变成了20000,最大的迭代次数也从450000变成了50000,动量和权重衰减项都没有修改,依然是GPU模型,网络模型文件和快照的路径根据自己修改

    5.开始训练!

    首先你要从caffe zoo里面下载一下CaffeNet网络用语ImageNet1000类分类训练好的模型文件,名字是bvlc_reference_caffenet.caffemodel
    训练的命令如下:

    OK,最后达到的性能还不错accuray 是0.9,loss降的很低,这是我的caffe初次体验,希望能帮到大家!


    展开全文
  • 我们使用在ImageNet上预训练的VGG16和ResNet50,并且在GS-PPB上fine-tune,但是ImageNet中的人类,很少有darker faces,导致模型存在shade方面的dataset bias。 总结 本文类似DANN(Bias 06)的思路:对于source ...

     

    Abstract

    偏见是当前机器学习面对的主要问题之一,表现在从医学研究中变量的虚假关联,到性别或面部识别系统中的种族偏见。但是在数据预处理阶段控制所有的偏见是笨重,甚至不可能的,因此需要在现有数据的基础上,建立公平学习特征的模型。

    本文基于对抗训练建立模型,用两个竞争目标去学习特征,使得:(1)最大化对应任务的区分能力;(2)最小化偏见的statistical mean dependence。

    具体来说,包含一个新的adversarial loss function,该损失鼓励去掉偏见和学习特征之间的关联性。

    作者在人造数据、medical images(task bias)和性别分类(dataset bias)中实验,结果显示通过本文方法学习的特征有更好的表现,同时去除了偏见。

     

    Introduction

    • Bias: one or a set of extraneours protected variables that distort the relationship between the input (independent) and output (dependent) variables
    • protected variabsles: variables that define the bias.
    • statistical mean independence: adversarial minimization of the linear correlation can remove non-linear association between the learned representations and protected variables, thus achieving statistical mean independence.

    1. 本文认为Bias分为两类:Dataset bias和task bias。

    • 其中dataset bias通常表现为缺少足够的数据,例如,对于一个通过人脸预测性别的模型,可能在不同人种中表现不一,这体现在不同人种的训练数据量不同。
    • task bias,表现在对于神经成像应用,一些人口统计学上的变量,例如性别、年龄都会影响模型的输入:神经成像,和输出:诊断。

    2. CNN通常用于提取图片特征,类似于其他机器学习方法,当不加以控制时,CNN倾向于捕捉偏见。

    3. 近期的工作聚焦在:

    • causal effect of bias on database [44, 27]
    • learning fair models with de-biased representations based on developments in invariant feature learning
    • learning fair models with de-biased representations based on developments in domain adversarial learning

    4. 本文,我们提出一个representation learning scheme,学习带有最少偏见的特征,本文的方法受启发于domain-adversarial training approaches [20] with controllable invariance [55] within the context of GANs [22].

    • 我们基于true和bias的预测值之间的Pearson 关系建立一个adversarial loss function。
    • 我们理论上证明了线性关系的adversarial minimization可以消除特征和bias之间的非线性关联,实现statistical mean independence。
    • 我们的框架类似adversarial invariant feature learning works.
    • 我们在Magnetic Resonance Images (MRIs)和Gender shades Pilot Parliaments Benchmark (GS-PPB) dataset上进行了测试。

     

    Related Work

    1. 机器学习中的偏见。近期解决这个问题的方法在:(1)建立更公平的数据集;(2)通过验证特征是否预测真实的输出,从现有数据中学习公平的特征。但是这类方法不能应用到连续变量上。

    2. Domain-Adversarial Training:[20]使用对抗训练去做域适应任务,通过使用学习特征去预测域标签(二值变量:source或target),其他方法在损失函数,域discriminator设置或自洽上进行了修改。该方法致力于close the domain gap(通过被编码为一个二元变量)。

    3. Invariant Representation Learning:这类方法旨在学习到一种“表示形式”,这种表示形式对数据的特别因素是不变的。(例如Bias 04,通过解耦place feature和appearance feature,得到相对稳定的representation)。例如:[58]使用一种信息模糊方法(information obfuscation approach),模糊处理训练时偏见数据的关联;[6, 40]引入一种正则化方法。[55]提出使用domain-adversarial训练策略去学习invariant feature。[43, 52]使用基于和域适应相似的损失函数来实现对抗技术,去预测准确的bias变量,例如52使用binary cross-entropy去移除性别的影响,[43]用linear和kernelized最小平方预测作为对抗部分。

     

    Bias-Resilient Neural Network (BR-Net)

    首先,通过cross-entropy定义分类损失。

    进一步通过网络BP和一个新的损失函数,保证bias b对于feature F是statistical mean dependece。具体来说,求出:,建立一个新的分类器。通常用cross-entropy / l2 MSE loss,使分类器损失最大,但这并不能去除statistical dependence。因此,本文定义surrogate loss,去量化b的统计独立性。具体使用squared Pearson correlation coefficient(计算向量相似度,因为欧式距离无法考虑不同变量间取值的差异,因此使用Pearson correlation是更合适的。值域为[0, 1]越小越相关)去衡量:

    我们旨在通过对抗训练,使得b和b_hat相似度为0,去除statistical dependence。整体看:

    这个式子类似于GAN [22]和domain-adversarial training [20, 55],min-max game由两个网络定义。类似GAN,本文计算如下:

    1. 计算Lc,更新c和fe参数;
    2. 固定fe,最小化Lbp,更新bp参数;
    3. 固定bp参数,最大化Lbp去更新fe参数。

     

    实验

    synthetic experiments

    人工生成了两组图片,每组包含512张图片,每张图片包含四个高斯块,对角块分别由控制。两组图片的不同在于,参数由不同均匀分布产生,其中第一组由U(1, 4),第二组由U(3, 6)。在此基础上,又给图片增加了一层高斯噪音。

    实验希望模型通过来判别模型,而不是。但实验结果显示,vanilla和multi-task模型达到了95%的正确率,因为两组生成的均匀分布有交集,因此,正确率不应该超过90%(?),结果说明vanilla和multi-task模型都使用了的信息。

     从结果来看,本文方法不依靠来进行预测,说明feature和相互独立。

     

    HIV Diagnosis Based on MRIs

    在脑MRIs图片上,分类HIV患者和对照组(CTRL)。因为HIV患者的年龄比CTRL更大,因此我们想要消除年龄这个任务偏见。通过数据增强,将HIV和CTRL图片数扩充至相同。

    task bias应该在个别组上进行处理,而不是整个数据集。本文仅在CTRLs上进行年龄的对抗训练,因为HIV患者表现出不规律的衰老。

     

    Gender Prediction Using the GS-PPB Dataset

    通过人脸预测性别,在Gender Shades Pilot Parliaments Benchmark,这个数据集包含1, 253张人脸图片,其中561张女性,692张男性。face shade通过Fitzpatrick six-point labeling system量化为6个类别,这个量化用于皮肤科医生对皮肤疾病风险的判断。

    我们使用在ImageNet上预训练的VGG16和ResNet50,并且在GS-PPB上fine-tune,但是ImageNet中的人类,很少有darker faces,导致模型存在shade方面的dataset bias。 

     

    总结

    本文类似DANN(Bias 06)的思路:对于source domain和target domain,通过反梯度训练,使得模型无法分辨source / target domain,这使模型将两域特征投影到一个特征空间。本文延续该思路,不过是针对变量级别,为了消除变量带来的bias,通过min-max模型实现。

    该方法体现在不希望模型通过bias变量去做判断。文中三个实验都是将具象化的bias,用adversarial training在特征空间“模糊”该变量,使得模型不依靠该变量去判断,从而达到不受该变量影响。

    展开全文
  • 优化:微调Finetuning

    千次阅读 2017-11-12 10:20:38
    模型的微调 使用别人训练好的网络模型进行训练,...用别人的参数、修改后的网络和自己的数据进行训练,使得参数适应自己的数据,这样一个过程,通常称之为微调(fine tuning). 微调时候网络参数是否更新 更新,f...

    模型的微调   

      使用别人训练好的网络模型进行训练,前提是必须和别人用同一个网络,因为参数是根据网络而来的。当然最后一层是可以修改的,因为我们的数据可能并没有1000类,而只有几类。把最后一层的输出类别和层的名称改一下就可以了。用别人的参数、修改后的网络和自己的数据进行训练,使得参数适应自己的数据,这样一个过程,通常称之为微调(fine tuning). 

    微调时候网络参数是否更新  

      更新,finetune的过程相当于继续训练,跟直接训练的区别是初始化的时候: 
       a. 直接训练是按照网络定义指定的方式初始化(如高斯随机初始化) 

      b. finetune是用你已经有的参数文件来初始化(就是之前训练好的caffemodel)


    caffe命令全解析


      http://www.cnblogs.com/denny402/p/5076285.html


    第二部分:微调参数调整示例

    各类模型finetune示例


    Caffe finetune Resnet-50

    http://blog.csdn.net/tangwenbo124/article/details/56070322

    Caffe finetune googlenet

    http://blog.csdn.net/sinat_30071459/article/details/51679995

    Caffe finetune FCN

    http://blog.csdn.net/zy3381/article/details/50458331

    Caffe finetune Alexnet

                     这里写图片描述

    • 参数调整注意

    • 首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的;
    • 调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍,目的是让非微调层学习更快;
    • finetune时将最后的全连接层的名字全部修改,需要根据自己数据集的类别数重新设置fc8层的output数;
    • 数据集的类别号从0开始,中间要连续,否则会造成意外的错误
    • 数据集记得打乱,不然很可能不收敛;
    • 如果出现不收敛的问题,可以把solver里的lr设的小一点,一般从0.01开始,如果出现loss=nan了就不断往小调整;
    • 可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了;
    • finetune时应该用自己的数据集生成的均值文件(是否正确?);

    第三部分:fine-tune的选择经验

      在fine-tune时,究竟该选择哪种方式的Transfer Learning?需要考虑的因素有许多,其中最重要的两条是新数据库的规模和它与预训练数据库的相似程度,根据这两条因素的不同配置,存在四种场景: 
       
      新数据库小,和预训练数据库相似。因为数据库比较小,fine-tune的话可能会产生过拟合,比较好的做法是用预训练的网络作为特征提取器,然后训练线性分类器用在新的任务上。 
      新数据库比较大,和预训练数据库相似。这种情况下,不用担心过拟合,可以放心地微调整个网络。 
      新数据库小,和预训练数据库不相似。这时,既不能微调,用预训练网络去掉最后一层作为特征提取器也不合适,可行的方案是用预训练网络的前面几层的激活值作为特征,然后训练线性分类器。 
      新数据库大,和预训练数据库不相似。这时可以从头开始训练,也可以在预训练的基础上进行微调。

     
       http://blog.csdn.net/julialove102123/article/details/78350619
       
      综述:做freeze操作时,通常还会根据数据集在不同情况进行有选择的性的finetune。如small datasets时,可以freeze前面conv layer-> fc4086来提取cnn在imagenet上的多类泛化特征来辅助作为分类的feature,再对如这边revise的fc-20->softmax进行training。以此类推,如果是medium datasets则freeze到一半的conv。个人理解这样做的很大原因在于lower level layer具有更强泛化的basic feature,同时记得考量你的数据来选择。


    第四部分:如何针对上述不同的方式进行网络参数固定

    比如有4个全连接层A->B->C->D: 

      a. 你希望C层的参数不会改变,C前面的AB层的参数也不会改变,这种情况也就是D层的梯度不往前反向传播到D层的输入blob(也就是C层的输出blob 没有得到梯度),你可以通过设置D层的lr_mult: 0,layer的梯度就不会反向传播啦,前面的所有layer的参数也就不会改变了。 
      b. 你希望C层的参数不会改变,但是C前面的AB层的参数会改变,这种情况,只是固定了C层的参数,C层得到的梯度依然会反向传播给前面的B层。只需要将对应的参数blob的学习率调整为0: 

      在layer里面加上param { lr_mult: 0 }就可以了,比如全连接层里面:

    layer {
        type: "InnerProduct"
        param { # 对应第1个参数blob的配置,也就是全连接层的参数矩阵的配置
             lr_mult: 0 # 学习率为0,其他参数可以看caffe.proto里面的ParamSpec这个类型
        }
        param { # 对应第2个参数blob的配置,也就是全连接层的偏置项的配置
            lr_mult: 0 # 学习率为0
        }
    }

    第五部分:Caffe fine-tune常见问题

    一、按照网上的教程微调alexnet,为什么loss一直是87.3365?

      解决办法:检查数据集的标签是否是从0开始,base_lr调低了一个数量级,batch_size调高一倍。 
       
      出现的原因:87.3365是个很特殊的数字,NAN经过SoftmaxWithLoss就产生了这个数字,所以就是你的FC8输出全是NAN; 
       
      具体分析: 
      http://blog.csdn.net/jkfdqjjy/article/details/52268565?locationNum=14

    二、Loss下降了,但是准确率没有明显变化? 

     解决办法:训练前首先shuffle,其次学习率是否合适。

    三、Data augmentation 的技巧总结

    • Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当);
    • PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering;
    • Random Scale:尺度变换;
    • Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换;
    • Horizontal/Vertical Flip:水平/垂直翻转;
    • Shift:平移变换;
    • Rotation/Reflection:旋转/仿射变换;
    • Noise:高斯噪声、模糊处理;
    • Label shuffle:类别不平衡数据的增广,参见海康威视ILSVRC2016的report另外,文中提出了一种Supervised 
    • # -*- coding: utf-8 -*-
      __author__ = 'Administrator'
      
      # import packages
      from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
      
      datagen = ImageDataGenerator(
              rotation_range=0.2,
              width_shift_range=0.2,
              height_shift_range=0.2,
              shear_range=0.2,
              zoom_range=0.2,
              horizontal_flip=True,
              fill_mode='nearest')
      
      img = load_img('C:\Users\Administrator\Desktop\dataA\lena.jpg')  # this is a PIL image, please replace to your own file path
      x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)
      x = x.reshape((1,) + x.shape)  # this is a Numpy array with shape (1, 3, 150, 150)
      
      # the .flow() command below generates batches of randomly transformed images
      # and saves the results to the `preview/` directory
      
      i = 0
      for batch in datagen.flow(x,
                                batch_size=1,
                                save_to_dir='C:\Users\Administrator\Desktop\dataA\pre',#生成后的图像保存路径
                                save_prefix='lena',
                                save_format='jpg'):
          i += 1
          if i > 20:
              break  # otherwise the generator would loop indefinitely

    四、如何通过loss曲线判断网络训练的情况


      单独的 loss 曲线能提供的信息很少的,一般会结合
    测试机上的 accuracy 曲线来判断是否过拟合; 

      关键是要看你在测试集上的acc如何; 
      如果你的 learning_rate_policy 是 step 或者其他变化类型的话, loss 曲线可以帮助你选择一个比较合适的 stepsize;

    五、finetune_net.bin不能用之后,用新的方法做finetune会出问题,怎么解决?   

    给最后那个InnerProduct层换个名字。

    ----------------------------------------------------------------------------------------------------------------

    1. 准备新数据的数据库(如果需要用mean file,还要准备对应的新的mean file), 具体方法和图片转换lmdb方式一样。
    2. 调整网络层参数:
    将来训练的网络配置prototxt中的数据层source换成新数据的数据库。
    调整学习率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快。
    3. 修改solver参数
    原来的数据是从原始数据开始训练的,因此一般来说学习速率、步长、迭代次数都比较大,fine turning微调时,因为数据量可能减少了,所以一般来说,test_iter,base_lr,stepsize都要变小一点,其他的策略可以保持不变。
    4. 重新训练时,要指定之前的权值文件:

    # caffe train --solver [新的solver文件] --weights  [旧的caffemodel]



    展开全文
  • pytorch fine-tune 预训练的模型

    千次阅读 2018-09-22 06:37:55
    torchvision 中包含了很多预训练好的模型,这样就使得 fine-tune 非常容易。本文主要介绍如何 fine-tune torchvision 中预训练好的模型。 安装 pip install torchvision 如何 fine-tune 以 resnet18 为例: ...
  • caffe finetune微调

    2019-08-22 11:19:31
    什么是fine-tuning: 在别人基于caffe训练好的模型(如caffenet,googlenet等)的基础上,利用别人训练好的模型的权重参数值,通过训练自己的图片集修改最后一层的(也就是softmax)的参数和输出类别,说白了就是...
  • finetune踩坑

    2019-11-13 09:18:45
    但是使用Google官方给出基于imagenet训练的预训练模型finetune的时候,trainloss总是维持在18.5降不下去。 几次尝试和摸索,总结几点(问题不分先后): 1.finetune分为两种,(一)局部微调,(二)全局微调,局部...
  • Chapter 9 Measurement Bias

    2021-03-04 20:38:20
    to-treat effect: the effect of a misclassified treatment 9.5 Per-protocol effect Fine Point The strength and direction of measurement bias Per-protocol analyses Pseudo-intention-to-treat analyses ...
  • 近年来,迁移学习改变了自然语言处理领域的范式,对预训练语言模型(PLM)进行微调(fine-tuning)已经成为了新的范式。本文主要梳理了近期的预训练语言模型做fine-tuning的进...
  • MXNet Finetune: 每一层都有个 lr_mult 属性,就是学习率的倍率,可以设置为不为1的值进行放大或缩小。 参考代码: _weight = mx.symbol.Variable("fc7_weight", shape=(args.num_classes, args.emb_size), lr_mult...
  • Data-Free Quantization Through Weight Equalization and Bias Correction PDF:...
  • fine-tuning

    千次阅读 2018-01-27 10:16:48
    首先解释一下什么叫fine-tuning,基于一个训练好的caffe模型使用自己的数据,利用训练好的模型的权重参数值,通过修改最后一层的参数和输出类别,训练出一个适合自己数据的模型。 在实际学习的和做工程的过程中我们...
  • 文章目录FINET: Context-Aware Fine-Grained Named Entity TypingAbstract1 Introduction3 Type Selection FINET: Context-Aware Fine-Grained Named Entity Typing Abstract FINET, 根据WordNet’s 的超级细粒度的...
  • finetune训练模型

    2018-03-31 22:55:55
    在已有模型上finetune自己的数据训练一个模型 1、准备训练数据和测试数据 2、制作标签 3、数据转换,将图片转为LMDB格式 前三步的过程和 如何利用自己的数据训练一个分类网络 是一样的,参考处理即可。 ...
  • caffe finetuning CaffeNet流程总结

    千次阅读 2017-04-12 16:00:46
    所谓finetuning,就是说我们针对某相似任务已经训练好的模型,比如CaffeNet, VGG-16, ResNet等, 再通过自己的数据集进行权重更新, 如果数据量比较小,可以只更新...选择Caffe做finetuning的原因在于,相比于tenso
  • 本文主要是基于英文文本关系抽取比赛,讲解如何fine-tune Huggingface的预训练模型,同时可以看作是关系抽取的一个简单案例 数据预览 训练数据包含两列。第一列是文本,其中<e1></e1>包起来的是第一个...
  • 如何进行finetune

    千次阅读 2016-05-27 11:57:15
    进行finetune的命令如下: ..\..\bin\caffe.exe train --solver=.\solver.prototxt -weights .\test.caffemodel pause   下面介绍caffe.exe的几个参数: 1)这里caffe.exe中第一个参数为train表示训练,如果为...
  • torchvision 中包含了很多预训练好的模型,这样就使得 fine-tune 非常容易。本文主要介绍如何 fine-tune torchvision 中预训练好的模型。 二、安装 pip install torchvision 三、如何 fine-tune 以 resnet18 ...
  • Caffe之fine tune

    2017-08-08 10:05:23
    一般来说我们自己需要做的方向,比如在一些特定的领域的识别分类中,...在这种情况下重新训练一个新的网络是比较复杂的,而且参数不好调整,数据量也不够,因此fine-tuning微调就是一个比较理想的选择。 所谓fine tune
  • 如何在tensorflow中进行FineTuning

    千次阅读 2018-07-12 12:00:54
    https://github.com/Alienge/learnFineTuning由于代码主要涉及一些tensorflow的基本知识,因此注释比较少,有时间我把注释补全本篇博客基于tensorflow讲如何用两种方式进行finetuning,并以tensorflow自带的手写数字...
  • YOLOv2如何fine-tuning?

    万次阅读 热门讨论 2016-12-01 18:28:58
    在上一篇用YOLOv2模型训练VOC数据集中,我们尝试用YOLOv2来训练voc数据集,但我想训练自己的数据集,那么YOLOv2如何做fine-tuning呢?我们一步一步来做~1 准备数据1.1 建立层次结构首先在darknet/data文件夹下创
  • 为什么finetune 什么是finetune finetune 与 scrachtch的区别 scrachtch fine-tuning finetune怎么操作 准备数据集 计算数据集的mean文件 调整网络层参数 输入层的source 和 meanfile 最后一层输出层的类别数 最后一...
  • caffe finetune

    2018-05-31 14:37:11
     * - bias_term (\b optional, default true). Whether to have a bias.  * - engine: convolution has CAFFE (matrix multiplication) and CUDNN (library  * kernels + stream parallelism) engines.  */...
  • Fine-tuning一个预训练的网络用作风格识别 在这个例子中,我们将探索一种在实际生活中特别有用方法:使用一个预训练的模型并且在自己的数据上Fine-tune参数 Fine-tune的好处就不说了,大家自己查找。 下面讲一讲...
  • caffe下fine-tune的demo

    2018-05-17 14:33:06
    fine-tuning:利用已有模型训练其他数据集Deep Learning或者说CNN在图像识别这一领域取得了巨大的进步,那么自然我们就想将CNN应用到我们自己的数据集上,但这时通常就会面临一个问题:通常我们的dataset都不会特别大...
  • 包括Tensorflow下的 AlexNet 网络模型搭建、测试、使用自己的数据做 fine-tunning、批量测试训练结果 主要参考文章《Finetuning AlexNet with TensorFlow》,文章《TensorFlow微调AlexNet》是对其的翻译 ...
  • fine turning微调网络

    千次阅读 2016-11-07 21:51:31
    1. 准备新数据的数据库(如果需要用mean file,还要准备对应的新的mean ...调整学习率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快。 3. 修改solver参数
  • Caffe fine-tuning 学习

    千次阅读 2016-06-28 20:58:30
    1.调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍。 原来是fc8,记得把跟fc8连接的名字都要修改掉,修改后如下 4.修改...
  • Tensorflow Finetuning VGG16——猫狗大战

    千次阅读 热门讨论 2018-08-29 09:09:51
    现在已经有很很多优秀的神经网络模型,这些模型大部分都是使用...这时候我们可以保留训练好的模型的大部分参数,而仅仅对网络的最后几层全连接层进行Finetuning。这里我们将适用猫狗大战数据集中的1500张图对V...
  • Bias V.S. Variance

    2019-11-29 19:34:09
    fine_tune = 'ex5net.pth' # save the trained network torch . save ( net . state_dict ( ) , 'ex5net.pth' ) 显示训练结果 # visualizing dataset and fitting result import matplotlib . ...

空空如也

空空如也

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

biasfine