精华内容
下载资源
问答
  • 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')

     

    展开全文
  • 支持rasa json数据格式的bert finetune 准备 在训练finetune模型前需要先下载bert pre-train model,这里用的是中文的,可去官网下载chinese_L-12_H-768_A-12 。 json文件称为rasa_dataset_training.json ,dev的...
  • finetune-transformer-lm Code and model for the paper "Improving Language Understanding by Generative Pre-Training" Currently this code implements the ROCStories Cloze Test result reported in the paper...
  • finetune-images

    2017-11-03 17:49:56
    caffe finetune 训练图片集,里面包括5个文件夹,五类图片,可用于caffe finetune训练。
  • MXNet Finetune: 每一层都有个 lr_mult 属性,就是学习率的倍率,可以设置为不为1的值进行放大或缩小。 参考代码: _weight = mx.symbol.Variable("fc7_weight", shape=(args.num_classes, args.emb_size), lr_mult...

    1. MXNet Finetune:

    每一层都有个 lr_mult 属性,就是学习率的倍率,可以设置为不为1的值进行放大或缩小。
    参考代码:

    _weight = mx.symbol.Variable("fc7_weight", shape=(args.num_classes, args.emb_size), lr_mult=1.0)
    

    示例:

    weight=mx.sym.var('fc1_voc12_c3_weight', lr_mult=0.1)
    fc1_voc12_c3=mx.symbol.Convolution(name='fc1_voc12_c3',data=conv_feat, weight=weight, kernel,(3,3),no_bias=True,num_filter=num_classes,dilate=24)
    

    lr_mult在全连接层和optimizer都可以设置,但是只用在一个地方设置就可以了?
    在optimizer设置:https://github.com/apache/incubator-mxnet/issues/3539
    更多示例:https://github.com/apache/incubator-mxnet/issues/3555

    2. Pytorch Finetune:

    加载所有层的参数:

    checkpoint = torch.load(checkpoint_PATH)
     # load all the parameters
     model.load_state_dict(checkpoint['state_dict'])
    

    只加载部分层的参数

     # only load the params exist in pretrained model weights
     pretrained_dict = checkpoint['state_dict']
     model_dict = model.state_dict()
     # 1. filter out unnecessary keys
     pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
     # 2. overwrite entries in the existing state dict
     model_dict.update(pretrained_dict)
     model.load_state_dict(model_dict)
     print("=> loaded checkpoint '{}' (epoch {})".format(modelFile, checkpoint['epoch']))
    

    设置哪些层固定不变

    model_ft = models.resnet50(pretrained=True) # 这里自动下载官方的预训练模型,并且
    # 将所有的参数层进行冻结
    for param in model_ft.parameters():
        param.requires_grad = False
    # 这里打印下全连接层的信息
    print(model_ft.fc)
    num_fc_ftr = model_ft.fc.in_features #获取到fc层的输入
    

    设置学习率变化策略

    from torch.optim import lr_scheduler
    # Decay LR by a factor of 0.1 every 7 epochs
    exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
    model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, num_epochs=25)
    
    

    https://blog.csdn.net/qq_34914551/article/details/87699317

    不同层设置不同的学习率:

    # get fc params
    fc_params = model.output_layer[3].parameters()
    ignored_params = list(map(id, fc_params))
    # get not-fc params
    base_params = filter(lambda p: id(p) not in ignored_params, model.parameters())
    
    # 对不同参数设置不同的学习率
    lrs = [conf['base_lr'], conf['fc_lr']]
    print('Using LR', lrs)
    params_list = [{'params': base_params, 'lr': lrs[0]}, ]
    params_list.append({'params': fc_params, 'lr': lrs[1]})
    optimizer = torch.optim.SGD(params_list, lrs[1], momentum=conf['momentum'], weight_decay=conf['weight_decay'])
    
    展开全文
  • finetune分为全局finetune和局部finetune。首先介绍一下局部finetune步骤: 1.固定参数 for name, child in model.named_children(): for param in child.parameters(): param.requires_grad = False 后,只传入...
  • Laravel开发-finetune

    2019-08-27 13:35:55
    Laravel开发-finetune 微调CMS。基于Laravel框架构建
  • finetune facenet

    2019-10-01 12:43:57
    in facenet.py - train line-219 if finetune_params: print('正在微调,使用了微调参数,固定了某些层.[in facenet.py - train]') variables_averages_op = variable_averages.apply(finetune_params) ...

    in facenet.py - train line-219

    if finetune_params:
    	print('正在微调,使用了微调参数,固定了某些层.[in facenet.py - train]')
        variables_averages_op = variable_averages.apply(finetune_params)
    
    展开全文
  • Pytorch之finetune

    千次阅读 2019-06-06 17:40:46
    finetune分为全局finetune和局部finetune。首先介绍一下局部finetune步骤: 1.固定参数 for name, child in model.named_children(): for param in child.parameters(): param.requires_grad = False 后,只传入...

    finetune分为全局finetune和局部finetune。首先介绍一下局部finetune步骤:

    1.固定参数

        for name, child in model.named_children():
           for param in child.parameters():
               param.requires_grad = False
    

    后,只传入 需要反传的参数,否则会报错
    filter(lambda param: param.requires_grad, model.parameters())

    2.调低学习率,加快衰减

    finetune是在预训练模型上进行微调,学习速率不能太大。
    目前不清楚:学习速率降低的幅度可以更快一些。这样以来,在使用step的策略时,stepsize可以更小一些。
    直接从原始数据训练的base_lr一般为0.01,微调要比0.01小,置为0.001
    要比直接训练的小一些,直接训练的stepsize为100000,finetune的stepsize: 50000

    3. 固定bn或取消dropout:

    batchnorm会影响训练的效果,随着每个batch,追踪样本的均值和方差。对于固定的网络,bn应该使用全局的数值

    def freeze_bn(self):
        for layer in self.modules():
            if isinstance(layer, nn.BatchNorm2d):
                layer.eval()
    

    训练时,model.train()会修改模式,freeze_zn()应该在这里后面
    4.过滤参数
    训练时,对于优化器,应该只传入需要改变的参数,否则会报错

    filter(lambda p: p.requires_grad, model.parameters())
    
    展开全文
  • finetune与Bert

    2020-04-20 22:36:28
    1 直接finetune 2 layer finetune 有一层不使用与训练参数 3ULMFiT Universal Language Model Fine-tuning for Text Classification 逐层解冻
  • finetune踩坑

    2019-11-13 09:18:45
    但是使用Google官方给出基于imagenet训练的预训练模型finetune的时候,trainloss总是维持在18.5降不下去。 几次尝试和摸索,总结几点(问题不分先后): 1.finetune分为两种,(一)局部微调,(二)全局微调,局部...
  • 今天小编就为大家分享一篇tensorflow estimator 使用hook实现finetune方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 11.2 模型finetune

    2020-10-08 21:25:27
    一、Transform Learning 与 Model Finetune 二、pytorch中的Finetune 一、TransferLearning 与 Model Finetune 1. 什么是Transfer Learning? 迁移学习是机器学习的一个分支,主要研究源域的知识如何应用到...
  • Deep Learning 15-Finetune.pdf
  • Finetune是一个库,允许用户利用最新的经过预训练的NLP模型来执行各种下游任务。 Finetune当前支持以下模型的TensorFlow实现: BERT ,摘自 RoBERTa ,摘自 GPT ,摘自 GPT2 ,来自 TextCNN ,摘自 时间卷积...
  • Caffe中的fine tune

    2018-12-10 09:42:24
    所谓fine tune就是用别人训练好的模型,加上我们自己的数据,来训练新的模型。fine tune相当于使用别人的模型的前几层,来提取浅层特征,然后在最后再落入我们自己的分类中。 在train的执行文件 train.sh 中加入–...
  • 主要介绍了python PyTorch参数初始化和Finetune,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 复现BART finetune历程

    2021-01-18 10:32:34
    复现BART finetune历程 准备 安装fairseq,使用fairseq官方提供的finetune代码 git clone https://github.com/pytorch/fairseq cd fairseq pip install --editable ./ 下载Xsum与DailyCNN数据集,已处理为train...
  • finetune_ssd_kitti.py

    2017-06-30 19:39:52
    finetune_ssd_kitti.py,用于fine-tune SSD的COCO模型
  • Finetune on 3D dataset

    2020-12-26 17:48:02
    <p>I would like to finetune a model on my dataset. The tutorials to do so seems to be for 2D images. Are you planning to include also those for 3D? <p>Thanks</p><p>该提问来源于开源项目:open-...
  • tensorflow-finetune保存

    2019-07-02 22:53:09
    finetune主要采用此博客的方法: https://blog.csdn.net/Alienge/article/details/81012363 同时非常感谢该博主 最近需要做个例子,先训练,然后测试,再finetune,再测试。训练和finetune不说了, 就是那个博客的...
  • finetune训练模型

    2018-03-31 22:55:55
    在已有模型上finetune自己的数据训练一个模型 1、准备训练数据和测试数据 2、制作标签 3、数据转换,将图片转为LMDB格式 前三步的过程和 如何利用自己的数据训练一个分类网络 是一样的,参考处理即可。 ...
  • Finetune Bert for Chinese NLP 问题被证明同图像一样,可以通过 finetune 在垂直领域取得效果的提升。Bert 模型本身极其依赖计算资源,从 0 训练对大多数开发者都是难以想象的事。在节省资源避免重头开始训练的同时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,382
精华内容 6,952
关键字:

finetune