SW/Python

파이썬 : 딥러닝 퍼셉트론 예제 따라하기

얇은생각 2019. 9. 18. 07:30
반응형
import matplotlib.pyplot as plt
import numpy as np
from keras.layers import *
from keras.models import *
from keras.utils import *
from collections import Counter

 

이번 포스팅에서는 딥러닝에 가장 기본적인 모델인 퍼셉트론 예제를 구현해보겠습니다. 우선 필요한 라이브러리들을 임포트합니다.

 

 

 

x = np.linspace(1, 10, 1000)
y = 2 * x + 1

 

그리고 x는 1부터 10까지 사이의 1000개의 수를 담습니다. y는 x에 2를 곱해주고 1을 더해주는 1차 방정식을 활용해서 전체 값을 담아줍니다. 

 

 

 

print(x)
print(y)

# x 출력값
# [ 1.          1.00900901  1.01801802  1.02702703  1.03603604  1.04504505
#   1.05405405  1.06306306  1.07207207  1.08108108  1.09009009  1.0990991
#   1.10810811  1.11711712  1.12612613  1.13513514  1.14414414  1.15315315
# 
# y 출력값
# [ 3.          3.01801802  3.03603604  3.05405405  3.07207207  3.09009009
#   3.10810811  3.12612613  3.14414414  3.16216216  3.18018018  3.1981982
#   3.21621622  3.23423423  3.25225225  3.27027027  3.28828829  3.30630631

 

그렇다면 위와 같이 값이 잘 담기는 것을 확인할 수 있습니다. 총 1000개의 데이터가 1부터 10사이에 잘 담겨있고, y도 마찬가지로 해당 수식에 맞게 값이 잘 담겨 있는 것을 확인할 수 있습니다.

 

 

 

model = Sequential()
model.add(Dense(1, activation='linear', input_shape=(1,)))
model.summary()
model.compile(loss='mse', optimizer='sgd')

# _________________________________________________________________
# Layer (type)                 Output Shape              Param #   
# =================================================================
# dense_11 (Dense)             (None, 1)                 2         
# =================================================================
# Total params: 2
# Trainable params: 2
# Non-trainable params: 0
# _________________________________________________________________

 

간단한 모델링을 구현합니다. 출력과 인풋은 1개로 동일하기 떄문에 다음과 같이 모델링 합니다. 그리고 활성화함수는 linear를 활용하고 손실 함수와 최적화 함수는 mse, sgd를 활용합니다.

 

 

 

model.fit(x,y, epochs=20)

# Epoch 1/20
# 1000/1000 [==============================] - 0s 270us/step - loss: 4.9176
# Epoch 2/20
# 1000/1000 [==============================] - 0s 76us/step - loss: 0.0666
# Epoch 3/20
# 1000/1000 [==============================] - 0s 70us/step - loss: 0.0532
# Epoch 4/20
# 1000/1000 [==============================] - 0s 74us/step - loss: 0.0422
# Epoch 5/20
# 1000/1000 [==============================] - 0s 67us/step - loss: 0.0333
# Epoch 6/20
# 1000/1000 [==============================] - 0s 65us/step - loss: 0.0266
# Epoch 7/20
# 1000/1000 [==============================] - 0s 65us/step - loss: 0.0211
# Epoch 8/20
# 1000/1000 [==============================] - 0s 65us/step - loss: 0.0168
# Epoch 9/20
# 1000/1000 [==============================] - 0s 70us/step - loss: 0.0132
# Epoch 10/20
# 1000/1000 [==============================] - 0s 62us/step - loss: 0.0106
# Epoch 11/20
# 1000/1000 [==============================] - 0s 67us/step - loss: 0.0085
# Epoch 12/20
# 1000/1000 [==============================] - 0s 66us/step - loss: 0.0067
# Epoch 13/20
# 1000/1000 [==============================] - 0s 65us/step - loss: 0.0054
# Epoch 14/20
# 1000/1000 [==============================] - 0s 66us/step - loss: 0.0042
# Epoch 15/20
# 1000/1000 [==============================] - 0s 65us/step - loss: 0.0034
# Epoch 16/20
# 1000/1000 [==============================] - 0s 71us/step - loss: 0.0027
# Epoch 17/20
# 1000/1000 [==============================] - 0s 68us/step - loss: 0.0021
# Epoch 18/20
# 1000/1000 [==============================] - 0s 70us/step - loss: 0.0017
# Epoch 19/20
# 1000/1000 [==============================] - 0s 67us/step - loss: 0.0014
# Epoch 20/20
# 1000/1000 [==============================] - 0s 68us/step - loss: 0.0011

 

x와 y의 값을 넣어주고 20번을 훈련시켜줍니다. 훈련은 다음과 같이 잘 진행되는 것을 확인할 수 있습니다. 

 

 

 

pred_x = []
pred_x = np.append(pred_x, 12)
pred_x = np.append(pred_x, 14)
pred_y = model.predict(pred_x)

 

훈련은 마무리 되어 있고, 값이 잘 나오는지 확인해 보겠습니다. 우선 pred_x 변수에 12, 14의 값을 담아줍니다. 그다음 model에 해당 값에 따른 예측값을 pred_y에 담아봅니다. 

 

 

 

plt.scatter(pred_x, pred_y)
plt.plot(x, y)
plt.show()
model.get_weights()

퍼셉트론 결과값

 

그래프에 해당 값들을 표현해 보겠습니다. 우선 예측값 12, 14를 점으로 찍어봅니다. 그리고 이전에 담은 x, y의 값들도 그래프에 표현하였습니다. 그래프를 보시면, 주어진 값에 따라 예측을 잘 하고 있다는 것을 확인할 수 있습니다. 비선형적인 문제 역시도 이러한 방식을 중첩하여 활용하는 것이 바로 딥러닝의 기초라고 할 수 있습니다. 앞으로 다양한 예제들을 활용해 보도록 하겠습니다.

반응형