unilm 可变变量不应该作为默认参数,

zazmityj  于 23天前  发布在  其他
关注(0)|答案(2)|浏览(24)

描述bug

问题出现在以下代码中:

@BACKBONES.register_module()
class BEiT(nn.Module):
    """ Vision Transformer with support for patch or hybrid CNN input stage
    """
    def **init**(self, img_size=224, patch_size=16, in_chans=3, num_classes=80, embed_dim=768, depth=12,
               num_heads=12, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop_rate=0., attn_drop_rate=0.,
               drop_path_rate=0., hybrid_backbone=None, norm_layer=None, init_values=None, use_checkpoint=False,
               use_abs_pos_emb=True, use_rel_pos_bias=False, use_shared_rel_pos_bias=False,
               **out_indices=[3, 5, 7, 11]**):
        super().**init**()

预期行为

可变变量不应作为默认参数。

6bc51xsx

6bc51xsx1#

你好,jsrdcht,你能提供更多信息吗?比如正在运行的具体命令是什么?

wmvff8tz

wmvff8tz2#

如果在某个地方修改了 out_indices 列表(一个可变对象),那么在后续对该函数的调用中,out_indices 的默认值将是 e.g. [3, 5, 7, 11, 13] 而不是最初设想的 [3, 5, 7, 11]

来自 Python 文档的相关代码片段:
当执行函数定义时,默认参数值从左到右进行求值。这意味着表达式只计算一次,即在定义函数时,并且每次调用都使用相同的“预先计算”的值。特别是当默认参数值是一个可变对象(如列表或字典)时,这一点尤为重要:如果函数修改了该对象(例如,通过向列表中添加一个项目),则默认参数值实际上已被修改。这通常不是最初设想的那样。

https://docs.python.org/3/reference/compound_stmts.html#function-definitions

相关问题