• python eval 的用处


    定义的网络,有三个模块组成:

    class RecModel(nn.Module):
        def __init__(self, config):
            super().__init__()
            assert 'in_channels' in config, 'in_channels must in model config'
            backbone_type = config.backbone.pop('type')
            assert backbone_type in backbone_dict, f'backbone.type must in {backbone_dict}'
            self.backbone = backbone_dict[backbone_type](config.in_channels, **config.backbone)
    
            neck_type = config.neck.pop('type')
            assert neck_type in neck_dict, f'neck.type must in {neck_dict}'
            self.neck = neck_dict[neck_type](self.backbone.out_channels, **config.neck)
    
            head_type = config.head.pop('type')
            assert head_type in head_dict, f'head.type must in {head_dict}'
            self.head = head_dict[head_type](self.neck.out_channels, **config.head)
    
            self.name = f'RecModel_{backbone_type}_{neck_type}_{head_type}'
    

    现在需要finetune模型,冻结一些参数。
    在配置文件中写了需要finetune的层, 'fine_tune_stage': [ 'backbone','neck', 'head'],
    整个网络就三个模块,'fine_tune_stage': [ 'backbone','neck', 'head'],
    然后看哪个模块不在配置文件的'fine_tune_stage'里面,就说明需要冻结参数。

    
    def get_fine_tune_params(net, finetune_stage):
        """
        获取需要优化的参数
        Args:
            net:
        Returns: 需要优化的参数
        """
    
        # aa = net.backbone
        # aaa = net.module.backbone  #net = nn.DataParallel(net) 之后需要加module
    
        all_stage = ['backbone', 'neck', 'head']
        for stage_ in all_stage:
            if stage_ not in finetune_stage:
                stage_now = eval("net.module." + stage_)
                for name, value in stage_now.named_parameters():
                    value.requires_grad = False
    

    eval好啊,写个string类型的就可以代表函数名字。
    一开始实验了一下aaa = net.module.backbone确实可以把模块提取出来,然后问题来了,如何来写,写if语句是可以,分三个情况写出来。这样不简洁。

    stage_now = eval("net.module." + stage_)
    

    这句可以搞定!!!

    python eval 语法
    eval() 函数用来执行一个字符串表达式,并返回表达式的值。

    eval(expression[, globals[, locals]])
    
    expression -- 表达式。
    globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
    locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
    
    
    >>>x = 7
    >>> eval( '3 * x' )
    21
    >>> eval('pow(2,2)')
    4
    >>> eval('2 + 2')
    4
    >>> n=81
    >>> eval("n + 4")
    85
    
    

    举几个例子感受一下,字符串与list、tuple、dict的转化。

    a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
    b = eval(a)
    b
    Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
    type(b)
    Out[4]: list
    a = "{1: 'a', 2: 'b'}"
    b = eval(a)
    b
    Out[7]: {1: 'a', 2: 'b'}
    type(b)
    Out[8]: dict
    a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
    b = eval(a)
    b
    Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
    

    https://blog.csdn.net/liuchunming033/article/details/87643041
    Python:eval的妙用和慎用 https://blog.csdn.net/lu8000/article/details/44217499?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control

    好记性不如烂键盘---点滴、积累、进步!
  • 相关阅读:
    小白初学iOS中OTA部署(适应iOS7.1)
    CocoaPods管理本地库简单步骤
    CocoaPods问题记录
    UIPanGestureRecognizer下方法
    2013年度总结(反思篇)
    iOS7中cell的分割线右移的解决方法
    接触CocoaPods遇到的问题
    iOS摄像头问题
    iPhone4激活出错,菜鸟试验!!!!!
    详解UIPickerView
  • 原文地址:https://www.cnblogs.com/yanghailin/p/14814778.html
Copyright © 2020-2023  润新知