5주차 일정
9/4 - 9/8 딥러닝
9/4 - 9/8 딥러닝
지금까지 딥러닝을 배우던 나의 모습을 한 문장으로 정의하면 "귓등으로 듣다."입니다.
왜 그랬냐고요? 어려우니까요 ㅠㅠ
하지만 더 이상 물러날 수는 없는 처지입니다. 이걸 못하면 나는 미니 프로젝트도 못하고 그냥 스스로 발전의 기회를 발로 뻥 차버리는 셈입니다.
지금까지 들었던 딥러닝 수업들 중에서 제일 많이 이해했다고 생각하는데 여전히 난 부족하고 머리는 텅~ 비어있으므로 다시 정리하며 개념들을 입주시켜 보겠습니다.
딥러닝 모델
딥러닝 모델 준비
X = tf.keras.Input(shape=[13]) # 독립변수 13개
Y = tf.keras.layers.Dense(1)(X) # 종속변수 1개
model = tf.keras.Model(X, Y)
model.compile(loss='mse')
모델 학습
model.fit(독립, 종속, epochs=500, verbose=0) # verbose: 화면 출력 x
model.fit(독립, 종속, epochs=500, batch_size=150) # batch_size: 한 번에 학습할 데이터 개수(기본값 32)
모델 이용(예측)
model.predict(독립[:5])
가중치, 편향 확인
w, b = model.get_weights()
print(w, b)
Hidden Layer 추가
X = tf.keras.Input(shape=[13]) # 입력층
H = tf.keras.layers.Dense(5, activation='swish')(X) # hidden layer - 입력값 X / activation: 분류모델
Y = tf.keras.layers.Dense(1)(H) # 출력층 - 입력값 H
model = tf.keras.Model(X, Y)
model.compile(loss='mse')
model.summary()
BacthNormalization 추가
Layer 사이에 중간 결과 데이터들을 표준 정규화하는 계층
- 학습 단계에서는 batch 단위로 정규화함
- 무조건 쓴다고 가정!
X = tf.keras.Input(shape=[4])
H = tf.keras.layers.Dense(32, activation="swish")(X)
H = tf.keras.layers.BatchNormalization()(H) # Dense layer 사이에 BatchNormalization을 추가하면 학습이 더 잘 됨
H = tf.keras.layers.Dense(32, activation="swish")(H)
H = tf.keras.layers.BatchNormalization()(H)
Y = tf.keras.layers.Dense(3, activation="softmax")(H)
model = tf.keras.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics="accuracy")
model.summary()
Optimizer
- Gradient Descent(경사하강법): 함수의 기울기(경사)를 구하여 함수의 극값에 이를 때까지 기울기가 낮은 쪽으로 반복하여 이동하는 방법
- Momentum(관성): 이전에 이동했던 방향을 기억해서 다음 이동의 방향에 반영
- Adagrad(Adaptive Gradient): 많이 이동한 변수(w)는 최적값에 근접했을 것이라는 가정하에, 많이 이동한 변수(w)를 기억해서 다음 이동의 거리를 줄임
- Adam(RMSprop + Momentum)
Activation 함수
- sigmoid
- tanh
- ReLU
- LeaklyReLU
- Maxout
- ELU
- swish
- GELU
Validation 추가
model.fit(x_train, y_train, epochs=100, batch_size=128,
validation_split=0.2 # validation_data=(x_val, y_val)
)
Flatten Layer 추가
X = tf.keras.Input(shape=[28, 28])
H = tf.keras.layers.Flatten()(X) # Flatten: 2차원 입력 X를 1차원으로
H = tf.keras.layers.Dense(64, activation='swish')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)
model = tf.keras.Model(X, Y)
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy') # sparse_categorical_crossentropy: loss를 계산할 때 알아서 원핫인코딩을 함
model.summary()
Early Stopping
early = tf.keras.callbacks.EarlyStopping(
monitor='val_loss', # 기본값: val_loss
min_delta=0, # 0 미만의 변화는 변화로 보지 않음(=변화로 보는 최솟값)
patience=10, # 10 epoch동안 개선이 없으면 중단
restore_best_weights=True
)
result = model.fit(x_train, y_train, epochs=1000000, batch_size=128,
validation_split=0.2,
callbacks=[early]) # 1 epoch 마다 callback 실행
DropOut
지정된 확률의 개수만큼 노드를 랜덤하게 제외하고 학습을 진행
- 오버피팅 방지, 성능 향상, 앙상블 효과
- 학습이 된다면 최대한 높게 줄 수록 좋음 데이터가 충분하다면 0.4~0.6
X = tf.keras.Input(shape=[784])
H = tf.keras.layers.Dense(196,activation='swish')(X)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Dropout(0.6)(H) # dropdout
H = tf.keras.layers.Dense(49,activation='swish')(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Dropout(0.5)(H) # dropdout
H = tf.keras.layers.Dense(16,activation='swish')(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Dropout(0.3)(H) # dropdout
Y = tf.keras.layers.Dense(10, activation='softmax')(H)
model = tf.keras.Model(X, Y)
model.compile(loss="categorical_crossentropy", metrics="accuracy")
model.summary()
Class 코드
layer 1개
import tensorflow as tf
# 모델을 준비합니다.
# X = tf.keras.Input(shape=[1])
# Y = tf.keras.layers.Dense(1)(X)
class MyModel(tf.keras.Model):
def __init__(self, **kwargs):
super(MyModel, self).__init__(**kwargs)
self.dense = tf.keras.layers.Dense(1)
# fit할 때 실행됨
def call(self, inputs):
return self.dense(inputs)
# model = tf.keras.Model(X, Y)
# model.compile(loss="mse")
model = MyModel()
model.compile(loss='mse')
layer 2개
import tensorflow as tf
# 모델을 준비합니다.
# X = tf.keras.Input(shape=[1])
# H = tf.keras.layers.Dense(2, activation='swish')(X)
# Y = tf.keras.layers.Dense(1)(H)
# model = tf.keras.Model(X, Y)
class MyModel(tf.keras.Model):
def __init__(self, **kwargs):
super(MyModel, self).__init__(**kwargs)
self.dense1 = tf.keras.layers.Dense(2, activation='swish')
self.dense2 = tf.keras.layers.Dense(1) # layer가 2개
def call(self, X):
H = self.dense1(X)
Y = self.dense2(H)
return Y
model = MyModel()
model.compile(loss='mse')
정리해 둔 걸 다시 정리하는 건데도 숨이 차는 군..
이는 곧 아직 많이 이해하는데 많이 부족하다는 의미겠죠?
딥러닝 스터디 각인가.. 기초부터 딴딴히! 다지고 싶다는 생각이 들어서 책을 하나 사볼까 생각도 드는데..
혹시라도 같은 생각을 가지고 계신 분 있으면 조용히 연락 주세요 ㅎ_ㅎ
일주일간 딥러닝 배우면서 초반 3일은 딥러닝이라는 늪에 빠져서 쉬는 시간에 겨우 숨 한 번 쉴 수 있을 정도로 쫓아갔다 해도 과언이 아니라고 생각한다.
그래도 귓등으로만 듣던 과거에 비해서는 이제야 좀 그동안 들어왔던 내용들이 정리되는 느낌이 들어서 한 계단 올라온 걸 확실히 느낄 수 있었다!
딥러닝 너란 아이.. 범접하기 어려운 존재..
gradio와 OpenAI 이용하는 게 정말 재밌었는데 후반부를 정리해서 다시 돌아오겠습니다
(갑자기 마무리)