머신러닝 및 딥러닝

nn.Module에서 super

AlgoPoolJa 2021. 1. 10. 22:26

 

위에 코드들의 공통점은 클래스들이 모두 pytorch의 nn.Module을 상속했다는 것이다. 하지만 이것의 super에서 __init__ 을 호출 할때 어떠한 것은 매개변수에 자신의 클래스 이름과 self를 넣는 반면 어떠한 것은 아무것도 넣지 않고 그냥 호출한다.

개인적으로 뭔가 이해가 안되는 코드가 있으면 계속 눈에 밟여서 신경이 쓰여 찾아본 결과 단순 버전 차이로 발생된 차이이다. 즉, pytorch의 전 버전에서는 어떠한 파라미터를 넣지 않는 것이 맞는것이다.

위의 코드는 pytorch에서 class Module(object): 의 __init__을 가져온것이다. 보다시피 self 외에 어떠한 파라미터도 갖지 않는 것을 볼 수 있다. 

 

그렇다면 어떤 클래스를 만들고 만약 그 클래스가 pytorch에 어떤 클래스를 상속한다면 항상 def __init__(self) 에 super().__init__() 을 해줘야 할까?  사실 이 질문은 pytorch에 해당하는 문제라기 보다는 파이썬 자체에 해당하는 문제라고. 생각하는게 맞다. 우선 질문에 대한 답을 해보자면 아니다. 만약 상속을 하려고하는 pytorch 클래스 안에 생성자(def __init__()) 이 없을 경우에는 호출 해주지 않아도 된다. 

대표적인 예를 보여주자면 3번째 케이스에 해당 되겠다. torch.utils.data.Dataset 에 코드를 보면 아래와 같이 되어있다. 즉 def __init__ 이 없는 것을 볼 수 있다.