cs [COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 2
본문 바로가기
  • 매일 한걸음씩
  • 매일 한걸음씩
개발/Deep Neural Networks with PyTorch 리뷰

[COURSERA] Deep Neural Networks with PyTorch by IBM 강의 리뷰 2

by 시몬쯔 2020. 3. 29.
728x90
반응형

 

본 포스팅은 2.1-2.3의 내용에 대한 리뷰이다.

 

2.1 Linear Regression in 1D - Prediction

 

  • Prediction
  • Class Linear
  • Build Custom Modules

 

1) Prediction

먼저, 이러한 표현식을 만들기 위해서는 parameter인 w(slope 또는 weight)와 b(bias)를 정의해야 한다.

torch.tensor를 이용하여 정의해준다. w와 b는 update 되어야 할 파라미터이기 때문에 requires_grad = True로 설정해줘야 한다.

파라미터 w, b를 정의했으면 forward 함수 yhat = w*x + b를 정의해준다. 보통 yhat은 예측값 그리고 y는 실제 값을 뜻한다.

x가 저 텐서로 정의되었을 때 forward함수에 넣어 yhat을 구해보면 이런 식으로 나온다.

 

2) Class Linear

 

이제 모듈을 이용하여 Linear를 사용해보자!

 

torch.nn은 pytorch에 있는 neural network 패키지이다. 여기서 Linear를 import 한다.

언제나와 같이 random 하게 수를 초기화하기 위해 torch.manual_seed()를 쓴다.

 

import 한 Linear를 가지고 model을 만든다. 모델 lr.parameters()를 list로 출력해보면 random 하게 정의된 w와 b를 볼 수 있다. 이경우에서는 w = 0.5153 그리고 b = -0.44로 초기화된 linear model이다.

 

우리가 만든 linear model인 lr에. state_dict()을 이용하면 python dictionary형태로 각 parameter를 알 수 있다. dictionary에서 사용하는 .keys() 와 .values()를 통해 키와 값 또한 알 수 있다. 여기서 keys는 'weight', 'bias'이고

values는 우리가 위에서 random 하게 얻어진 0.5153 그리고 -0.4414이다.

또한 lr.weight나 lr.bias를 통해서 직접 알아낼 수도 있다.

 

또는 우리가 파이썬에서 dictionary[key]를 이용하면 value를 얻는 방법을 사용할 수도 있다.

 

3) Build Custom Modules

자, 이제 torch.nn의 Linear와 같은 것을 이용하지 말고 직접 modules를 만들어보자.

 

준비단계로 torch로부터 nn을 import 한다.

nn.Module를 상속받아서 customize 한다.

super(LR, self).__init__() 부분은 nn.Module.__init__()를 하겠다는 뜻이라 볼 수 있다.

 

forward함수를 linear함수로 하여 return 한다.

customize 한 모델 LR를 이용하여 linear regression model lr를 만든다.

lr = LR(1,1) 여기서 input_size = 1, output_size = 1이 된다.

print 해보면 lr.parameters는 w, b가 각각 나오고, lr.linear은 init부분에서 self.linear = nn.Linear(input_size, output_size)이므로 둘 다 1이 나온다.
   

x를 넣어 예측해보면 yhat = w*x + b이므로 yhat = -0.1939*1 + 0.4694 = 0.2755가 됨을 확인할 수 있다.

결과도 예측과 같이 나온다.

 

똑같이 .state_dict()을 이용해 출력해보면 weight, bias를 알 수 있다. 차이점은 위에서는 dictionary의 key가 weight, bias였는데 여기서는 linear.weight, linear.bias임을 알 수 있다. 아마도 위에서는 torch.nn에서 Linear를 바로 사용해서 model을 만들었고 여기서는 nn.Module을 사용하면서 linear는 모델의 일부이기 때문에 linear.weight라고 부가적으로 설명이 붙은 듯하다.

 

 

 

2.2 Linear Regression 1D: Training One Parameter

앞에서는 random 하게 초기화된 w, b를 그저 사용했는데 이 단원에서는 데이터에 맞는 parameter를 구하기 위해 training을 시킬 것이다.

 

  • Make Some Data
  • Create the Model and Cost Function(Total Loss)
  • Train the Model

1) Make Some Data

준비과정으로 numpy와 matplotlib.pyplot을 import 해준다.

(두 가지를 동시에 할 수 있는 matplotlib.pylab이 있지만 전에서도 말했듯이 두 가지를 한 네임스페이스에 쓰는 것은 혼란을 야기할 수 있기 때문에 각각 import 해준다.)

 

좀 이따 보여줄 data space를 시각화하기 쉽게 만들어주는 클래스를 정의한다.

 

2) Make Some Data

이제 데이터를 만들어보고 이에 맞는 model를 찾아보자.

당연히 이전에 import torch 해줘야한다.

-3부터 3까지 0.1 간격으로 data X를 만들어준다. view(-1, 1)를 이용하여 열을 한 개로 만들어준다. 앞의 -1는 데이터의 열의 수를 1로 만들었을 때 대응하는 행의 수이다. 여기서는 60이다.

plotting을 해보면 (tensor를 plotting 하려면 numpy로 바꿔서 해줘야하므로 .numpy()를 붙여야 한다.)

우리가 쉽게 예상 가능한 y = -3*x함수 그래프가 나온다.

 

정답인 f에 가우시안 노이즈를 더해서 Y를 만들어보자.

항상 이미지에서도 가우시안 노이즈가 더해졌다고 하는데 통계 모델에서도 노이즈는 가우시안 분포로 가정하나 보다. 이것에 관해서는 후에 찾아보고 포스팅해봐야겠다.(detach, torchvision, gaussian noise 세 개가 누적되어 있음)

f와 함께 noise를 추가한 데이터 Y를 그려보면 이런 식으로 된다.

3) Create the Model and Cost Function (Total Loss)

자, 이제 model를 만들고 cost function을 정의해보자.

 

forward함수를 linear 함수인 w*x로 정의한다.

가장 흔히 사용하는 MSE loss를 이용한다. 말 그대로 error의 square(제곱 값)을 평균(mean) 낸 loss.

 

Hyperparameter인 learning rate을 0.1로 정의하고(learning rate에 관해서는 뒤 포스팅에서 확인할 수 있다.) 각 단계에서 loss 값을 저장할 리스트 LOSS를 초기화한다.

 

weight를 -10.0으로 초기화한다. gradient를 이용하여 loss 값을 줄이는 방향으로 training 해야 하기 때문에 requires_grad = True로 설정한다.

 

이제 train_model함수를 정의하여 loss를 줄여 Yhat이 원하는 값(Y)에 가까워지도록 training 해보자.

 

1 epoch는 전체 dataset을 1번 다 훑어서 트레이닝하는 것이라 보면 된다.

 

  • Yhat 은 위에서 정의한 forward 함수 y = w*x 에 input X를 넣어 나온 값이고.
  • loss는 MSE loss를 이용하여 Yhat와 우리가 다가가고자 하는 값 Y사이의 거리를 구한다.(우리가 최소화 시켜야할 값)
  • loss.backward()는 parameter w에 관해 gradient값을 계산하고
  • w.data = w.data - lr * w.grad.data는 gradient descent방법을 이용해서 w를 업데이트한다.
  • w.grad.data_zero_()는 gradient들을 zero로 만들어준다.

이제, 함수를 실행해보자.

 

epoch를 총 4번으로 하여 실행하면,

 

각 iteration에 따른 loss function과 y = w*x그래프가 나온다.

(앞으로는 캡처말고 바로 jupyter notebook을 따오는 방법을 써야겠다...)

iteration이 지남에 따라 loss function에 최솟값에 가까워지고 원래의 함수에 빨간선이 수렴하는 것을 알 수 있다.

 

각 iterations/epoch에 따른 loss를 저장해놓은 리스트 LOSS를 그려보면 다음과 같이 iterations/epoch가 지남에 따라 cost/loss가 줄어드는 것을 확인할 수 있다.

 

LOSS2는 처음 w를 -15.0으로 했을 때인데, (LOSS는 w = -10.0으로 초기화)

LOSS보다 느리게 cost/loss가 감소하는 것을 볼 수 있다. (최적의 w는 -3.0이므로 -15.0이 -10.0보다 -3.0로부터 더 멀리있는 값이기 때문에 더 오래걸리는 것 같다.)

 

 

뒤에서는 learning_rate와 초기화 값에 따른 loss 감소 추세를 볼 예정이다.

 

2.3 Linear regression 1D: Training Two Parameter

2.2에서는 y = w*x linear model를 이용했다. 즉 parameter는 w하나였다.

여기서는 y = w*x + b 모델을 이용하여 parameter w, b 두 개를 training 하는 것을 배운다.

 

2.2과 매우 비슷하여 많은 것을 skip하였다.

 

X를 -3부터 3까지 0.1간격인 60개의 수이고 열을 1로 한다. 즉 shape은 60X1이 된다.

 

f는 X-1로 하였고 Y는 f에 gaussian noise를 더한 데이터이다.

 

 

forward함수는 linear 함수에 bias를 더한 y = w*x + b가 된다.

criterion은 MSE loss를 이용하였다.

 

w, b를 각각 -15.0, -10.0으로 초기화하고 update해야하는 paramter이기 때문에 requires_grad = True로 설정한다.

learning rate은 0.1 그리고 각 epoch단계에서의 loss를 저장하는 list LOSS도 설정해놓는다.

 

앞에서는 w.data만 업데이트한 반면에 여기서는 

w, b 둘 다 gradient descent method로 업데이트한다.

 

   # update parameters slope and bias
        w.data = w.data - lr * w.grad.data
        b.data = b.data - lr * b.grad.data      

 

(Gradient Descent Method는 뒤에서 소개된다.)

 

 

여기까지가 2.1-2.3의 내용이다.

728x90
반응형

댓글