본문 바로가기
[AI]

[TensorFlow] 지도학습 전체과정 2 (Feat. 딥러닝)

by Hevton 2020. 12. 15.
반응형

보스턴 집값 예측( 독립변수 : 종속변수 = 13 : 1  )코드를 다 구현하기 전에, 

2단계인 모델의 구조를 만드는 코드에 대해서 자세히 알아보자.

이 코드는 보스턴 집값예측의 2단계 모델구조제작이다.

2번째 줄은 13개의 입력으로부터 1개의 출력을 만드는 구조(위 수식)를 만드는 것이다. 

 

X와  Y에 대한 값들을 통해 y = w1x1 + w2x2 + ... + w13x13 + b 의 수식을 만들게 되고,

이후 학습 과정은 입력되는 데이터들을 통해 이 수식의 w값들과 b값을 찾아내는 과정이다.

+ 이 때, 위 그림의 오른쪽 모형과 수식을 퍼셉트론이라고 하며, 각 w들을 가중치(weight)라고 하고, b(bias)를 편향이라고 한다

 

 

 

위 경우는 독립변수와 종속변수가 13 : 1인데, 12 : 2인 경우도 살펴보자.

하나의 결과를 만드는 데에는 수식 하나가 필요하다. 종속변수가 두 개일때는 수식이 두개가 필요하다는 것.

이 모양은 퍼셉트론 두개가 병렬로 연결된 모델이며, 찾아야 하는 가중치의 개수는 w 12개 x 2, 편향의 개수는 b x 2로, 찾아야 하는 값은 26개가 된다.

 

 

Q_여태 배운 내용에서는 뉴런이 1개로 이루어진 코드라고 했는데, 바로 위 처럼 종속변수가 2개인 경우에는 수식이 두개이므로 뉴런이 2개로 이루어진 코드인지 아니면 이것 또한 그냥 하나의 뉴런 코드이고 이걸 여러개 생성하는것이 뉴런이 여러개 되는건지.

 

 

 

 

실습

# 라이브러리 사용
import tensorflow as tf
import pandas as pd

---

# 1. 과거의 데이터를 준비합니다.
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/boston.csv'
보스턴 = pd.read_csv(파일경로)
print(보스턴.columns)
print(보스턴.head())
Index(['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax',
       'ptratio', 'b', 'lstat', 'medv'],
      dtype='object')
      crim    zn  indus  chas    nox  ...  tax  ptratio       b  lstat  medv
0  0.00632  18.0   2.31     0  0.538  ...  296     15.3  396.90   4.98  24.0
1  0.02731   0.0   7.07     0  0.469  ...  242     17.8  396.90   9.14  21.6
2  0.02729   0.0   7.07     0  0.469  ...  242     17.8  392.83   4.03  34.7
3  0.03237   0.0   2.18     0  0.458  ...  222     18.7  394.63   2.94  33.4
4  0.06905   0.0   2.18     0  0.458  ...  222     18.7  396.90   5.33  36.2

[5 rows x 14 columns]

---

# 과거의 데이터를 준비합니다 -2 (독립변수/종속변수 분리)
독립 = 보스턴[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax',
       'ptratio', 'b', 'lstat']]
종속 = 보스턴[['medv']]
print(독립.shape, 종속.shape)
(506, 13) (506, 1)

---

# 2. 모델의 구조를 만듭니다.
X = tf.keras.layers.Input(shape=[13])
Y = tf.keras.layers.Dense(1)(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')

---

# 데이터로 모델을 학습(FIT)합니다.
model.fit(독립, 종속, epochs=10)
Epoch 1/10
16/16 [==============================] - 0s 996us/step - loss: 25.9486
Epoch 2/10
16/16 [==============================] - 0s 1ms/step - loss: 26.2359
Epoch 3/10
16/16 [==============================] - 0s 1ms/step - loss: 26.0069
Epoch 4/10
16/16 [==============================] - 0s 893us/step - loss: 25.7854
Epoch 5/10
16/16 [==============================] - 0s 1ms/step - loss: 25.9335
Epoch 6/10
16/16 [==============================] - 0s 1ms/step - loss: 25.9713
Epoch 7/10
16/16 [==============================] - 0s 1ms/step - loss: 25.9654
Epoch 8/10
16/16 [==============================] - 0s 1ms/step - loss: 25.8405
Epoch 9/10
16/16 [==============================] - 0s 1ms/step - loss: 25.5130
Epoch 10/10
16/16 [==============================] - 0s 1ms/step - loss: 25.6521
<tensorflow.python.keras.callbacks.History at 0x7f4197011b38>

---

# 모델을 이용합니다
model.predict(독립[0:5]) # 전체 데이터가 500여개이므로, 그 중 0번째부터 5번째 이전까지 사용하겠다는 것.
array([[29.758816],
       [25.010143],
       [30.82426 ],
       [30.039917],
       [29.459476]], dtype=float32)

파이썬에서 [x:y] 같은 슬라이싱 기법은 x번째부터 y번째 이전까지 가져오겠다는 것이다.

참고 - twpower.github.io/119-python-list-slicing-examples

---

추가로, 만들어진 모델의 수식도 확인 가능하다.

# 모델의 수식 확인
model.get_weights()
[array([[-0.08968529],
        [ 0.07270886],
        [-0.05623049],
        [ 3.3505297 ],
        [ 1.5807014 ],
        [ 4.2172647 ],
        [ 0.01162136],
        [-0.9383048 ],
        [ 0.1505183 ],
        [-0.00932971],
        [-0.0279138 ],
        [ 0.01629341],
        [-0.560724  ]], dtype=float32), array([2.4452467], dtype=float32)]

위 뜻은, 만들어진 수식이 아래와 같다는 것.

집값 = -0.08968529 * x1 + 0.07270886 * x2 + -0.05623049 * x3 + 3.3505297 * x4 +
      1.5807014 * x5 + 4.2172647 x6 + 0.01162136 * x7 + -0.9383048 * x8 +
      0.1505183 * x9 + -0.00932971 * x10 + -0.0279138 * x11 + 0.01629341 * x12 +
      -0.560724 * x13 + 2.4452467

 

출처 - opentutorials.org/

반응형