본문 바로가기
Learn Coding/스마트인재개발원(인공지능)

딥러닝(Deep learning) 이론 및 실습#2 - 스마트인재개발원

by 북극성매니아 2021. 12. 20.
반응형

deep learning image

 

활성화 함수(Activation Function)

신경망은 선형회귀와 달리 한 계층의 신호를 다음 계층으로 그대로 전달하지 않고 비선형적인 활성화 함수를 거친 후에 전달한다. 이렇게 하는 이유는 생물학적인 신경망을 모방한 것이기 때문이다.

약한 신호는 전달하지 않고 어느 이상의 신호도 전달하지 않는 'S'자형 곡선과 같이 '비선형적'인 반응을 한다고 생각한다. 실제로 비선형의 활성화 함수를 도입한 신경망이 잘 동작하고 있다.

 

 

활성화 함수로 비선형 함수를 사용하는 이유

- 계단 함수(step)와 시그모이드 함수(sigmoid)는 비선형 함수이다. 

- 활성화 함수로 선형함수(ex. h(z) = cz)를 사용하면 중간층(은닉층)을 여러 개 구성한 효과를 살릴 수 없다.

- y(z) = h(h(h(z))) = c * c * c * z = az

- a3 = W3 * W2 * W1 * X * c * c * c

 

여러 퍼셉트론에서 sigmoid사용시 0~1사이의 값이 여러번 곱해져서 나중엔 입력값이 작아지게 되어 특성출력이 어려워지고 판단 또한 어려워 진다. 그래서 sigmoid함수는 이진분류에서 출력층 활성화 함수로 주로 사용이 된다.

 

문제 유형에 따라 사용되는 활성화 함수와 오차함수 종류
유형 출력증 활성화 함수 오차함수
회귀 항등함수(linear) 제곱오차
mean_squared error
이진 분류 로지스틱함수(sigmoid) 교차 엔트로피
binary_crossentropy
다클래스 분류 소프트맥스함수(softmax) 교차 엔트로피
categorical_crossentropy

 

소프트맥스(softmax)함수

다중클래스 분류문제에서는 출력층 활성화 함수로 소프트맥스(softmax) 함수를 사용한다.

 

 

소프트맥스(sortmax) 예제
import numpy as np

def softmax(x):
	e_x = np.exp(x-x.max())
    return e_x/e_x.sum()
    
x = np.array([1.0, 1.0, 2.0])
y = sotmax(x)

y.sum()
# 출력 : 1.0

 

Iris 분류문제 실습
  • 필요한 라이브러리와 iris데이터셋 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

 

  • iris데이터셋 iris변수에 저장후 iris 데이터의 키값 확인하기
iris = load_iris()
iris.keys()

 

  • 문제데이터 'data'를 X에 저장, 정답데이터 'traget'을 y에 저장후 데이터 확인하기
X = iris['data']
y = iris['target']
print(X.shape, y.shape)

 

  • iris데이터를 학습데이터 75%, 테스트데이터 25%로 분리한후 데이터 확인하기

     - 학습데이터와 테스트데이터 분리시 default값이 75% : 25%이며 size로 조정할수 있다.

     - 입력 데이터의 수 : 4개

     - 정답 레이블의 갯수 : 3개

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,
                                                   random_state=10)
                                                   
X_train.shape, X_test.shape, y_train.shape, y_test.shape

 

# 입력 데이터의 수 : 4개 --> input_dim
# 정답 레이블의 갯수 : 3개 --> 출력층 units
X_train.shape, X_test.shape, y_train.shape, y_test.shape

 

  • 딥러닝 모델생성, 층(layer) 라이브리리 import하기
from tensorflow.keras.models import Sequential # 딥러닝 모델생성,뼈대
from tensorflow.keras.layers import Dense  # 층을 샇을때 사용

 

  • 모델 생성 및 설계하기

     - 활성화함수에 따라 예측값이 어떻게 달라지는지 확인하기

     - sigmoid : 이진분류의 출력층 활성화함수로 사용

     - 출력층 설계시 units =1 또는 정답컬럼 레이블의 수를 입력해준다.

     - units=1 --> 이진분류 또는 회귀문제

     - 정답컬럼 레이블의 수인 상황 --> 다중분류문제

     - 정답컬럼이 3개인데 1을 입력해보고 어떤 문제점이 있는지 확인해 보겠습니다.

# 모든 활성화함수를 sigmoid로 설계 -> 결과값 확인

# 모델 생성
model1 = Sequential()

# 입력층 설계
model1.add(Dense(10, input_dim=4, activation='sigmoid'))

# 중간층 설계
model1.add(Dense(20, activation='sigmoid'))
model1.add(Dense(30, activation='sigmoid'))
model1.add(Dense(20, activation='sigmoid'))
model1.add(Dense(10, activation='sigmoid'))

# 출력층 설계
# 출력층의 units = 1 or 정답컬럼 레이블의 수
# 1인상황 : 이진분류 or 회귀
# 정답컬럼 레이블의 수인 상황 : 다중분류
model1.add(Dense(1, activation='sigmoid'))

model1.summary()

 

  • 학습 방법 설정 및 학습하기

      - 학습결과  loss는 점점 줄어들지만 정확도는 0.312에서 변동없음 확인

      - 이로써 다중분류문제를 이진분류로 풀었을시 문제점을 확인하였음

model1.compile(
    loss = 'binary_crossentropy',
    optimizer = 'SGD',  #확률적 경사하강법
    metrics = ['accuracy']   
)

# 학습
model1.fit(X_train, y_train, epochs=20)

# 결과
Train on 112 samples
Epoch 1/20
112/112 [==============================] - 1s 8ms/sample - loss: 0.7170 - accuracy: 0.3125
Epoch 2/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6694 - accuracy: 0.3125
Epoch 3/20
112/112 [==============================] - 0s 125us/sample - loss: 0.6251 - accuracy: 0.3125
Epoch 4/20
112/112 [==============================] - 0s 107us/sample - loss: 0.5828 - accuracy: 0.3125
Epoch 5/20
112/112 [==============================] - 0s 89us/sample - loss: 0.5456 - accuracy: 0.3125
Epoch 6/20
112/112 [==============================] - 0s 125us/sample - loss: 0.5160 - accuracy: 0.3125
Epoch 7/20
112/112 [==============================] - 0s 107us/sample - loss: 0.4882 - accuracy: 0.3125
Epoch 8/20
112/112 [==============================] - 0s 98us/sample - loss: 0.4569 - accuracy: 0.3125
Epoch 9/20
112/112 [==============================] - 0s 98us/sample - loss: 0.4303 - accuracy: 0.3125
Epoch 10/20
112/112 [==============================] - 0s 116us/sample - loss: 0.4087 - accuracy: 0.3125
Epoch 11/20
112/112 [==============================] - 0s 116us/sample - loss: 0.3900 - accuracy: 0.3125
Epoch 12/20
112/112 [==============================] - 0s 125us/sample - loss: 0.3711 - accuracy: 0.3125
Epoch 13/20
112/112 [==============================] - 0s 89us/sample - loss: 0.3554 - accuracy: 0.3125
Epoch 14/20
112/112 [==============================] - 0s 107us/sample - loss: 0.3387 - accuracy: 0.3125
Epoch 15/20
112/112 [==============================] - 0s 107us/sample - loss: 0.3242 - accuracy: 0.3125
Epoch 16/20
112/112 [==============================] - 0s 116us/sample - loss: 0.3090 - accuracy: 0.3125
Epoch 17/20
112/112 [==============================] - 0s 98us/sample - loss: 0.2974 - accuracy: 0.3125
Epoch 18/20
112/112 [==============================] - 0s 116us/sample - loss: 0.2855 - accuracy: 0.3125
Epoch 19/20
112/112 [==============================] - 0s 107us/sample - loss: 0.2737 - accuracy: 0.3125
Epoch 20/20
112/112 [==============================] - 0s 98us/sample - loss: 0.2632 - accuracy: 0.3125
<tensorflow.python.keras.callbacks.History at 0x1d0ee217278>

 

  • 정답데이터를 원핫이코딩하고 데이터확인(컬럼이 1에서 3으로 변경됨)
y_train_one = pd.get_dummies(y_train)
y_test_one = pd.get_dummies(y_test)
y_train_one.shape, y_test_one.shape

# 출력
((112, 3), (38, 3))

 

  • model2 생성하여 출력층 units=3, activation='softmax'로 변경
# 모델 생성
model2 = Sequential()

# 입력층 설계
model2.add(Dense(10, input_dim=4, activation='sigmoid'))

# 중간층 설계
model2.add(Dense(20, activation='sigmoid'))
model2.add(Dense(30, activation='sigmoid'))
model2.add(Dense(20, activation='sigmoid'))
model2.add(Dense(10, activation='sigmoid'))

# 출력층 설계
# 출력층의 units = 1 or 정답컬럼 레이블의 수
# 1인상황 : 이진분류 or 회귀
# 정답컬럼 레이블의 수인 상황 : 다중분류
model2.add(Dense(3, activation='softmax'))

model2.summary()

# 출력
Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_29 (Dense)             (None, 10)                50        
_________________________________________________________________
dense_30 (Dense)             (None, 20)                220       
_________________________________________________________________
dense_31 (Dense)             (None, 30)                630       
_________________________________________________________________
dense_32 (Dense)             (None, 20)                620       
_________________________________________________________________
dense_33 (Dense)             (None, 10)                210       
_________________________________________________________________
dense_34 (Dense)             (None, 3)                 33        
=================================================================
Total params: 1,763
Trainable params: 1,763
Non-trainable params: 0

 

  • 모델2 학습방법 설정후 학습시키기

     - 정확도(accuracy)는 모델1보다 2배정도 증가하였지만 오차(loss)는 감소하지않고 높은값을 유지함

     - sigmoid 사용으로 인해 기울기 소실 문제 발생함.

# 학습 방법 설정
model2.compile(
    loss = 'binary_crossentropy',
    optimizer = 'SGD',  #확률적 경사하강법
    metrics = ['accuracy']   
)

model2.fit(X_train, y_train_one, epochs=20)

# 출력
Train on 112 samples
Epoch 1/20
112/112 [==============================] - 1s 5ms/sample - loss: 0.6414 - accuracy: 0.6667
Epoch 2/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6410 - accuracy: 0.6667
Epoch 3/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6408 - accuracy: 0.6667
Epoch 4/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6405 - accuracy: 0.6667
Epoch 5/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6402 - accuracy: 0.6667
Epoch 6/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6400 - accuracy: 0.6667
Epoch 7/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6398 - accuracy: 0.6667
Epoch 8/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6395 - accuracy: 0.6667
Epoch 9/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6394 - accuracy: 0.6667
Epoch 10/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6392 - accuracy: 0.6667
Epoch 11/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6390 - accuracy: 0.6667
Epoch 12/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6388 - accuracy: 0.6667
Epoch 13/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6386 - accuracy: 0.6667
Epoch 14/20
112/112 [==============================] - 0s 98us/sample - loss: 0.6385 - accuracy: 0.6667
Epoch 15/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6384 - accuracy: 0.6667
Epoch 16/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6382 - accuracy: 0.6667
Epoch 17/20
112/112 [==============================] - 0s 94us/sample - loss: 0.6381 - accuracy: 0.6667
Epoch 18/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6381 - accuracy: 0.6667
Epoch 19/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6380 - accuracy: 0.6667
Epoch 20/20
112/112 [==============================] - 0s 107us/sample - loss: 0.6379 - accuracy: 0.6667
<tensorflow.python.keras.callbacks.History at 0x1d0f727d400>

 

  • 활성함수 activation='relu'로 변경 / loss = 'categorical_crossentropy' 로 변경

      - 정확도는 크게 증가하였고 오차 또한 크게 감소하여 최적의 결과값을 출력하였음

# 모델 생성
model2 = Sequential()

# 입력층 설계
# relu 사용으로 인해 기울기 소실 문제발생
model2.add(Dense(10, input_dim=4, activation='relu'))

# 중간층 설계
model2.add(Dense(20, activation='relu'))
model2.add(Dense(30, activation='relu'))
model2.add(Dense(20, activation='relu'))
model2.add(Dense(10, activation='relu'))

# 출력층 설계
# 출력층의 units = 1 or 정답컬럼 레이블의 수
# 1인상황 : 이진분류 or 회귀
# 정답컬럼 레이블의 수인 상황 : 다중분류
model2.add(Dense(3, activation='softmax'))

# 학습 방법 설정
model2.compile(
    loss = 'categorical_crossentropy',
    optimizer = 'SGD',  #확률적 경사하강법
    metrics = ['accuracy']   
)

model2.fit(X_train, y_train_one, epochs=20)

# 출력
Train on 112 samples
Epoch 1/20
112/112 [==============================] - 0s 142us/sample - loss: 0.2678 - accuracy: 0.8929
Epoch 2/20
112/112 [==============================] - 0s 98us/sample - loss: 0.0953 - accuracy: 0.9643
Epoch 3/20
112/112 [==============================] - 0s 98us/sample - loss: 0.0850 - accuracy: 0.9732
Epoch 4/20
112/112 [==============================] - 0s 107us/sample - loss: 0.1025 - accuracy: 0.9554
Epoch 5/20
112/112 [==============================] - 0s 98us/sample - loss: 0.0828 - accuracy: 0.9821
Epoch 6/20
112/112 [==============================] - 0s 98us/sample - loss: 0.0742 - accuracy: 0.9911
Epoch 7/20
112/112 [==============================] - 0s 89us/sample - loss: 0.0946 - accuracy: 0.9643
Epoch 8/20
112/112 [==============================] - 0s 89us/sample - loss: 0.1358 - accuracy: 0.9375
Epoch 9/20
112/112 [==============================] - 0s 98us/sample - loss: 0.1640 - accuracy: 0.9464
Epoch 10/20
112/112 [==============================] - 0s 89us/sample - loss: 0.1027 - accuracy: 0.9464
Epoch 11/20
112/112 [==============================] - 0s 89us/sample - loss: 0.0799 - accuracy: 0.9643
Epoch 12/20
112/112 [==============================] - 0s 89us/sample - loss: 0.0732 - accuracy: 0.9911
Epoch 13/20
112/112 [==============================] - 0s 89us/sample - loss: 0.1040 - accuracy: 0.9375
Epoch 14/20
112/112 [==============================] - 0s 98us/sample - loss: 0.0801 - accuracy: 0.9554
Epoch 15/20
112/112 [==============================] - 0s 89us/sample - loss: 0.0837 - accuracy: 0.9821
Epoch 16/20
112/112 [==============================] - 0s 89us/sample - loss: 0.1021 - accuracy: 0.9554
Epoch 17/20
112/112 [==============================] - 0s 89us/sample - loss: 0.1064 - accuracy: 0.9375
Epoch 18/20
112/112 [==============================] - 0s 89us/sample - loss: 0.1462 - accuracy: 0.9286
Epoch 19/20
112/112 [==============================] - 0s 98us/sample - loss: 0.0787 - accuracy: 0.9732
Epoch 20/20
112/112 [==============================] - 0s 89us/sample - loss: 0.1058 - accuracy: 0.9464
<tensorflow.python.keras.callbacks.History at 0x1d0fe5dd5f8>

 

스마트인재개발원 사이트 : https://www.smhrd.or.kr/

 

스마트인재개발원

4차산업혁명시대를 선도하는 빅데이터, 인공지능, 사물인터넷 전문 '0원' 취업연계교육기관

www.smhrd.or.kr

반응형

댓글