함께하는 데이터 분석

[Pytorch] 인공 신경망 모델 학습 본문

데이터분석 공부/ML | DL

[Pytorch] 인공 신경망 모델 학습

JEONGHEON 2022. 9. 12. 14:54

모델 구현

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.init as init

from tqdm.notebook import tqdm
import matplotlib.pyplot as plt

torch.nn에는 신경망 모델들이 포함

 

torch.optim에는 경사 하강법 알고리즘이 들어있음

 

torch.nn.init에는 텐서에 초깃값을 주기 위해 필요한 함수들이 있음

 

tqdm 라이브러리를 사용하여 상태진행률을 확인할 수 있음

 

num_data = 1000
num_epoch = 10000

noise = init.normal_(torch.FloatTensor(num_data,1), std=1)
x = init.uniform_(torch.Tensor(num_data,1), -15, 15)
y = x**2 + 3
y_noise = y + noise

num_data에 사용할 데이터의 수와 num_epoch에 경사 하강법 반복 횟수를 지정

 

x에 [num_data, 1] 모양의 텐서를 생성하는데 이 텐서의 값들을 init.uniform_() 함수를 통해 -15 ~ 15까지 균등하게 초기화

 

결과적으로 x에는 -15 ~ 15까지의 숫자들이 무작위로 할당

 

y에는 x에 대한 종속변수로 y=x^2+3 연산을 통해 값이 초기화 됨

 

그리고 현실성을 반영하기 위해 노이즈를 추가해주는데 정규분포 평균은 0, 표준편차는 1로 지정

 

x.shape, y_noise.shape

>>> (torch.Size([1000, 1]), torch.Size([1000, 1]))

사용할 데이터의 수를 1000개로 지정해서 [1000, 1]로 제대로 지정된 것을 확인할 수 있음

 

model = nn.Sequential(
    nn.Linear(1,6),
    nn.ReLU(),
    nn.Linear(6,10),
    nn.ReLU(),
    nn.Linear(10,6),
    nn.ReLU(),
    nn.Linear(6,1)
    )

nn.Sequential 클래스를 사용하여 nn.Linear, nn.ReLU와 같은 모듈들을 인수로 받아서 순서대로 정렬 후 입력값이 들어오면 순서대로 모듈을 실행하여 결괏값을 리턴

 

인공 신경망의 깊이가 깊어질수록 하나하나 실행하는 것보다 묶어서 연산하는 것이 편리함

 

loss_func = nn.L1Loss()
optimizer = optim.SGD(model.parameters(), lr=0.001)

모델에서 나온 결과와 y_noise와의 차이를 구하는 척도로 L1Loss()를 사용하고 이는 L1손실을 뜻함

 

그리고 경사 하강법을 사용하기 위해 stochastic gradient descent의 약자인 SGD 옵티마이저를 사용하고

 

학습률로는 0.001을 사용

 

 

모델 학습

loss_array = []

for i in tqdm(range(num_epoch)):
    optimizer.zero_grad()
    output = model(x)
    loss = loss_func(output, y_noise)
    loss.backward() # 그래디언트 구하기
    optimizer.step() # 업데이트
    
    loss_array.append(loss)
    
    if i % 500 == 0:
        print(f'Epoch {i}\'s Loss: {loss}')

 

그래프로 결과 확인

loss_array = torch.stack(loss_array, dim=0)

plt.rc('font', family = 'AppleGothic') # mac 
# plt.rc('font', family = 'Malgun Gothic') # window
plt.rc('font', size = 12)
plt.rc('axes', unicode_minus = False) # -표시 오류 잡아줌

plt.figure(figsize=(12, 6))
plt.plot(loss_array.detach().numpy())
plt.grid(True)
plt.title("학습에 따른 손실의 감소")
plt.xlabel("epoch")
plt.ylabel("Loss")
plt.show()

모델을 학습하면서 기록해둔 손실을 그래프로 그리는 코드

 

그림과 같이 epoch의 값이 커지면 손실이 0에 가까워지는 것을 확인할 수 있음

 

plt.figure(figsize=(12, 6))
plt.scatter(x,y_noise,alpha=0.2)
plt.scatter(x, model(x).detach().numpy(),s=3)
plt.grid(True)
plt.show()

파란 점은 노이즈를 추가한 데이터이고 주황색 선은 학습한 모델을 통해 유추한 값을 의미

 

학습할 때는 노이즈가 추가된 데이터만을 사용하여 인공 신경망 모델이 이를 유추하도록 학습

 

중간중간 꺾인 부분은 렐루 활성화 함수의 영향임

 

은닉층은 해당 층의 입력값에 가중치를 곱해줌으로써 선형 변환이 일어나도록 하고 렐루 활성화 함수는 이 중 0보다 작은 값들을 모두 0으로 만들기 때문에 여러 은닉층을 통과하면서 여러 지점에서 꺾인 모양이 나타나게 됨


https://www.hanbit.co.kr/store/books/look.php?p_code=B7818450418 

 

파이토치 첫걸음

딥러닝 구현 복잡도가 증가함에 따라 ‘파이써닉’하고 사용이 편리한 파이토치가 주목받고 있다. 파이토치 코리아 운영진인 저자는 다년간 딥러닝을 공부하고 강의한 경험을 살려 딥러닝의

www.hanbit.co.kr

 

'데이터분석 공부 > ML | DL' 카테고리의 다른 글

[Pytorch] 순환 신경망 모델 학습  (2) 2022.09.20
[RNN] 순환 신경망  (2) 2022.09.20
[Python] 파이토치(Pytorch) 설치하기  (0) 2022.09.07
[Scikit Learn] PCA  (0) 2022.08.28
[Scikit Learn] Random Forest  (0) 2022.08.28