728x90
반응형

DL 시작 전 가상환경 새로 생성하기

1. conda 업데이트
          > conda update -n base conda

2. pip 업데이트
          > python -m pip install --upgrade pip

3. 가상환경 생성하기
          > conda create -n gj_env_ python=3.9
4. 가상환경으로 들어가기(활성화시키기)

          > conda activate gj_env_dl
5. 외부 에디터에서 가상환경 연결(kernel) 하기 위하여 jupyter 설치하기
          > pip install jupyter notebook
6. 커널 생성하기 (base root 가상환경에서 진행)
          > python -m ipykernel install --user --name gj_env_dl --display-name gj_env_dl_kernel
7. 커널 생성 목록 확인하기
          > jupyter kernelspec list
8. 기본 패키지 설치하기( gj_env_dl에서 진행)
          > pip install ipython jupyter matplotlib pandas xlrd seaborn scikit-learn
          > pip install openpyxl
          > pip install folium (지도 시각화)
          > pip install plotly (시각화)
          > pip install xgboost (머신러닝 앙상블 분류모델)
          > pip install nltk (자연어처리)
          > pip install wordcloud
          > pip install JPype1
          > pip install konlpy (/anaconda3/envs/gj_env_dl/Lib/site-packages/konlpy/jvm.py에서 별(*) 표시 삭제)
9. 딥러닝 - 텐서플로우 설치하기( 텐서플로우  설치 후 numpy 설치하면 충돌 난다. 텐서플로우의 numpy가 따로 있다.)
          > pip install tensorflow==2.8.2
10. 딥러닝 - 모델 시각화 라이브러리
          > conda install -c conda-forge pydot graphviz

 

Tensorflow 정상적으로 설치되었는지 확인

> python
>>> from tensorflow import keras
>>> from tensorflow.keras.layers import Dense
>>> dns = keras.Sequential()

>>> dns.add(Dense(units=1, input_shape(1,)))
>>> dns.compile(optimizer="sgd", loss="mse")
>>> dns.summary()

 

인공신경망 훈련 모델 맛보기

🏓라이브러리 불러오기

import tensorflow as tf
from tensorflow import keras

import matplotlib.pyplot as plt
import numpy as np

from sklearn.model_selection import train_test_split

 

🏓랜덤 고정값 설정

''' 실행 결과를 동일하게 하기 위한 처리(완전 동일하지 않을 수도 있음) '''
tf.keras.utils.set_random_seed(42)

''' 연산 고정 '''
tf.config.experimental.enable_op_determinism()

 

데이터 수집

'''
- keras에서 제공해주는 이미지 데이터셋 사용
- MNIST 패션 이미지
- 이미지 데이터는 픽셀 데이터로 이루어져 있다.
'''
# 튜플(독립변수 종속변수) 안에 튜플(훈련데이터, 테스트데이터) 안에 array
(train_input, train_target), (test_train, test_target) = keras.datasets.fashion_mnist.load_data()
print(train_input.shape, train_target.shape)
print(test_train.shape, test_target.shape)

''' 이미지 1개에 대한 데이터 추출
    - 각 데이터는 픽셀값(색상값)
    - 픽셀값(색상값)은 0 ~ 255 (총 256개의 값드로 구성되어 있음)
'''
train_input[0]

 

훈련데이터 10개만 이용해서 데이터를 이미지로 시각화하기

''' 서브플롯 사용 : 이미지 10개를 하나로 시각화 '''
fig, axs = plt.subplots(1, 10, figsize=(10, 10))

''' 훈련데이터 10개에 대한 처리 '''
for i in range(10) : 
    ''' 픽셀데이터를 이미지로 시각화 : imshow() '''
    axs[i].imshow(train_input[i], cmap="gray_r")

    ''' x, y 좌표계 숨기기 '''
    axs[i].axis("off")
plt.show()

''' 종속변수 10개 추출해서 매핑된 값 확인해보기 '''
train_target[:10]

''' 종속변수의 범주값 확인하기 '''
np.unique(train_target, return_counts=True)

 

데이터 스케일링

  • 사용되는 데이터의 특성상 0부터 255까지의 값을 가지고 있음
  • 값의 범위 폭이 크기 때문에 일반화(데이터 스케일링)하여 사용
  • 데이터 스케일링을 수행하는 방법으로 라이브러리를 사용해도 되며, 값의 최댓값을 이용해서 산술 연산을 이용해 데이터 스케일링해도 된다.
  • 데이터 스케일링 수행하기
train_scaled_255 = train_input / 255.0
train_scaled_255[0]

test_scaled_255 = test_input / 255.0
test_scaled_255[0]

train_scaled_255.shape, test_scaled_255.shape

  • 모델 훈련에 사용하기 위해서는 2차원으로 변환 필요
train_scaled_2d = train_scaled_255.reshape(-1, 28*28)
train_scaled_2d.shape

 

훈련 : 검증 데이터로 분리 (8:2)

train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled_2d,
                                                                      train_target,
                                                                      test_size=0.2,
                                                                      random_state=42)
print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)

 

인공신경망 모델 훈련시키기 위한 단계

🏓 딥러닝은 계층 구조의 모델로 구성됨

🏓 2. 인공신경망 계층(layer) 생성하기

  • Dense
    → 딥러닝에서 가장 기본적인 계층
    → 모델에 넣어서 훈련을 수행하게 된다.

  • 딥러닝에서 사용하는 용어
    → 특성 : 뉴런이라고도 칭한다.
    → 크기 : 갯수를 의미한다.

  • 딥러닝에서 사용되는 숫자들의 범위
    →  일반적으로 딥러닝에서는 숫자의 범위를 16 ~ 512 또는 32 ~ 512로 사용한다.
    →  높이와 너비를 나타내는 숫자가 있는 경우에는 3x3 또는 5x5를 주로 사용한다.

  • 모델에는 여러개의 계층(layer)이 사용될 수 있다.
    • 첫번째 계층
      → 입력 계층(Input layer)이라고 칭한다.
      → 입력 계층에는 input_shape()가 정의된다.
      → input_shape()에는 독립변수의 열갯수를 정의한다
      → 모델에서 한개의 계층만 사용되는 경우에는 입력 계층이 곧, 출력 계층의 역할까지 수행한다.
                  >> 이 경우에는 출력 크기는 종속변수의 범주 갯수를 정의한다.
                        
    • 중간 계층
      → 은닉 계층(Hidden layer)이라고 칭한다.
      → 은닉 계층은 여러개 사용된다.
      → 은닉 계층의 출력 크기(갯수)는 일정하지 않다.
      → 출력 크기(갯수)는 사람이 정한다.
      출력 크기(갯수)는 다음 은닉계층이 입력 크기(갯수)로 받아서 훈련을 이어가는 방식이다.

    • 마지막 계층
      → 출력 계층(Output layer)이라고 칭한다.
      → 출력 계층에 사용되는 출력 크기는 종속변수의 범주 갯수를 정의한다.
  • units : 특정 계층에서의 출력의 크기(갯수), 결과갯수
    →  딥러닝 모델에는 계층이 여러개 사용될 수 있으며, 마지막 계층에는 units의 갯수는 종속변수 범주의 갯수를 사용한다.
    →  중간에 사용되는 계층을 은닉계층(hidden layer)이라고 칭하며, 중간에 사용되는 계층 간에는 출력 크기를 넘겨받아서 사용된다.
    →  중간 계층의 출력 크기에 따라서 성능에 영향을 미칠 수도 있기 때문에 하이퍼파라미터 튜닝을 진행하는 경우도 있다.
    →  하이퍼파라미터 튜닝은 값을 바꾸면서 여러번 시도하는 방식을 따른다.
        
  • kernel_initializer : 가중치를 초기화하는 방법을 지정
    →  가중치 : 손실을 최소화하기 위해서 모델이 훈련을 반복하는 과정에서 스스로 조정하는 값을 의미함
    →  가중치 초기화 방법 : uniform, normal 방법이 있음
         * uniform : 균일 분포 방법
         * normal : 가우시안 분포(정규 분포) 방법
  • activation : 활성화 함수라고 칭한다.
    →  훈련 시 입력된 특성(뉴런)의 크기를 어떤 형태의 크기로 변환할지를 결정하는 방법 정의
    →  출력계층(Output Layer)에는 해당 종속변수의 특성에 따라 결정됨
             >> 선형형태인 회귀분석의 경우 linear 사용
             >> 범주형태의 분류분석인 경우 Sigmoid, Softmax, ReLU, Tanh, Leaky ReLU 등 사용
                               > 이진분류 : Sigmoid, ReLU, Tanh, Leaky ReLU
                               > 다중분류 : Softmax
    →  입력계층 또는 은닉계층에는 Sigmoid, Softmax, ReLU, Tanh, Leaky ReLU 등이 사용됨

dense = keras.layers.Dense(units=10,
                           kernel_initializer="uniform",
                          activation="softmax",
                          input_shape=(784, )
                          )
dense

🏓 1. 인공신경망 모델 생성하기

model = keras.Sequential(dense)
model

🏓 3 . 모델 설정 단계

  • loss
    → 손실을 줄이기 위해 사용되는 함수 정의
    → 손실함수에는 categorical_crossentropy, binary_crossentropy, sparse_categorical_crossentropy 가 있음
    • categorical_crossentropy : 다중분류 손실함수
      종속변수의 데이터 값이 원-핫인코딩된 형태로 되어있는 경우 사용
      예시 데이터 : [[0, 1, 0], [0, 0, 1], [0, 1, 0], ...]
    • sparse_categorical_crossentropy : 다중분류 손실함수
      종속변수의 데이터 값이 숫자값으로 3개 이상으로 되어있는 경우 사용
      예시 데이터 : [0, 1, 2, 3, 4, ... ]
    • binary_crossentropy : 이진분류 손실함수
      종속변수의 데이터 값이 숫자값으로 2개 정의되어 있는 경우
      예시 데이터 : [0, 1, 1, 0, 0, 1, ... ]
model.compile(
    ### 손실함수 : 종속변수의 형태에 따라 결정 됨
    loss="sparse_categorical_crossentropy",
    ### 훈련 시 출력할 값 : 정확도 출력
    metrics="accuracy"
)

 

 

💡categorical_crossentropy와 관련한 원-핫 인코딩 예제

import numpy as np
from tensorflow.keras.utils import to_categorical

### 임의 데이터 생성
# - randint() : 랜덤하게 정수값을 생성하는 함수
#   --> 첫번째 인자 : 범주의 범위(0~2까지로 3개의 범주를 의미함)
#   --> 두번째 인자 : 몇 개의 랜덤한 범주값을 만들지에 대한 값(10개 생성)
labels = np.random.randint(3, size=(10,))
labels

### 원-핫 인코딩(One-Hot Encoding) 하기
# - to_categorical() : 각각의 값을 범주의 갯수만큼의 리스트로 데이터 생성
#                   : 리스트 내 데이터에서 1이 있는 곳의 인덱스 위치값은 실제 labels의 값과 동일
# - num_classes : unique한 범주의 갯수 정의
one_hot_labels = to_categorical(labels, num_classes=3)
labels, one_hot_labels.shape, one_hot_labels

🏓 4. 모델 훈련시키기

''' epochs : 훈련 반복 횟수(손실함수의 손실률을 계속 줄여나가면서 반복함) ''' 
# model.fit(train_scaled, train_target, epochs=100)
# 정확도가 거의 유사하다면 손실률이 작은 것을 선택한다.
# 91번 loss: 0.4116 - accuracy: 0.8772 와 98번 loss: 0.4140 - accuracy: 0.8774를 비교했을 때 91번 선택
model.fit(train_scaled, train_target, epochs=91)

🏓 5. 모델 성능 검증하기

score = model.evaluate(val_scaled, val_target)
score

 

인공신경망 모델 훈련 순서

  1. 모델 생성 (또는 계층 생성)
  2. 계층 생성 (또는 모델 생성)
  3. 모델 설정 (compile)
  4. 모델 훈련 시키기(fit)
  5. 성능평가(검증, evaluate)

성능 개선 방법

  • 데이터 증가 시키기
  • 하이퍼파라미터 튜닝(일반적으로 딥러닝에서는 디폴트 값을 사용해도 됨)
    성능이 현저히 낮은 경우에는 튜닝 필요
  • 계층을 추가 또는 제거

모델에서 사용한 계층 확인하기

''' 
 - Output Shape() : 출력 크기 (10개 출력) 
 - Param : 계층이 훈련 중에 사용한 총 특성의 갯수
     -> Dense() 계층 계산공식 = (입력크기 + 1) * 출력크기
                             = (784 + 1) * 10 = 7850
'''
model.summary()
# dense계층에서 훈련시킴

은닉계층(Hidden Layer) 추가하기

model.add(
    keras.layers.Dense(
        10,
        kernel_initializer="uniform",
        activation="relu",
        input_shape=(784, )
    )
)
# 훈련
model.fit(train_scaled, train_target, epochs=50)
# 검증
model.evaluate(val_scaled, val_target)
model.summary()

 

첫 dense에서 나온 출력 값 10이 그대로 dense_2로 이 입력값으로 들어감.

dense_2의 Param이 110인 이유?

(10+ 1) * 10 = 110

 

728x90
반응형

+ Recent posts