본문 바로가기
DeepLearning Framework & Coding/Pytorch

[pytorch 따라하기-4] 인공신경망(ANN) 구현

by 노마드공학자 2021. 7. 25.

[pytorch 따라하기-1] 구글 Colab에 pytorch 세팅하기 https://limitsinx.tistory.com/136

[pytorch 따라하기-2] Tensor생성 및 Backward https://limitsinx.tistory.com/137 

[pytorch 따라하기-3] 경사하강법을 통한 선형회귀 구현 https://limitsinx.tistory.com/138

 

※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다

※해당 글은 PC에서 보기에 최적화 되어있습니다.

 

 


 

ANN이란?

출처 : stackoverflow  https://stackoverflow.com/questions/9600888/single-perceptron-non-linear-evaluating-function

인공지능은 1990년대까지 침체기에 들어섰었습니다.

 

이제까지 저희가 정리해온 코드들은 모두 Single Layer Perceptron으로 input layer 다음 바로 output layer가 나오는 경우죠

 

즉, Y=WX+b라는 선형식으로 cassification을 하는것인데.. 이런 선형식으로 위의 Exclusive OR은 어떻게 구분할수있을까.. 라는 문제에 직면하게 됩니다.

 

출처 :  https://mylearningsinaiml.wordpress.com/what-is-dl/

즉, 위의 별과 동그라미를 직선 한개로 어떻게 구별해낼 수 있을까요?

 

없습니다...

이때문에 이것을 해결하기 위해서는 Single layer가 아닌 Multiple layer의 Error BackPropagation을 사용해야한다! 라고 주장하신분이 토론토대학교의 제프리힌튼 교수님이십니다.

 

single layer perceptron

 

즉, 기존에는 이렇게 Single Layer Perceptron으로 진행하던것을,

 

multi layer perceptron

 

이렇게 Hidden layer를 중간에 두어, 깊이를 깊게한번 만들어보자!해서 만들어진것이 Deep Neural Network입니다.

 

 

 코드

import torch

import torch.nn as nn

import torch.optim as optim

import torch.nn.init as init

import matplotlib.pyplot as plt

#Image plotting을 위한 Libraly(matplot)

 

num_data = 1000

num_epoch = 10000

#1000개의 데이터로 학습하며, 10000번 반복합니다.

 

noise = init.normal_(torch.FloatTensor(num_data,1),std=1)

x=init.uniform_(torch.Tensor(num_data,1),-10,10)

y=(x**2)+3

y_noise = y + noise

#y=x.^2 + 3 수식에 noise를 섞습니다.

#이렇게 noise를 섞은 데이터로 학습하여 y=x^2+2이라는 수식을 정확하게 추정해낼 수 있는지를 보는것이 목표입니다.

 

model = nn.Sequential(

    nn.Linear(1,2),

    nn.ReLU(),

    nn.Linear(2,3),

    nn.ReLU(),

    nn.Linear(3,4),

    nn.ReLU(),

    nn.Linear(4,1)

)

#ReLU라는 Activation Function을 사용하여, 4개의 Linear Layer로 모델 구현

# Input layer에 1개씩 데이터가 들어가므로 nn.Linear(1,2)이며, 최종적으로 1개의 값이 나와야하기에 Output Layer는 nn.Linear(4,1)

 

loss_func = nn.L1Loss()

optimizer = optim.SGD(model.parameters(),lr = 0.0002)

loss_array = []

 

for i in range(num_epoch) : 

    optimizer.zero_grad()

    output = model(x)

    loss = loss_func(output,y)

    loss.backward()

    optimizer.step()

 

    loss_array.append(loss)

 

    if i == num_epoch - 1:

        print(loss.data)

        param_list = list(model.parameters())

        #최종 학습된 마지막 결과물의 Parameter 저장

        print(param_list)

 

plt.plot(loss_array)

plt.show()

#Loss(y_predicted - y_real)값이 어떻게 변하는지 그래프로 도식화

 

결과값

현재 모델을 하기와 같이 코딩해주었습니다.

 

model = nn.Sequential(

    nn.Linear(1,2),

    nn.ReLU(),

    nn.Linear(2,3),

    nn.ReLU(),

    nn.Linear(3,4),

    nn.ReLU(),

    nn.Linear(4,1)

)

 

이것으로, 결과값을 해석해보자면, 첫 Tensor에서 2행 1열의 값이 나오게되고(nn.Linaer(1,2))

ReLU를 통해 1행 2열의 값으로 변환하여, 다음 Layer에 투입하게 됩니다.

그 결과, 3행 2열의(nn.Linear(2,3)) 값이 나오게되고, ReLU를 통해 다음 Layer에 넣을 수 있도록 1행 3열의 값으로 변환하고, 다시 nn.Linear(3,4)로 4행 3열의 데이터를 만들고...를 반복하는 모델입니다.

여기서 각 Matrix의 값들은 Layer마다의 Parameter(w,b)입니다.

 

Loss

matplot을 통해 plotting한 그림을 보면 Loss값이 학습이 진행될수록 낮아지는것을 확인할 수 있습니다.

(Loss가 낮아짐 = 정확도 상승)

댓글