딥러닝(Deep Learning)
- 머신러닝의 대표적인 학습법
- 여러 층을 거쳐 점점 추상화 단계로 접어드는 알고리즘 형태
- 패턴을 찾기 위해선, 패턴을 견고하게 만드는 많은 훈련데이터가 필요
ReLU 함수
- ReLU(x) = max(0, x)
- 0보다 작은 값을 0으로 강제
- 딥러닝에서 가장 많이 사용됨
- 미분 값이 일정(0 or 1)하여 학습이 효율적
- 구현이 단순하여 매우 빠른 연산
Tensorflow
- Google이 2015년에 공개한 머신러닝 오픈소스 Framework
- ML 모델을 개발하고 학습시키는 데 도움이 되는 핵심 오픈소스 라이브러리
- TensorFlow는 graph로 연산(computation)을 나타내는 프로그래밍 시스템
- 데이터 = Tensorflow, 데이터 흐름 = Graph 로 표현
- import tensorflow as tf
- Tensor = 일관된 유형을 가진 다차원 배열 (일종의 np.array 같은 개념)
TensorFlow로 만드는 딥러닝 구조와 학습에 필요한 요소
- 모델(네트워크)를 구성하는 레이어(layer)
- 입력 데이터와 그에 대한 목적(결과)
- 학습시에 사용할 피드백을 정의하는 손실 함수(loss function)
- 학습 진행 방식을 결정하는 옵티마이저(optimizer)
Layer
- 신경망의 핵심 데이터 구조
- 하나 이상의 텐서를 입력받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈
- 상태가 없는 레이어도 있으나 대부분 가중치(weight)라는 레이어마다의 상태를 가짐
- weigth(가중치) = 확률적 경사 하강법에 의해 학습되는 하나 이상의 텐서
※ Keras에서 사용되는 주요 레이어
Dense, Activation, Flatten, Input
Dense
- 완전연결계층(Fully-Connected Layer)
- 노드수(유닛수), 활성화 함수(activation), 입력의 크기(input_shape) 등을 지정
- input_shape = (feature 수 or X_train 행, 차원수) 입력층에서만 입력
- name을 통한 레이어간 구분 가능
Activation (활성화 함수)
- Dense layer에서 미리 activation를 지정할 수도 있고, 필요에 따라 별도 레이어를 만들어줄 수 있음
- Activation 종류 참고 : https://keras.io/ko/activations/
- 주로 relu를 사용하고 출력층에서는 softmax 사용
Flatten
- Batch의 크기(또는 데이터 크기)를 제외하고 데이터를 1차원으로 쭉 펼치는 작업
ex) (128, 3, 2, 2) -> (128, 12)
Input
- 모델의 입력을 정의
- shape, dtype을 포함
- 하나의 모델은 여러 개의 입력을 가질 수 있음
- summary()를 통해서는 보이지 않음
Batch
- 딥러닝에서 배치는 모델의 가중치를 한번 업데이트시킬 때 사용되는 샘플들의 묶음을 의미
ex) 훈련 샘플 1000개, batch_size = 20 -> 20개의 샘플 단위마다 모델의 가중치를 한번씩 업데이트
-> 총 50번(=1000/20) 가중치 업데이트 -> 하나의 데이터셋을 총 50개의 배치로 나눠서 훈련을 진행
Epoch
- 학습의 횟수를 의미
- fit(1000, epochs = 10, batch_size = 20) -> 데이터 1000개, 가중치를 50번 업데이트하는 것을 총 10번 반복
-> 각 데이터 샘플이 총 10번씩 사용되는 것으로 결과적으로 가중치가 총 500번 업데이트
Keras
- 딥 러닝 모델을 빌드하고 학습시키기 위한 TensorFlow의 상위 수준 API
- complie = 학습 전에 optimizer, loss, metrics 설정
※ keras에서 loss 하이퍼파라미터 설정
1. categorical_crossentropy
- 출력 값이 one-hot encoding된 결과로 나옴 -> label(y)을 one-hot encoding해서 넣어줘야 함
- 클래스가 상호 배타적일 경우(각 샘플이 정확히 하나의 클래스에 속하는 경우) 사용
2. sparse_categorical_crossentropy
- integer type 클래스 -> one-hot encoding하지 않고 정수 형태로 label(y)을 넣어줌
- 한 샘플에 여러 클래스가 있거나 label이 soft 확률일 경우 사용
Model 만드는 방법
- Sequential, 함수형 API, Subclassing
Sequential
- 모델이 순차적인 구조로 진행할 때 사용
- Sequential 객체 생성 후 add()를 이용한 방법과 Sequential 인자에 한번에 추가 방법이 있음
- 다중 입력 및 출력이 존재하는 등의 복잡한 모델을 구성할 수 없음
# 방법1 Sequential 인자에 한번에 추가
# 은닉층 32-12
model = tf.keras.Sequential([
tf.keras.layers.Dense(units=32, activation='relu', input_shape=(4,)), # 처음에는 입력받아야하니
tf.keras.layers.Dense(units=12, activation='relu'), # input_shape = (feature 수, 차원수)
tf.keras.layers.Dense(units=3, activation='softmax') # 출력층 3
])
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.003), loss='sparse_categorical_crossentropy',
metrics=['accuracy']) # learning_rate 설정 가능
# 방법2 Sequential 객체 생성 후 add()
model = tf.keras.Sequential()
# 은닉층 32-12
model.add(tf.keras.layers.Dense(32, input_dim=4, activation='relu'))
model.add(tf.keras.layers.Dense(12, activation='relu'))
# 출력층 3
model.add(tf.keras.layers.Dense(3, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# learning_rate 설정 불가능
함수형 API
- 모델을 복잡하고, 유연하게 구성 가능
- 다중 입출력을 다룰 수 있음
# input 인자로 이전 layer의 output을 대입하는 것
# Functional API의 첫번째 layer는 Input layer 이어야 함
input_layer = tf.keras.Input(shape=(28, 28), name='InputLayer')
x1 = tf.keras.layers.Flatten(name='Flatten')(input_layer)
x2 = tf.keras.layers.Dense(256, activation='relu', name='Dense1')(x1)
x3 = tf.keras.layers.Dense(128, activation='relu', name='Dense2')(x2)
x4 = tf.keras.layers.Dense(64, activation='relu', name='Dense3')(x3)
x5 = tf.keras.layers.Dense(10, activation='softmax', name='OutputLayer')(x4)
※ 은닉층, 출력층 설정 후 과정 예시 (학습, 시각화, 평가)
# 모델 학습
history = model.fit(X_train, y_train, epochs=13, batch_size=32, validation_split=0.3)
# 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], 'b-', label='loss')
plt.plot(history.history['val_loss'], 'r--', label='val_loss')
plt.xlabel('Epoch')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], 'g-', label='accuracy')
plt.plot(history.history['val_accuracy'], 'k--', label='val_accuracy')
plt.xlabel('Epoch')
plt.ylim(0.7, 1)
plt.legend()
plt.show()
# 평가
model.evaluate(test_X, test_Y, verbose=0)
- validation_split = 해당 비율로 데이터 중에서 또 다시 훈련데이터와 검증 데이터를 나눌때 훈련데이터 비율 설정
- train 셋의 오차, 정확도 : loss, accuracy
- test 셋의 오차, 정확도 : val_loss, val_accuracy
'빅데이터 부트캠프 > 머신러닝&딥러닝' 카테고리의 다른 글
빅데이터 부트캠프 28&29일차 (0) | 2022.08.11 |
---|---|
빅데이터 부트캠프 26&27일차 (1) | 2022.08.10 |
빅데이터 부트캠프 23&24일차 (0) | 2022.08.05 |
빅데이터 부트캠프 22일차 (0) | 2022.08.04 |
빅데이터 부트캠프 21일차 (0) | 2022.08.03 |
댓글