pytorch中的setattr和getattr:多层网络堆叠

  同一个网络模块的多层叠加是深度学习中常用的操作,如果使用nn.Sequential将这些模块叠加到一起就会显得很呆:

 self.block=nn.Sequential(
            capsule_net(),
            capsule_net(),
            capsule_net(),
            capsule_net(),
            capsule_net(),
            capsule_net(), 
        )

  对于这种方法,如果需要调整模块叠加的数量也很不方便。可以使用setattr()和getattr()实现相同的效果:

# 定义时
for i in range(layer_num):
            setattr(self, "capsule_layer" + str(i + 1), capsule_net().cuda())
self.capsule_layers = [getattr(self, "capsule_layer" + str(i + 1)) for i in range(layer_num)]
# 使用时
for capsule_layer in self.capsule_layers:
            result =capsule_layer(input)

  官方文档地址:setattr()getattr()

setattr(object, name, value)此函数与 getattr() 两相对应。 其参数为一个对象、一个字符串和一个任意值。 字符串指定一个现有属性或者新增属性。 函数会将值赋给该属性,只要对象允许这种操作。 例如,setattr(x, ‘foobar’, 123) 等价于 x.foobar = 123。
getattr(object, name,[default])返回对象命名属性的值。name 必须是字符串。如果该字符串是对象的属性之一,则返回该属性的值。例如, getattr(x, ‘foobar’) 等同于 x.foobar。如果指定的属性不存在,且提供了 default 值,则返回它,否则触发 AttributeError。

  现在我们再看看上面用setattr()和getattr()实现的多层堆叠网络:

for i in range(layer_num):
            setattr(self, "capsule_layer" + str(i + 1), capsule_net().cuda())

  self即我们构建的模型对象,我们创建num个layer新增到self里,这个网络堆叠层的命名为"capsule_layer" + str(i + 1)。

self.capsule_layers = [getattr(self, "capsule_layer" + str(i + 1)) for i in range(layer_num)]

  这个方法可以将我们上面创建的网络堆叠层整理到一个self.capsule_layers里。

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一本糊涂张~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值