딥러닝 네트워크를 이용한 회귀
Squential 모델과 Dense 레이어를 사용한 간단한 네트워크를 형성하여 회귀 네트워크를 만들어보겠습니다. 앞선 포스팅에서 만든 XOR 연산 네트워크 또한 회귀 네트워크의 하나라고 할 수 있습니다.
일반적인 회귀 방법
일반적으로 numpy, tensorflow, sklearn 라이브러리를 사용한 회귀 방법이 있습니다. 이것은 머신러닝 (7) 포스팅에 정리하였습니다.
Test 환경
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
x = 2 * np.random.rand(100, 1)
y = 4 + 3 * x + np.random.randn(100, 1)
x값의 범위는 0부터 2의 범위의 랜덤값, y값의 범위는 y=3x+4에 0과 1사이의 랜덤값을 추가한 값입니다. y=3x+4의 경향을 가진 데이터라고 보시면 됩니다.

모델 생성

위의 그림과 같은 네트워크를 만들어보겠습니다.
model = tf.keras.Sequential([
tf.keras.layers.Dense(units=6, activation='tanh',input_shape=(1,)),
tf.keras.layers.Dense(units=1)
])
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss='mse')
간단하게 뉴런 6개의 1단 레이어 하나와 뉴런 1개의 2단 레이어를 만들었습니다. 활성함수는 하이퍼볼릭 탄젠트(tanh)함수를 사용하였습니다. 출력 값이 -1과 1사이의 값이 나오는 함수입니다.
최적화 함수(optimizer)는 SGD를 사용하고, 손실 값 기준은 mse를 사용하였습니다.
모델의 요약을 출력하면 아래와 같습니다.

그림의 모양과 유사하면서, Param의 수가 일치하는 것을 확인 할 수 있습니다. 이제 네트워크 모델에 훈련을 시키겠습니다.
모델 훈련
history = model.fit(x, y, epochs=100)
100회 반복 학습을 시켰습니다. 그 결과를 확인하면 아래와 같습니다.
x_pred = np.arange(min(x), max(x), 0.01)
y_pred = model.predict(x_pred)
plt.plot(x, y, 'bo')
plt.plot(x_pred, y_pred, 'r-')
plt.show()

확인을 한 결과 어느정도 경향성이 나타나는 그래프가 그려지는 것을 확인 할 수 있습니다.
다항 분류(Multi Classification)
- 3개 이상의 Label을 갖는 데이터에 대한 분류 작업을 의미합니다.
- 딥러닝 네트워크에서 활성화 함수는 주로 Softmax를 사용합니다.
- Softmax
- Softmax는 각각 Label별로 확률을 출력하는 활성화 함수입니다.
- 모든 출력 값을 합치면 1이 됩니다.

- cost function은 cross-entropy를 사용합니다. 그 이유는 미분의 편의성이 있기 때문입니다.
- 출력 값들을 e의 지수로 사용하여 계산 후 모두 더한 값으로 나눈 것들이 결과입니다.
- max와 비슷한 의미로서, 큰 값을 강조하는 함수이지만, 모든 값의 합이 1이 되도록 유지합니다.
- 큰 값을 강조하고, 작은 값은 약화시키는 효과를 가지고 옵니다.
- 마지막 레이어는 softmax 함수를 사용하며, 뉴런의 개수는 class의 개수와 동일하게 정해줍니다. ont-hot encoding을 사용하기 때문에, 출력값이 class 개수와 동일하여야 합니다.
- categorical_crossentropy
- 다중 분류에서 사용하는 손실 함수입니다. 엔트로피(entropy)는 데이터를 숫자로 정량화하는 단위입니다.
- 엔트로피는 확률의 역수에 로그를 취한 값입니다. 확률이 높을 수록 데이터의 중요도가 낮다고 판단하기 때문에 역수를 취합니다.
- 크로스 엔트로피(crossentropy)는 각 엔트로피에 확률을 곱해준 기댓값과 유사합니다. 확률 대신 네트워크가 예측한 확률값을 곱합니다. 네트워크가 예측한 값을 q(x)라고 합니다.
- 이항은 두개부터, 다항은 세개 이상의 범주로 이루어져있습니다. 범주형 크로스 엔트로피(categorical cross entropy, CCE)는 모든 범주에 대한 크로스 엔트로피의 평균을 내는 것을 의미합니다.

- 네트워크가 아래의 q(x)와 같이 예측을 하였고, 실제 답은 p(x)일 때, CCE는 아래와 같이 구할 수 있습니다.

다항 분류 in Tensorflow 2.0
model = tf.keras.Sequential([
tf.keras.layers.Dense(units=48, activation='relu', input_shape=x_train[0].shape),
tf.keras.layers.Dense(units=24, activation='relu'),
tf.keras.layers.Dense(units=12, activation='relu'),
tf.keras.layers.Dense(units=3, activation='softmax')
])
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.07),
loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
- 클래스가 3개로 나누어진 경우의 모델입니다. 마지막 Dense 레이어의 유닛수가 클래스 수에 맞게 3으로 설정하였습니다.
- softmax 활성화 함수를 사용하였고, 손실함수 categorical_crossentropy를 지정해주고, metric은 정확도를 사용하면 됩니다.
'Deep Learning > Fundamentals' 카테고리의 다른 글
| CNN (Convolutional Neural Network) (0) | 2023.08.11 |
|---|---|
| 분류(Classification) 네트워크 (0) | 2023.08.11 |
| AND, OR, XOR 연산 신경망 만들기 (0) | 2023.08.11 |
| 텐서플로우 2.0 기초와 뉴런 만들기 (0) | 2023.08.11 |
| Object-Detection 정리(History) (0) | 2023.08.04 |