Closed ganow closed 1 month ago
Coverage Report
Tests | Skipped | Failures | Errors | Time |
---|---|---|---|---|
1 | 0 :zzz: | 0 :x: | 1 :fire: | 7.334s :stopwatch: |
@ganow
ありがとうございます。
現状の Base クラスの実装では、__call__()
を abstractmethod として具象クラス側で実装するよう強制していますが、この部分をそれぞれの基底クラスで (各々の役割に応じた名前の) パブリックメソッドとして定義しておき、__call__()
でそれを呼ぶ、とするのはどう思われますか? 以下のようなイメージです。
class BaseGenerator(ABC):
"""Generator module."""
@abstractmethod
def reset_states(self) -> None:
"""Reset the state of the generator."""
pass
@abstractmethod
def parameters(self, recurse: bool = True) -> Iterator[nn.Parameter]:
"""Return the parameters of the generator."""
pass
@abstractmethod
def generate(self, latent: torch.Tensor) -> torch.Tensor:
"""Forward pass through the generator network.
Parameters
----------
latent : torch.Tensor
Latent vector.
Returns
-------
torch.Tensor
Generated image. The generated images must be in the range [0, 1].
"""
def __call__(self, latent: torch.Tensor) -> torch.Tensor:
"""Call self.generate().
Parameters
----------
latent : torch.Tensor
Latent vector.
Returns
-------
torch.Tensor
Generated image. The generated images must be in the range [0, 1].
"""
return self.generate(latent)
意図は、メソッドに名前をあたえることでそれぞれのメソッドの役割を明確化することです。あとこれはほとんど私情ですが、親クラスのプライベートメソッドをオーバーライドすることに気持ち悪さがあります。
なるほど。実装するメソッド名はモジュールごとに変えずにforwardで共通化するのはどう思いますか?nn.moduleと透過的に扱うことを意識したAPIです
なるほど。実装するメソッド名はモジュールごとに変えずにforwardで共通化するのはどう思いますか?nn.moduleと透過的に扱うことを意識したAPIです
BaseGenerator 等が必ずしも nn.module の子クラスではないので、かえって confusing かなと感じます。またモジュールクラスのインスタンスをユーザが直接扱うことは基本的にない (ユーザは外で定義するだけ) ため、呼び出す側の使い易さよりも、定義時のリーダビリティを優先したほうがいいかなと思います。なので若干煩雑ですが、クラスごとに固有の、役割を明示した名前のほうがいいかなと今は思います (とはいえ、クラス名からほとんど自明といえば自明ですが)。
sample codeを作成してのコメント
77
TODO: