본문 바로가기
Naver Clould with BitCamp/Aartificial Intelligence

Hyper-parameter Tuning

by HJ0216 2023. 1. 20.

기본환경: IDE: VS code, Language: Python

 

Machine Learning의 기본적인 모델

# ann_model.py

import numpy as np

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense


# 1. Refined Deta
x = np.array([1, 2, 3])
y = np.array([1, 2, 3])


# 2. Model Construction
model = Sequential()
model.add(Dense(1, input_dim=1))


# 3. compile and training for best weight, minimum loss
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=10)


# 4. Evaluation and Prediction
result1 = model.predict([4])
print('result1: ', result1)

 

HyperParameter Tuning: 효율적인 훈련을 통해 Predict의 Accuracy를 높이는 방법

# hyperParameter_Tuning.py

import numpy as np

from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.models import Sequential


# 1. Data
x = np.array([1,2,3,4,5])
y = np.array([1,2,3,5,4])


# 2. Model(Sequential)
model = Sequential()
model.add(Dense(64, input_dim=1))
model.add(Dense(64)) # 이전 layer의 output이 다음 layer의 input이 되므로 생략 가능
model.add(Dropout(0.3))
model.add(Dense(32))
model.add(Dense(16))
model.add(Dropout(0.2))
model.add(Dense(8))
model.add(Dense(1))
model.summary()
'''
summray
Total params: 7,041
Trainable params: 7,041
Non-trainable params: 0

dropout: node를 random하게 추출하여 훈련을 수행 -> 과적합 문제 보완
summary는 dropout된 node를 나누지 않음 -> # params에 영향 X
'''

# 3. Complile, training에서의 HyperParameter_Tuning: optimizer, epochs, batch_size
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=256, batch_size=2)
# Batch_size Default: 32


# 4. Evaluation, Prediction
result = model.predict([6])
print("6의 결과: ", result)



# Hyper-parameter tuning
# Layer, Node, Dropout
# Optimizer
# Epochs
# Batch_size

 용어 해설

Model: Dropout

# 일정한 수의 노드를 사용하지 않으므로써 과적합(Overfitting) 문제를 보완할 수 있음

 

➕ Function Model에서의 Dropout

import numpy as np

from tensorflow.keras.layers import Dense, Input, Dropout
from tensorflow.keras.models import Model


# 1. Data
x = np.array([1,2,3,4,5])
y = np.array([1,2,3,5,4])


# 2. Model(Function)
input1 = Input(shape=(1,))
dense1 = Dense(64, activation='relu')(input1)
drop1 = Dropout(0.5)(dense1)
dense2 = Dense(64, activation='sigmoid')(drop1)
drop2 = Dropout(0.3)(dense2)
dense3 = Dense(32, activation='relu')(drop2)
drop3 = Dropout(0.2)(dense3)
dense4 = Dense(32, activation='linear')(drop3)
output1 = Dense(1, activation='linear')(dense4)
model = Model(inputs=input1, outputs=output1)
model.summary()
'''
Total params: 7,457
Trainable params: 7,457
Non-trainable params: 0

dropout한 node가 제외되지 않고 params 도출
'''

 

Compile and training: Optimizer

# 최적화(Optimization): 손실 함수(Loss Function)의 결과값을 최소화하는 모델의 파라미터(가중치)를 찾는 것
# Optimization의 알고리즘: Optimizer

 

Compile and training: Batch_size and Iteration

# Batch size: 연산 한 번에 들어가는 데이터 크기
# Iteration: 1 epoch을 마치는데 필요한 미니배치 갯수

예. Total Data 개수: 10,000

Batch_size = 2000

Iteration = 5

Batch_size = 3000

Iteration = 4 (3000/3000/3000/1000)

⚠️ batch size를 과도하게 줄여서 훈련을 시킬 경우, 1 epoch에 소요되는 연산 수가 많아져 시간이 오래 걸리는 비효율이 발생하게됨

→ 그러므로, 훈련 데이터 사이즈에 맞춰 적절한 batch_size를 정하는 것이 중요

 

 

Predict의 Accuracy가 높아진 것을 측정하는 방법

Complile, training에서 loss 측정을 mae*로 진행

mae(mininum absolute error)

1. loss의 값이 낮을수록 예측치의 정확도가 올라감

 

Evaluation, Prediction에서 result = model.predict([7])를 진행

2. 예상되는 결과값이 7일 경우, 7과 유사할 수록 모델의 정확도가 올라감

 

loss와 result 중 어떤 값을 중심으로 예측치의 좋고 나쁨을 평가할 수 있는가

loss가 낮을수록 최적의 weight에 가까워지므로 predict가 아닌 loss로 판단

 

 

Predict 실행 전 Evaluate 활용

# evaluate_and_predict.py

import numpy as np

from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential


# 1. Data
x = np.array([1,2,3,4,5,6])
y = np.array([1,2,3,5,4,6])


# 2. Model
model = Sequential()
model.add(Dense(64, input_dim=1))
model.add(Dense(64))
model.add(Dense(32))
model.add(Dense(16))
model.add(Dense(1))


# 3. Complile, training
model.compile(loss='mae', optimizer='adam')
model.fit(x, y, epochs=128, batch_size=2)


# 4. Evaluation, Prediction
loss = model.evaluate(x,y)
print("loss: ", loss)

result = model.predict([7])
print("predict 7: ", result)



'''
Result

model.fit(x, y, epochs=128, batch_size=2)
poch 128/128
3/3 [==============================] - 0s 4ms/step - loss: 0.3661

loss = model.evaluate(x,y)
1/1 [==============================] - 0s 408ms/step - loss: 0.3958
loss:  0.39582571387290955

result = model.predict([7])
predict 7:  [[6.7003293]]

'''

⭐ Training, Evaluation and Prediction

1. Training

Epoch 128/128
3/3 [==============================] - 0s 4ms/step - loss: 0.3661

데이터: 6개

총 훈련 수: 128번 중 128번 완료

Batch_size: 2, Iteration: 총 data 수 / Batch_size = 3

1 Epoch 당 3 Iteration 중 3번 완료

훈련 종료 후 mae로 측정한 loss 값: 0.3661

 

 

2. Evaluation

1/1 [==============================] - 0s 408ms/step - loss: 0.3958
loss:  0.39582571387290955

총 평가 수: 1번 중 1번 완료

Batch_size: 32, Iteration: 1

1 Epoch 당 1 Iteration 중 1번 완료

(훈련을 기반으로 한 평가에서 따로 batch_size를 지정해주지 않았으므로 default=32)

평가 종료 후 mae로 측정한 loss 값: 0.3958

⭐ 훈련과 평가는 별개의 과정이므로 훈련 데이터와는 다른 데이터를 대입해야 함

(해당 파일에서는 훈련 데이터가 평가에도 활용되었으므로, 평가 방법이 잘못되었다고 할 수 있음)

훈련 종료 후, 최종 loss가 아니라 평가에서 1회 진행한 loss값이기 때문에 일반적으로 training loss보다 evaluation loss가 더 높음

 

 

3. Prediction

predict 7:  [[6.7003293]]

훈련을 통해 가중치가 저장된 모델에 훈련되지 않은 값 7을 대입했을 때, 모델의 예측치 반환

 

 

 

소스 코드

🔗 HJ0216/TIL

 

참고 자료

📑 [딥러닝] 에폭(epoch) & 배치 사이즈(batch size) & 반복(iteration) 개념 정리