본문 바로가기

ML DL

9.4 ML History / 과대적합 완화 / 모델저장 뒤 복원 / 콜백 / RELU

 

1. ML History

history 객체는 딥러닝 모델을 훈련할 때 생성되는 데이터 구조로, 모델 훈련 과정에서의 손실 값(loss)과 정확도(accuracy) 등의 지표를 기록합니다. 이 객체를 통해 훈련이 진행되는 동안 성능이 어떻게 변화하는지 시각화하거나 분석할 수 있습니다.

 

history = model.fit(train_data, train_labels, epochs=10, validation_data=(val_data, val_labels)) print(history.history.keys()) # 훈련 중 기록된 지표들
history.history['accuracy']로 에포크별 정확도 값을 확인할 수 있습니다.

2. 과대적합 완화

과대적합(Overfitting)은 모델이 훈련 데이터에 너무 맞추어져서 새로운 데이터에 대해 성능이 저하되는 현상입니다. 이를 완화하기 위해 여러 기법을 사용할 수 있습니다.

주요 기법:

  • 드롭아웃(Dropout): 일부 뉴런을 랜덤하게 비활성화하여 모델이 특정 패턴에 과도하게 의존하지 않도록 합니다.
  • 조기 종료(Early Stopping): 검증 데이터의 성능이 더 이상 개선되지 않으면 훈련을 조기에 중단합니다.
  • 데이터 증강(Data Augmentation): 훈련 데이터를 다양하게 변형시켜 모델이 더 일반화된 패턴을 학습하도록 합니다.

예시: 드롭아웃과 조기 종료 사용

from tensorflow.keras.callbacks import EarlyStopping model.add(Dropout(0.5))
# 드롭아웃 추가
early_stopping = EarlyStopping(monitor='val_loss', patience=3)
history = model.fit(train_data, train_labels, epochs=20, validation_data=(val_data, val_labels), callbacks=[early_stopping])​

 

드롭아웃(Dropout)은 딥러닝 모델에서 과적합(overfitting)을 방지하기 위해 사용되는 정규화 기법 중 하나입니다. 드롭아웃은 훈련 과정에서 뉴런의 일부를 랜덤하게 "끄는" 방법으로, 모델이 특정 뉴런에 너무 의존하지 않도록 합니다. 이로 인해 모델이 더 일반화된 특성을 학습하게 되어 테스트 데이터에 대한 성능이 향상될 수 있습니다.

드롭아웃을 사용하는 방법은 간단하며, 일반적으로 케라스(Keras)나 텐서플로우(TensorFlow)와 같은 딥러닝 프레임워크에서 쉽게 적용할 수 있습니다.

Dropout 레이어 추가하기

드롭아웃을 사용하려면 모델에 Dropout 레이어를 추가하면 됩니다. Dropout 레이어는 다른 레이어들과 마찬가지로 모델에 포함되며, 드롭아웃을 적용할 확률을 지정해 줍니다.

케라스를 이용한 예제

from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout 
# 모델 정의 
model = Sequential() 
# 입력 레이어
 model.add(Dense(128, activation='relu', input_shape=(input_dim,))) 
# 드롭아웃 레이어 추가 (드롭아웃 확률 50%) 
model.add(Dropout(0.5)) 
# 은닉층
 model.add(Dense(64, activation='relu')) 
# 또 다른 드롭아웃 레이어 추가 (드롭아웃 확률 30%) 
model.add(Dropout(0.3)) 
# 출력층 
model.add(Dense(output_dim, activation='softmax')) 
# 모델 컴파일 
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 
# 모델 훈련
 history = model.fit(train_data, train_labels, epochs=20, batch_size=32, validation_data=(validation_data, validation_labels))​

주요 사항

  • Dropout(0.5)와 같이 작성하면, 훈련 시 해당 레이어에서 50%의 뉴런이 랜덤하게 "꺼집니다".
  • 드롭아웃 레이어는 일반적으로 은닉층과 은닉층 사이에 추가되며, 입력층이나 출력층에서는 사용하지 않는 것이 일반적입니다.
  • 드롭아웃 확률은 일반적으로 0.2에서 0.5 사이로 설정하는 것이 좋습니다. 너무 높으면 정보 손실이 많아져 학습이 어려워질 수 있습니다.

드롭아웃의 효과

드롭아웃을 사용하면 모델이 더 강건해지고 일반화 성능이 향상될 수 있습니다. 특히, 모델이 훈련 데이터에 과적합하는 경우 드롭아웃은 좋은 해결책이 될 수 있습니다. 다만, 드롭아웃을 사용하면 훈련 시간은 늘어날 수 있습니다.

이렇게 드롭아웃을 모델에 추가하여, 모델의 성능을 개선할 수 있습니다.

 

주의사항!!!!!!!!

훈련이 끝난 뒤, 평가나 예측을 수행할 경우에는 Drop out을 적용하지 말아야 한다.

텐서플로와 케라스 모델을 평가, 예측할때 자동으로 Dropout을 적용하지 않는다.

 

 

3. 모델 저장과 복원

모델을 훈련한 후 나중에 다시 사용하기 위해 저장하고 복원할 수 있습니다.

저장 방법:

python
코드 복사
model.save('my_model.h5') # 모델을 HDF5 파일로 저장

복원 방법:

python
코드 복사
from tensorflow.keras.models import load_model model = load_model('my_model.h5') # 저장된 모델 불러오기
 

4. 콜백 (Callbacks) ; 모델 체크포인트

콜백(Callback)은 모델 훈련 중 특정 이벤트(예: 에포크의 시작/끝, 훈련 중단 등)가 발생할 때 실행되는 함수입니다. 이를 통해 훈련 과정을 제어하거나 자동화할 수 있습니다.

 

- 사용 위치: 학습 할때 지정

 

주요 콜백:

  • EarlyStopping: 모델이 과적합되지 않도록 훈련을 조기에 중단합니다. 가중치만 저장됨!
  • ModelCheckpoint: 훈련 중 최상의 성능을 보이는 모델을 자동으로 저장합니다.
  • ReduceLROnPlateau: 학습률을 동적으로 조정하여 학습이 정체될 때 더 세밀한 학습이 가능하도록 합니다.

예시: EarlyStopping과 ModelCheckpoint 사용

from tensorflow.keras.callbacks import EarlyStopping, 
ModelCheckpoint early_stopping = EarlyStopping(monitor='val_loss', patience=5) 
checkpoint = ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True) 
history = model.fit(train_data, train_labels, epochs=50, validation_data=(val_data, val_labels),callbacks=[early_stopping, checkpoint])​

위 예제에서는 **EarlyStopping**이 검증 손실이 5번 연속 개선되지 않으면 훈련을 멈추고, **ModelCheckpoint**는 검증 손실이 가장 낮았을 때의 모델을 best_model.h5에 저장합니다.

이렇게 history, 과대적합 완화 기법, 모델 저장/복원, 콜백을 활용하면 딥러닝 모델을 더 효과적으로 훈련시키고 관리할 수 있습니다.

 

# 추가활동

 
학습할 사진을 찍어 학습시키면,
출력에서 학습데이터 중 어떤것과 가까운지 퍼센테이지로 나타내준다!
 

 

 

요렇게 다운로드 받으면 끝~

자바, 케라스, 모바일(Lite)로 모델 저장 가능!

 

# 추가공부 - 이미지 분석에서 RELU 사용한 이유 - 선형함수와 비선형 함수 차이

 

ReLU의 예:

  • 입력이 3일 때: ReLU(3) = 3
  • 입력이 -2일 때: ReLU(-2) = 0
  • 입력이 0일 때: ReLU(0) = 0

ReLU의 사용 이유

  1. 비선형성: ReLU는 비선형 함수입니다. 비선형성 덕분에 신경망이 더 복잡한 패턴을 학습할 수 있습니다. 만약 모든 활성화 함수가 선형이었다면, 신경망은 아무리 깊어져도 선형 변환만 할 수 있기 때문에 복잡한 패턴을 학습하기 어려웠을 것입니다.
  2. 계산 효율성: ReLU는 계산이 매우 간단합니다. max(0, x) 연산만 필요하기 때문에, 다른 활성화 함수들(예: 시그모이드 함수, 하이퍼볼릭 탄젠트 함수)보다 계산이 빠르고 효율적입니다.
  3. 기울기 소실 문제 완화: 딥러닝에서 **기울기 소실 문제(Vanishing Gradient Problem)**는 시그모이드나 하이퍼볼릭 탄젠트 같은 활성화 함수를 사용할 때 발생할 수 있습니다. ReLU는 이러한 문제를 어느 정도 완화해주어, 신경망의 깊이가 깊어져도 학습이 잘 이루어지도록 돕습니다.

요약

ReLU는 신경망에서 사용되는 활성화 함수로, 입력값이 양수면 그대로, 음수면 0으로 바꿉니다. 비선형성을 제공하면서도 계산이 간단하고, 기울기 소실 문제를 줄여줘서 딥러닝 모델에서 널리 사용됩니다.

 

선형 함수와 비선형 함수의 실생활 예시

선형 함수비선형 함수는 각각 매우 다른 방식으로 데이터를 처리하며, 이 차이는 실생활에서도 쉽게 이해할 수 있습니다.

1. 선형 함수의 실생활 예시

선형 함수는 입력값이 변할 때 출력값도 일정한 비율로 변하는 함수입니다. 선형 함수는 직선 형태로 나타납니다.

예시: 택시 요금 계산

  • 상황: 택시 요금은 기본 요금에 거리당 추가 요금을 더한 방식으로 계산됩니다.
  • 예를 들어, 기본 요금이 3,000원이고, 1km당 1,000원이 추가된다고 가정해 봅시다.
  • 수식: 택시 요금 = 기본 요금 + (거리 × km당 요금)
  • 설명: 1km를 이동하면 1,000원이 추가되고, 2km를 이동하면 2,000원이 추가됩니다. 요금은 거리와 직선적(선형적) 관계를 가지며, 거리가 늘어날수록 요금도 일정 비율로 증가합니다.
    • 1km 이동: 4,000원 (3,000 + 1,000)
    • 2km 이동: 5,000원 (3,000 + 2,000)

이처럼 선형 함수는 입력(거리)이 증가할 때 출력(요금)이 일정한 비율로 증가하는 관계를 표현합니다.

2. 비선형 함수의 실생활 예시

비선형 함수는 입력값이 변할 때 출력값이 일정하지 않은 비율로 변하는 함수입니다. 곡선 형태로 나타나며, 매우 다양한 형태를 가질 수 있습니다.

예시: 카메라의 조리개(렌즈의 개방 정도)와 사진 밝기

  • 상황: 카메라에서 사진의 밝기는 렌즈의 조리개(빛을 받아들이는 구멍)의 크기에 따라 달라집니다.
  • 수식: 사진 밝기 = 1f2\frac{1}{f^2} (여기서 f는 조리개 수치)
  • 설명: 조리개가 좁아지면(즉, f 값이 커지면) 들어오는 빛의 양이 급격히 줄어들어 사진이 어두워집니다. 반대로, 조리개가 넓어지면(f 값이 작아지면) 빛이 많이 들어와 사진이 밝아집니다. 하지만 이 변화는 선형적이지 않습니다. 조리개를 조금만 열어도 밝기는 급격히 변화합니다.
    • f=2.0에서 f=1.4로 바꾸면, 밝기는 2배 증가하지만, f=5.6에서 f=4.0으로 바꾸면 밝기 증가 폭이 달라집니다.

이처럼 비선형 함수는 입력값이 조금만 변해도 출력값이 급격히 변할 수 있으며, 이 관계는 일정하지 않습니다.

요약

  • 선형 함수는 입력값이 변할 때 출력값이 일정한 비율로 변합니다. 예를 들어, 택시 요금이 거리와 비례하여 일정하게 증가하는 경우가 선형 함수의 예입니다.
  • 비선형 함수는 입력값이 변할 때 출력값이 일정하지 않은 방식으로 변합니다. 예를 들어, 카메라의 조리개 크기에 따라 사진의 밝기가 급격히 변하는 경우가 비선형 함수의 예입니다.

이 두 함수는 서로 다른 방식으로 데이터나 상황을 표현하며, 다양한 실생활에서 그 예를 찾을 수 있습니다.

 

# RELU 함수

 

ReLU 뜻

  • ReLU는 양수면 그 값을 그대로 통과시키고, 음수0으로 바꿉니다.
  • 예를 들어, 입력값이 3이면 출력도 3, 입력값이 -2이면 출력은 0입니다.

ReLU를 사용하는 이유

  1. 쉽고 빠름: ReLU는 계산이 아주 간단해서 컴퓨터가 빠르게 처리할 수 있습니다.
  2. 잘 배움: 신경망이 데이터를 더 잘 학습할 수 있게 도와줍니다. ReLU 덕분에 신경망이 복잡한 패턴도 잘 찾아냅니다.
  3. 문제 방지: ReLU는 신경망이 너무 깊어져도 학습이 잘 안 되는 문제를 줄여줍니다.

요약

ReLU는 입력값을 그대로 쓰거나 0으로 바꾸는 간단한 함수인데, 계산이 빠르고 신경망이 잘 학습할 수 있게 도와줘서 많이 사용됩니다.

 

예시: 스마트폰 얼굴 인식

  1. 얼굴 사진을 찍을 때: 스마트폰 카메라가 얼굴을 찍으면, 그 이미지는 수많은 숫자로 이루어진 데이터로 변환됩니다.
  2. 신경망을 통해 얼굴 특징 추출: 이 데이터를 신경망이 처리하면서 눈, 코, 입 같은 얼굴의 특징을 찾아냅니다. 이 과정에서 여러 층의 뉴런이 데이터를 처리하는데, 각 층의 뉴런이 데이터를 처리한 후 ReLU 함수가 적용됩니다.
  3. ReLU의 역할: ReLU는 입력된 값 중 음수를 0으로 만들고, 양수를 그대로 통과시킵니다. 이를 통해 신경망이 중요한 특징을 더 잘 학습할 수 있게 도와줍니다. 예를 들어, 얼굴의 특정 부분이 이미지에서 더 강하게 나타난다면, ReLU는 그 강한 특징을 더 부각시킵니다.
  4. 결과: ReLU를 거친 데이터가 최종적으로 얼굴의 특징을 잘 나타내게 되어, 스마트폰이 사용자의 얼굴을 정확히 인식하게 됩니다.

다른 예시: 자율주행 자동차

ReLU는 자율주행 자동차의 객체 인식 시스템에서도 사용됩니다.

  1. 카메라로 도로 촬영: 자동차가 카메라를 통해 도로의 이미지를 촬영합니다.
  2. 신경망 처리: 신경망이 이 이미지에서 도로 위의 차선, 보행자, 신호등 등의 물체를 인식합니다. ReLU는 여기서도 중요한 역할을 하며, 물체의 모양, 색상 등을 인식하는 데 도움을 줍니다.
  3. 운전 결정: 인식된 정보는 자율주행 알고리즘에 사용되어, 차선 유지, 장애물 회피 등의 결정을 내리게 됩니다.

이렇게 ReLU는 이미지 인식 기술의 중요한 부분을 차지하며, 스마트폰 얼굴 인식부터 자율주행 자동차까지 여러 실생활 응용에서 필수적으로 사용되고 있습니다.

728x90

'ML DL' 카테고리의 다른 글

9.3 합성곱 신경망  (3) 2024.09.03
9.2 Tensorflow  (0) 2024.09.02
한국어 자연어 처리(NLP)  (0) 2024.08.29