본문 바로가기
Machine Learning

Pytorch Example : XOR 학습 예제 코드 (신경망 Neural Net)

by 무적물리 2020. 7. 4.

최근 머신러닝을 수행하기 위한 패키지로 Pytorch 인기가 좋습니다. 머신러닝을 하기 위해서는 GUI 기반의 머신러닝 S/W를 구매해서 사용하는 것이 편하지만 개인이나 기업입장에서 비싼돈을 주고 라이센스를 구매해야하기 때문에 부담이 큰 것이 사실입니다. 사실, 어느정도 코딩만 할 수 있다면 간편하게 머신러닝 모델을 구축할 수 있습니다.


Pytorch 신경망 예제


이번 포스팅에서는 Pytorch 패키지를 사용해서 신경망을 구성하고 XOR 연산을 학습하는 예제 코드를 만들어보겠습니다. 단계별로 각 코드에 대해 설명할 예정이고 제일 하단에 전체 코드가 있으니 참고하시면 되겠습니다.


Pytorch 신경망 예제 XOR 학습하기


XOR 연산

XOR 예제를 학습하기 위해서는 XOR이 무엇인지에 대해 알아야합니다. 많은 분들이 이미 알고계시겠지만 혹시나하는 노파심에 공유합니다. 머신러닝에서 XOR에 대한 역사가 깊은데, 차후에 기회가 된다면 추가 포스팅하겠습니다. 


Pytorch 신경망 예제


XOR 연산은 두 숫자가 같으면 0, 다르면 1을 출력하는 연산입니다. 기본적으로 AND, OR, NOT 연산이 있지만 머신러닝 입장에서는 상징과 같은 XOR 연산을 사용해서 예제를 구성했습니다.


신경망 모형

귀찮은 이유로 코드만 설명할까하다가 어떤 형태로 신경망이 구성되는지에 대해 먼저 설명하고 가는 것이 좋다고 판단하여 Neural Network 모형에 대해 먼저 설명합니다. 이번 예제는 아래와 같이 도식화할 수 있으며, 아래 코드에서 동일하게 적용됩니다.


Pytorch 신경망 예제


입력은 A, B 2개이며, 출력은 OUT 1개 입니다. 은닉층(Hidden Layer)은 1개로 구성되어 있으며, 은닉층을 구성하는 노드는 5개로 구성했습니다. 활성화함수는 ReLU 입니다.


입력 : 2개

출력 : 1개

은닉층 : 1층

은닉노드 : 5개



패키지 선언

XOR 신경망 연산을 하기 위해 이번 예제에서 사용할 패키지는 pytorch 입니다. 선언은 'torch'로 하시면 됩니다. 패키지 설치가 안되신 분들은 'pip3 install torch'를 사용해서 해당 패키지를 설치하시면 되겠습니다.


import torch


학습데이터 선언

학습데이터는 XOR 연산에 맞게 아래와 같이 예제 데이터를 작성합니다. Pytorch에 데이터를 사용하기 위해서는 Tensor 형태로 데이터를 만들어줘야합니다. 데이터의 개수도 자동으로 계산되게 만들 수 있겠지만 간단하게 손으로 입력했습니다.


D_in, H, D_out = 2, 5, 1

x = torch.tensor([[0., 0.], [0., 1.], [1., 0.], [1., 1.]])

y = torch.tensor([[0.], [1.], [1.], [0.]])


모델 생성

모델은 위에서 도식화한 신경망 모형과 동일하게 생성합니다. 아래와 같이 모델을 생성할 수 있으며, 간단하게 이해하실 수 있을거라 생각합니다. 예제 학습데이터와 같이 입력 2개, 출력 1개, 히든노드 5개 입니다.


model = torch.nn.Sequential(

    torch.nn.Linear(D_in, H),

    torch.nn.ReLU(),

    torch.nn.Linear(H, D_out),

)



학습 관련 옵션

XOR 예제 신경망 학습을 위해 Learning Rate와 Cost, Optimizer에 대한 설정이 필요합니다. Cost는 많이 사용되는 Mean Square Error(MSE)를 사용했으며, Optimizer로는 그 유명한 Adam Optimizer를 사용했습니다.


# Step Size

learning_rate = 1e-4


# Cost 계산

loss_fn = torch.nn.MSELoss(reduction='sum')


# Optimizer

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)


신경망 모델 학습

학습데이터를 사용해서 15000번 학습을 수행했습니다. 학습을 수행하면서 cost를 계산하고 100번마다 한번씩 cost를 출력하는 코드를 작성했습니다. 위 학습 옵션을 사용해서 오차역전파(Back Propagation)를 통해 신경망의 weight를 학습해나갑니다.


epoch = 15000


for t in range(epoch+1):

    y_pred = model(x)

    loss = loss_fn(y_pred, y)

    if t % 100 == 99:

        print(t, loss.item())


    optimizer.zero_grad()

    loss.backward()

    optimizer.step()



전체코드

# 패키지 선언

import torch


# 데이터생성

D_in, H, D_out = 2, 5, 1

x = torch.tensor([[0., 0.], [0., 1.], [1., 0.], [1., 1.]])

y = torch.tensor([[0.], [1.], [1.], [0.]])


# 모델생성

model = torch.nn.Sequential(

    torch.nn.Linear(D_in, H),

    torch.nn.ReLU(),

    torch.nn.Linear(H, D_out),

)


# Step Size

learning_rate = 1e-4


# Cost 계산

loss_fn = torch.nn.MSELoss(reduction='sum')


# Optimizer

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)


epoch = 15000


# 학습

for t in range(epoch+1):

    y_pred = model(x)

    loss = loss_fn(y_pred, y)

    if t % 100 == 99:

        print(t, loss.item())


    optimizer.zero_grad()

    loss.backward()

    optimizer.step()


마치며

이번 포스팅에서는 간단하게 Pytorch를 사용해서 XOR을 학습시키는 모델을 구성하였습니다. Tensorflow 보다 코드가 간결하기 때문에 머신러닝 알고리즘을 구성하는데 있어서 편리하다고 생각합니다. 사실 Tensorflow 역시 익숙해지면 생각 없이 사용할 수 있는데, 트렌드는 Pytorch 입니다.


댓글