참고Clickhereto download the full example codePyTorch: 사용자 정의 nn.Module¶\(y=\sin(x)\)을 예측할 수 있도록,\(-\pi\)부터\(\pi\)까지
유클리드 거리(Euclidean distance)를 최소화하도록 3차 다항식을 학습합니다.이번에는 사용자가 새롭게 정의한 Module의 하위 클래스(subclass)로 모델을 정의합니다.
기존 Module들을 사용하는 간단한 구성보다 더 복잡한 모델을 원한다면, 이 방법으로 모델을 정의하면 됩니다.importtorchimportmathclassPolynomial3(torch.nn.Module):def__init__(self):"""생성자에서 4개의 매개변수를 생성(instantiate)하고, 멤버 변수로 지정합니다."""super().__init__()self.a=torch.nn.Parameter(torch.randn(()))self.b=torch.nn.Parameter(torch.randn(()))self.c=torch.nn.Parameter(torch.randn(()))self.d=torch.nn.Parameter(torch.randn(()))defforward(self,x):"""순전파 함수에서는 입력 데이터의 텐서를 받고 출력 데이터의 텐서를 반환해야 합니다.텐서들 간의 임의의 연산뿐만 아니라, 생성자에서 정의한 Module을 사용할 수 있습니다."""returnself.a+self.b*x+self.c*x**2+self.d*x**3defstring(self):"""Python의 다른 클래스(class)처럼, PyTorch 모듈을 사용해서 사용자 정의 메소드를 정의할 수 있습니다."""returnf'y ={self.a.item()}+{self.b.item()}x +{self.c.item()}x^2 +{self.d.item()}x^3'# 입력값과 출력값을 갖는 텐서들을 생성합니다.x=torch.linspace(-math.pi,math.pi,2000)y=torch.sin(x)# 위에서 정의한 클래스로 모델을 생성합니다.model=Polynomial3()# 손실 함수와 optimizer를 생성합니다. SGD 생성자에 model.paramaters()를 호출해주면# 모델의 멤버 학습 가능한 (torch.nn.Parameter로 정의된) 매개변수들이 포함됩니다.criterion=torch.nn.MSELoss(reduction='sum')optimizer=torch.optim.SGD(model.parameters(),lr=1e-6)fortinrange(2000):# 순전파 단계: 모델에 x를 전달하여 예측값 y를 계산합니다.y_pred=model(x)# 손실을 계산하고 출력합니다.loss=criterion(y_pred,y)ift%100==99:print(t,loss.item())# 변화도를 0으로 만들고, 역전파 단계를 수행하고, 가중치를 갱신합니다.optimizer.zero_grad()loss.backward()optimizer.step()print(f'Result:{model.string()}')Total running time of the script:( 0 minutes  0.000 seconds)DownloadPythonsourcecode:polynomial_module.pyDownloadJupyternotebook:polynomial_module.ipynbGallery generated by Sphinx-Gallery