딥러닝_05_오차 역전파
- 오차 역전파(Back Propagation)
- 순전파: 입력데이터를 입력층에서부터 출력층까지 정방향으로 이동시키며 출력값을 예측해나가는 과정
- 역전파: 출력층에서 발생한 오차를 입력층 쪽으로 전파하며 오차에 관여하는 가중치를 수정하여 오차를 줄이는 방향으로 최적의 결과를 학습해나가는 과정
2. sigmoid 함수의 문제점: 역전파과정에서 출력층이 많을수록 미분값이 0에 가까워져 기울기 소실문제가 발생하여 학습이 제대로 되지 않음
3. ReLU: 입력값이 양수일 경우 입력값에 상관없이 미분값이 항상 동일한 값(1)을 유지하여 역전파 과정에서 기울기가 소실되는 문제를 해결
-단점: 입력값이 음수인 경우 미분값이 0이 됨(=데이터 손실), 데이터스케일링 시 사용 x
4. 최적화함수의 종류
1)확률적 경사하강법(Stochastic Gradient Descent): 확률적으로 선택된 일부 데이터를 이용해 업데이트
- 경사하강법의 문제점: 전체 데이터를 이용해 업데이트하므로 대량의 데이터를 딥러닝 진행했을 때 메모리 문제가 발생함
- batch size: PC 메모리의 한계 및 속도저하를 막기 위해 epoch에 학습데이터를 조절하는 것, 개수를 조절하여 성능향상(기본값 32개)
-batch size를 줄이면 메모리 소모가 적고(저사양), 학습속도 느림, 정확도 ↑
-batch size를 높이면 메모리 소모가 크고, 학습속도 빠름, 정확도 ↓
- 장점: GD보다 더 빨리 더 자주 업데이트를 하여 지역 최저점을 빠져나갈 수 있음
- 단점: 탐색경로가 비효율적(진폭이 크고 불안정함)
2)모멘텀(Momentum)
- 경사하강법에 관성을 적용해 가중치를 수정하기 전 이전 방향을 참고하여 업데이트
- 지그재그 형태로 이동하는 현상이 감소
3)네스테로프 모멘텀: 개선된 모멘텀 방식으로, 다음방향을 계산하여 이전방향을 조절함
4)에이다그래드(Adaptive Gradient): 초반에는 학습률을 높이고 학습률을 점차 줄이는 방법을 적용해 업데이트
5)Adam
*tensorflow 사용설명
https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/legacy/SGD
[손글씨 데이터 역전파 실습]
- 목표
- 활성화 함수와 최적화 함수 비교
- 모델링에 도움이 되는 callback 함수(모델 저장, 조기학습중단)
- 활성화 함수: sigmoid→relu(오차 역전파 시 기울기 소실문제)
- 최적화 함수: SGD→Adam(비효율적 학습 보완)
2. 데이터 불러오기
#손글씨 데이터 불러오기(keras 제공)
from tensorflow.keras.datasets import mnist
#학습용/테스트용 데이터, 문제/정답데이터 구분된 상태
(X_train, y_train), (X_test, y_test)=mnist.load_data()
3. 활성화 함수, 경사하강법 성능 비교
from tensorflow.keras.models import Sequential #뼈대
from tensorflow.keras.layers import Dense, InputLayer, Flatten #층
#최적화 함수
from tensorflow.keras.optimizers import SGD, Adam
1)sigmoid+SGD 조합
- 신경망 모델 구조 설계(add)
#1. sigmoid+SGD 조합
#1. 신경망 모델 구조 설계
#1-1. 뼈대
digit_model=Sequential()
#1-2. 입력층
#사진 1장의 크기: 28*28
#2차원 데이터
digit_model.add(InputLayer(input_shape=(28,28)))
#1-3. 중간층
#2차원 데이터를 1차원 데이터로 변경(선형모델)
digit_model.add(Flatten())
#중간층 쌓기
digit_model.add(Dense(units=64, activation='sigmoid'))
digit_model.add(Dense(units=128, activation='sigmoid'))
digit_model.add(Dense(units=256, activation='sigmoid'))
digit_model.add(Dense(units=128, activation='sigmoid'))
digit_model.add(Dense(units=64, activation='sigmoid'))
#1-4. 출력층
#각 클래스별 확률 출력(클래스별 확률 총합: 100%)
digit_model.add(Dense(units=10, activation='softmax'))
- 모델 학습 방법 및 평가방법 설정(compile)
#2.모델 학습방법 및 평가방법 설정(loss값 설정)
digit_model.compile(loss='sparse_categorical_crossentropy',
optimizer=SGD(learning_rate=0.01),
metrics=['accuracy']
# callbacks=[mckp, early] #callback 함수 사용
)
- 모델 학습(fit)
#3.모델 학습
h1=digit_model.fit(X_train, y_train,
validation_split=0.2,
epochs=20, batch_size=32
)
#층을 많이 만들면서 미분값이 적어져 정확도가 떨어짐
#기울기 소실문제 발생하여 정확도 떨어짐
2)relu+SGD 조합
#2. relu+SGD 조합
#1. 신경망 모델 구조 설계
#1-1. 뼈대
digit_model2=Sequential()
#1-2. 입력층
#사진 1장의 크기: 28*28
#2차원 데이터
digit_model2.add(InputLayer(input_shape=(28,28)))
#1-3. 중간층
#2차원 데이터를 1차원 데이터로 변경(선형모델)
digit_model2.add(Flatten())
#중간층 쌓기
digit_model2.add(Dense(units=64, activation='relu'))
digit_model2.add(Dense(units=128, activation='relu'))
digit_model2.add(Dense(units=256, activation='relu'))
digit_model2.add(Dense(units=128, activation='relu'))
digit_model2.add(Dense(units=64, activation='relu'))
#1-4. 출력층
#각 클래스별 확률 출력(클래스별 확률 총합: 100%)
digit_model2.add(Dense(units=10, activation='softmax'))
#2.모델 학습방법 및 평가방법 설정(loss값 설정)
digit_model2.compile(loss='sparse_categorical_crossentropy',
optimizer=SGD(learning_rate=0.001),
#SGD 기본 learning_rate 0.01
metrics=['accuracy']
)
#3.모델 학습
h2=digit_model2.fit(X_train, y_train,
validation_split=0.2,
epochs=20, batch_size=32)
3)relu+Adam 조합
# 3. relu+Adam 조합
#1. 신경망 모델 구조 설계
#1-1. 뼈대
from tensorflow.keras.models import Sequential
digit_model3=Sequential()
#1-2. 입력층
#사진 1장의 크기: 28*28
#2차원 데이터
digit_model3.add(InputLayer(input_shape=(28,28)))
#1-3. 중간층
#2차원 데이터를 1차원 데이터로 변경(선형모델)
digit_model3.add(Flatten())
#중간층 쌓기
digit_model3.add(Dense(units=64, activation='relu'))
digit_model3.add(Dense(units=128, activation='relu'))
digit_model3.add(Dense(units=256, activation='relu'))
digit_model3.add(Dense(units=128, activation='relu'))
digit_model3.add(Dense(units=64, activation='relu'))
#1-4. 출력층
#각 클래스별 확률 출력(클래스별 확률 총합: 100%)
digit_model3.add(Dense(units=10, activation='softmax'))
#2.모델 학습방법 및 평가방법 설정(loss값 설정)
digit_model3.compile(loss='sparse_categorical_crossentropy',
optimizer=Adam(learning_rate=0.001),
#Adam 기본 learning rate: 0.001
metrics=['accuracy']
)
#3.모델 학습
h3=digit_model3.fit(X_train, y_train,
validation_split=0.2,
epochs=20, batch_size=32)
- 활성화함수, 최적화 함수조합 비교
plt.figure(figsize=(15,5))
# sigmoid + SGD 조합
plt.plot(h1.history['accuracy'], label="sigmoid+SGD train acc")
plt.plot(h1.history['val_accuracy'], label="sigmoid+SGD validation acc")
# relu + SGD 조합
plt.plot(h2.history['accuracy'], label="relu+SGD train acc")
plt.plot(h2.history['val_accuracy'], label="relu+SGD validation acc")
# relu + Adam 조합
plt.plot(h3.history['accuracy'], label="relu+Adam train acc")
plt.plot(h3.history['val_accuracy'], label="relu+Adam validation acc")
plt.legend()
plt.show()
4. callback 함수
1)모델 저장:딥러닝 모델 학습 시 지정된 모든 epochs를 진행하면 과대적합 위험→중간에 일반화된(성능이 좋은) 모델을 저장하는 기능
2)조기학습중단: epohs를 크게 설정했을 때 일정 횟수 이상으로 성능개선이 되지 않음→성능이 더 이상 개선되지 않을 경우 조기학습 중단 필요
- callback 함수 불러오기
#callback 함수 불러오기
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
- best 모델 저장
#best 모델 저장
#1. 드라이브 마운트
#2. 경로 설정
model_path='/content/drive/MyDrive/Colab Notebooks/DeepLearning/data/digit_model/dm_{epoch:02d}_{val_accuracy:0.2f}.hdf5'
mckp=ModelCheckpoint(filepath=model_path, #저장경로
verbose=1, #데이터 저장로그 출력
save_best_only=True,
#모델의 성능이 최고점을 갱신할 때마다 저장
monitor='val_accuracy' #최고점의 기준
)
- 조기학습 중단
#조기학습 중단
early=EarlyStopping(monitor='val_accuracy', #조기중단의 기준
verbose=1, #로그 출력
patience=10 #조기중단을 위해 모델성능 개선을 기다리는 최대 횟수
)
#best 모델과 조기학습중단의 monitor값은 동일하게 하는 것이 바람직함
- callback 함수 적용하여 신경망 모델 학습: best 모델일 때 조기학습중단됨
#callback 적용하여 신경망 모델 학습
#1. 신경망 모델 구조 설계
#1. 뼈대
digit_model1=Sequential()
#2. 입력층
#사진 1장의 크기: 28*28
#2차원 데이터
digit_model1.add(InputLayer(input_shape=(28,28)))
#3. 중간층
digit_model1.add(Flatten()) #2차원 데이터를 1차원 데이터로 변경(선형모델)
digit_model1.add(Dense(units=256, activation='sigmoid'))
digit_model1.add(Dense(units=128, activation='sigmoid'))
digit_model1.add(Dense(units=64, activation='sigmoid'))
#4. 출력층
#각 클래스별 확률 출력(클래스별 확률 총합: 100%)
digit_model1.add(Dense(units=10, activation='softmax'))
#모델 학습방법 및 평가방법 설정(loss값 설정)
digit_model1.compile(loss='sparse_categorical_crossentropy',
optimizer=SGD(learning_rate=0.01),
metrics=['accuracy']
)
#모델 학습
h1_call=digit_model1.fit(X_train, y_train,
validation_split=0.2,
epochs=1000, batch_size=32,
callbacks=[mckp, early] #callback 함수 사용
)
- 저장된 모델 중 정확도가 가장 높은 모델 불러오기
#모델 불러오는 도구
from tensorflow.keras.models import load_model
#저장된 모델 중 정확도가 가장 높은 모델 불러오기
best_model=load_model("/content/drive/MyDrive/Colab Notebooks/DeepLearning/data/digit_model/dm_38_0.96.hdf5")
- 정확도가 가장 높은 모델 평가하기(evaluate)
print(best_model.evaluate(X_test, y_test))
#loss: 0.15
#accuracy: 0.95
'딥러닝' 카테고리의 다른 글
[DL]7. 과대적합 제어 및 전이학습 (1) | 2023.09.21 |
---|---|
[DL]6. CNN (0) | 2023.09.20 |
[DL]4. 다중분류 (0) | 2023.09.14 |
[DL]3. 퍼셉트론, 다층퍼셉트론 (0) | 2023.09.11 |
[DL]2. 딥러닝 개요 (0) | 2023.09.09 |