1

这是我要重构的类的玩具示例。实际上,我有更多的参数/属性,比如动量,所以有很多代码重复:

class TransformBl(tf.keras.Model):
    def __init__(self, 
                 features,
                 momentum=0.1,
                 **kwargs):        
        super(TransformBl, self).__init__(**kwargs)
        self.features = features
        self.momentum = momentum
        self.transform = tf.keras.layers.Dense(self.features, use_bias=False)

    def call(self, inputs, training=None):
        x = self.transform(inputs)
        return x

我已经开始寻找避免重复的解决方案,并且attrs图书馆似乎很合适。featuresmomentum继承没有问题。不幸的是,我找不到像 我试过的那样super(TransformBl, self).__init__(**kwargs)的构造示例,但我得到了__init__super()RuntimeError: super(): no arguments

有没有办法重新编写这个类的attrs风格?

4

1 回答 1

2

更新:

attrs21.1.0 开始,已添加对两者__attrs_pre_init____attrs_init__支持。有关详细信息,请参阅有关初始化的文档

attrs对于早于 21.1.0 的版本,旧答案仍然适用:

恐怕你既不能使用也不能使用attrs数据类,因为一些难以理解的原因已经提到过。两者都不允许您__init__使用,**kwargs但更重要的是,两者都不允许您super().__init__()在设置该实例的属性之前运行,因为两者都只有post -init 挂钩的概念。

并尝试使用它会给你一个运行时错误,因为模型拦截__setattr__

RuntimeError: It looks like you are subclassing `Model` and you forgot to call `super(YourClass, self).__init__()`. Always start with this line.

attrs可以通过编写一个单独的方法来增加对您想要的支持,您可以在运行必要的超级之后__attrs_init__您的 .__init__

没有迫在眉睫的时间表,但像这样的问题是一个很好的例子。

在链接的票证中,还有一个相当复杂的解决方法,可以解决 PyTorch 的类似问题。

于 2019-10-27T16:19:42.847 回答