기본환경: 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을 대입했을 때, 모델의 예측치 반환
소스 코드
참고 자료
📑 [딥러닝] 에폭(epoch) & 배치 사이즈(batch size) & 반복(iteration) 개념 정리
'Naver Clould with BitCamp > Aartificial Intelligence' 카테고리의 다른 글
Scalar, Vector, Matirx, Tensor (0) | 2023.01.20 |
---|---|
MultiLayer Perceptron (0) | 2023.01.20 |
Types of Artificial Neural Networks (0) | 2023.01.15 |
ANN Model Construction (0) | 2023.01.15 |
Practice for AI Learning Model Construction (0) | 2023.01.14 |