描述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**()
预期行为
可变变量不应作为默认参数。
2条答案
按热度按时间6bc51xsx1#
你好,jsrdcht,你能提供更多信息吗?比如正在运行的具体命令是什么?
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