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__取ることはできませんが、さらに重要なことに、どちらもpost -init フックの概念しか持っていないため、そのインスタンスの属性を設定する前**kwargsに実行することはできません。super().__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__から自分自身を呼び出すことができる別のメソッドを作成することで、必要なもののサポートを拡大できます: https://github.com/python-attrs/attrs/issues/393__init__

差し迫ったタイムラインはありませんが、このような問題はその良い例です。

リンクされたチケットには、PyTorch の同様の問題を解決するかなり精巧な回避策もあります。

于 2019-10-27T16:19:42.847 に答える