[SK쉴더스 루키즈 24기] 머신러닝 기초(4) 딥러닝과 인공신경망

아굥·2024년 12월 27일
1

SK Shieldus Rookies

목록 보기
11/32

딥러닝 개요

인공 신경망을 기반이며, 데이터를 바탕으로 복잡한 해턴을 학습하고 문제를 해결하는 머신러닝의 하위 분야

  • 여러 층(레이어)로 구성된 신경망을 사용함
    ㄴ> 각 신경망 층은 데이터에서 점점 더 높은 수준의 추상적인 특징을 학습

특징

  • 비정형 데이터 처리에 강함
  • 대규모 데이터와 연산 요구: 대량의 데이터와 강력한 계산 자원(GPU/TPU) 필요
  • 자동화된 학습: 데이터를 기반으로 스스로 학습 규칙 생성 -> 새로운 데이터에 대해 에측/분류 수행

활용 분야

  • 컴퓨터 비전
  • 자연어 처리
  • 음성 처리
  • 의료
  • 추천 시스템
  • 금융

머신러닝과 딥러닝의 차이

1) 머신러닝

  • 컴퓨터가 명시적인 프로그래밍 없이 데이터를 학습하여 예측/분류를 수행할 수 있도록 하는 기술
  • 데이터에서 특징(Feature)를 추출 -> 특징을 바탕으로 패턴 학습하여 결과 예측
  • 종종 사람이 수작업으로 데이터 전처리 및 중요한 특징을 선정해야 함

2) 딥러닝

  • 머신러닝 하위 분야
  • 데이터를 학습하는 과정에서 특징을 자동으로 추출함
  • 계층적인 학습을 통해 복잡한 패턴 이해하고 학습함

3) 특징 엔지니어링

  • 머신러닝: 데이터 학습 전에 사람이 주요 특징 선정 -> 모델에 제공
  • 딥러닝: 자동 특징 학습이 가능 (모델이 원시 데이터를 입력 -> 데이터에서 특징을 자동으로 추출하고 학습)

4) 데이터 요구량

  • 머신러닝: 상대적으로 적은 양의 데이터로도 학습 가능
    ㄴ> 작은 데이터셋에서 좋은 성능을 낼 수 있도록 설계된 알고리즘이 많음

  • 딥러닝: 매우 큰 데이터셋 필요
    ㄴ> 계층이 깊고 복잡하여 충분히 많은 데이터를 사용해서 높은 성능 보장

5) 연산 자원

  • 머신러닝: 모델이 단순하고 학습 과정이 비교적 빨라 연산 자원 요구가 상대적으로 적음 -> 일반적인 CPU에서도 작동
  • 딥러닝: 모델 계층이 많아 학습 과정에 많은 시간이 걸리고 계산 복잡도 높음 -> GPU/TPU 같은 강력한 연산 자원 필요

6) 인공지능 분류

  • 약인공지능: 한 분야에 집중해 인공지능을 실현
  • 강인공지능: 인간이 하는 행동 수준이나 그 이상의 행동

인공 신경망

컴퓨터가 사람의 뇌를 본떠서 만든 알고리즘

  • 인간의 뇌에 있는 뉴런과 비슷하게 여러 노드(Node, 가상의 뉴런)가 연결되어 정보를 처리

1. 뉴런의 구조

  • 신경세포체(Cell Body, Soma): 뉴런의 중심부, 핵과 다양한 세포 소기관이 포함됨
  • 가지돌기(Dendrite): 신경세포체에서 나뭇가지처럼 뻗어 나온 짧은 돌기들, 다른 뉴런에서 신호를 받아들임
  • 축삭돌기(Axon): 신경세포체에서 길게 뻗어 나온 하나의 돌기, 전기 신호를 먼 거리까지 전달
    끝부분은 여러 갈래로 나뉘어 신경 말단을 형성

2. 퍼셉트론(Perceptron)

여러 입력을 받아 하나의 출력을 생성하는 단순한 모델

  • 인공 신경망의 가장 기본적인 구성 요소

1) 구조

  • 입력(Input): 처리하고 싶은 정보 (여러 개 입력 가능, 각 입력에는 가중치라는 숫자가 곱해짐)
  • 가중치(Weights): 입력 값이 얼마나 중요한지 나타냄
  • 편향(Bias): 계산에 더해지는 추가 값 -> 더 유연하게 작동하도록 함
  • 합산기(Sum): 각 입력에 가중치를 곱한 후 모두 더하고 편향 값을 추가
  • 활성화 함수(Activation Function): 합산된 값 S가 특정 임계값을 넘는지 확인
  • 출력(Output): 최종적으로 0 또는 1 값을 출력

2) 동작 원리

  • 입력 신호 수집: 입력층에서 여러 개의 입력 신호를 받음
  • 가중합 계산: 긱 입력 신호에 해당 가중치를 곱한 후, 모든 값을 합산하고 편향을 더하여 총합 S를 계산
  • 활성화 함수 적용: 계산된 총합 S를 활성화 함수에 입력하여 출력 값 결정
  • 총합이 임계값을 넘으면 1, 아니면 0을 출력

3) 퍼셉트론의 학습

  • 주어진 데이터에 대해 가중치와 편향을 조정하여 원하는 출력이 나오도록 학습함

학습과정

① 초기화:가중치와 편향을 임의의 값으로 설정
② 예측 및 오차 계산: 입력 데이터를 통해 예측 값을 계싼, 실제 값과의 차이를 구함
③ 가중치 및 편향 업데이트: 오차를 기반으로 가중치와 편향을 조정하여 모델이 점차 정확한 예측을 할 수 있도록 함
④ 반복: 오차가 최소화될 때까지 또는 정해진 횟수만큼 위 과정 반복

4) 퍼셉트론의 한계

  • 간단한 선형 분리 문제는 잘 해결함 -> XOR 문제처럼 복잡한 문제는 잘 해결하지 못함

3. 인공 신경망의 구성 요소

1) 뉴런(Neuron)

  • 인공 신경망의 기본 단위, 생물학적 뉴런을 모방함
  • 각 뉴런은 입력 신호를 받아 계산을 수행 -> 결과를 다음 층으로 전달

2) 가중치(Weight)

  • 뉴런 간 연결의 강도를 나타내는 값
  • 신경망이 학습하여 패턴을 인식하는데 중요한 역할을 함
  • 각 입력 데이터는 고유한 가중치를 가지며, 학습 과정에서 조정됨

3) 편향(Bias)

  • 가중치 + 입력값인 상수 값으로, 뉴런의 출력값을 조정함
  • 모델이 특정 방향으로 데이터를 더 잘 학습하도록 지원함

4) 층(Layer)

  • 신경망은 여러 층으로 구성되며, 각 층은 뉴런의 집합
    ㄴ> 입력층(Input Layer): 데이터를 입력받는 층
    ㄴ> 은닉층(Hidden Layer): 입력 데이터를 처리하고 학습하는 층
    ㄴ> 출력층(Output Layer): 최종 결과를 출력하는 층

5) 활성화 함수(Activation Function)

  • 뉴런의 출력을 비선형으로 변환하여 복잡한 패턴을 학습할 수 있도록 함
    ㄴ> ReLU, Sigmoid, Tanh, Softmax

4. 인공 신경망의 구조

1) 입력층(Input Layer)

  • 데이터를 입력받는 층
  • 입력 데이터의 각 특징(Feature)은 하나의 뉴런에 대응

2) 은닉층(Hidden Layer)

  • 데이터의 패턴을 학습
  • 각 은닉층의 뉴런은 이전 층의 모든 뉴런과 연결 -> 완전 연결이라고 함
  • 은닉층 개수, 뉴런 수는 문제의 복잡도에 따라 결정됨
  • 다층 구조의 은닉층을 가진 신경망 -> 심층 신경망(Deep Neural Network, DNN)

3) 출력층(Output Layer)

  • 최종 결과를 출력하는 층
  • 문제 유형에 따라 뉴런 수와 활성화 함수가 달라짐
    ㄴ> 회귀 문제: 출력 뉴런 1개 (선형 활성화 함수)
    ㄴ> 이진 분류 문제: 출력 뉴런 1개 (sigmoid 활성화 함수)
    ㄴ> 다중 분류 문제: 출력 뉴런 = 클래스 수 (Softmax 활성화 함수)

5. 신경망의 동작원리

1) 순전파(Forward Propagation)

  • 데이터를 입력층 -> 은닉층 -> 출력층까지 전달하며 계산을 수행하는 과정
  • 각 뉴런은 입력값과 가중치를 곱하고 합산 -> 편향 값 더함 -> 활성화 함수로 변환 -> 결과를 다음 층 전달을 반복함

2) 손실 함수(Loss Function)

  • 출력층에서 예측값과 실제값의 차이를 계산하는 함수
  • MSE: 회귀, Cross-Entropy Loss: 분류

3) 역전파(Back Propagation)

  • 학습 과정에서 손실을 최소화 하고자 가중치와 편향 값을 조정하는 과정
  • 경사하강법 알고리즘으로 가중치 업데이트

딥러닝의 구조

1. 딥러닝 모델의 기본 구성

1) 입력층(Input Layer)

  • 데이터가 모델로 들어가는 첫 단계
  • 모델이 학습해야 할 데이터를 받아들임
  • 입력 데이터의 각 특징(Feature)은 하나의 뉴런에 대응

특징

  • 입력층의 뉴런 수는 데이터의 특징(Feature) 개수와 동일
  • 계산하지 않고 데이터를 단순히 전달

2) 은닉층(Hidden Layer)

  • 데이터의 패턴을 학습
  • 신경망의 연산과 학습은 대부분 은닉층에서 이루어짐
  • 입력 데이터를 처리하여 더 높은 수준의 추상적 정보를 추출
  • 층 수, 뉴런 수는 모델의 복잡도에 영향을 미침
    ㄴ> 많은 층: 더 복잡한 패턴 학습 가능 -> 과적합 위험
    ㄴ> 적은 뉴런 수: 학습 불충분

특징

  • 각 뉴런은 입력 뉴런과 연결되어 있으며 가중치와 편향 값을 사용하여 데이터를 변환
  • 각 연결에는 가중치가 부여, 뉴런은 가중치와 입력값을 곱함 -> 이를 더한 결과를 활성화 함수에 전달

3) 출력층(Output Layer)

  • 최종 결과를 출력하는 층 -> 은닉층에서 학습된 정보를 바탕으로 예측값 출력
  • 뉴런 수는 모델이 해결하려는 문제의 종류따라 다름
    ㄴ> 회귀 문제: 출력깂은 연속적인 숫자 (출력 뉴런 1개)
    ㄴ> 이진 분류 문제: 출력값은 0 또는 1 (출력 뉴런 1개 (sigmoid 활성화 함수))
    ㄴ> 다중 분류 문제: 출력값은 여러 클래스 중 하나 (출력 뉴런 = 클래스 수 (Softmax 활성화 함수))

2. 기본 동작 과정

① 데이터 입력: 입력층에서 데이터 전달
② 패턴 학습: 은닉층에서 활성화 함수를 사용해 입력 데이터의 패턴을 학습
③ 결과 출력: 출력층에서 학습된 정보를 바탕으로 예측값 계산
④ 손실 계산: 예측값과 실제값 간 차이를 손실 함수로 계산
⑤ 가중치 업데이트: 역전파와 경사하강법을 사용하여 가중치와 편향을 조정


딥러닝 기본 수학

1. 활성화 함수

입력 값을 기반으로 출력 값을 비선형적으로 변환하여 신경망이 복잡한 패턴과 관계를 학습

역할

  • 비선형성 추가: 비선형 변환을 통해 신경망이 복잡한 패턴과 관계를 학습할 수 있음
    ㄴ> 신경망 각 층에서 입력과 가중치의 선형 조합만 계산 시, 전체 네트워크는 선형 함수가 됨 -> 복잡한 문제 해결 X
  • 출력 범위 제한: 출력 값을 특정 범위로 제한하여 학습 안정성 높임 -> 극단적 값이 네트워크 전체에 영향을 주는 것을 방지
  • 특정 특징 강조: 특정 입력 신호를 강화하거나 억제하여 중요한 특징을 강조

1) ReLU(Rectified Linear Unit)

𝑓(𝑥) = max(0,𝑥)

특징

  • 입력값이 양수일 때 그대로 출력, 음수일 때는 0으로 출력
  • 계산이 간단, 큰 네트워크에서도 잘 작동
  • 대부분 은닉층에서 기본적으로 사용

장단점

  • 계산, 학습 속도가 빠름
  • 기술이 소실 문제를 줄여 줌
  • 입력 값이 항상 0 이하로 유지 -> 뉴런이 비활성화되어 학습하지 못하는 문제 발생

2) Sigmoid

𝑓(𝑥) = 1/1+e^3

특징

  • 입력값을 0과 1 사이로 변환
  • 출력층에서 확률값이 필요한 이진 분류 문제에 사용

장단점

  • 출력값이 제한되어 있어 안정적임
  • 기울기 소실 문제가 발생할 수 있음
  • 입력값이 너무 크거나 작으면 출력의 변화가 거의 없어 학습이 어려워 짐
  • 계산이 상대적으로 느림

3) Softmax

특징

  • 출력값을 확률로 변환 -> 모든 출력값의 합이 1이 되도록 함

장단점

  • 출력값이 확률 분포를 가지므로 직관적임
  • 계산이 비교적으로 복잡하먀 클래스 수가 많아지면 느려질 수 있음

2. 손실 함수

예측 값과 실제 값 간의 차이를 측정하는 함수

  • 신경망이 학습할 때 손실 값을 최소화하는 방향으로 가중치가 조정됨
    ㄴ> 학습의 방향과 성능을 평가하는 기준

기능

  • 성능 평가: 모델이 얼마나 잘 작동하는지 알려줌
  • 학습 방향 제공: 손실값을 기준으로 경사 하강법이 실행되어 모델의 가중치를 조정
  • 문제 유형에 따라 손실 함수 선택: 회귀와 분류 문제에 적합한 손실 함수가 다름

1) MSE(Mean Squared Error)

  • 예측 값과 실제 값 차이를 제곱하여 평균을 구한 값
  • 간단하여 계산이 쉽고 예측 오류 크기에 민감함 -> 큰 오류에 더 큰 패널티
  • 오류가 큰 데이터에 민감

2) Cross-Entropy Loss

  • 분류 문제에서 모델이 출력한 확률 분포와 실제 레이블의 차이를 측정
  • 확률값(0-1)을 기반 -> 분류 문제에 적합
  • 모델이 잘못된 확률을 출력 시 -> 더 큰 패널티

3. 역전파 개념

신경망의 학습 과정에서 오류를 기반으로 가중치를 조정하는 알고리즘

  • 신경망이 입력 데이터 -> 출력 변환 과정에서 발생한 오류를 각 층의 역방향으로 전파 -> 각 가중치 조정

1) 세부 단계

① 순방향 전달: 입력 데이터를 각 층에 전달하여 출력 계산
각 뉴런에서 활성화 함수 적용하여 비선형성 추가 -> 마지막 층에서 출력값 생성
② 손실 계산: 손실 함수로 예측 값과 실제 값 간의 손실 계산
③ 오류 역전파: 손실 함수의 출력값을 기준, 출력층 -> 입력층으로 이동하며 각 가중치에 대한 기울기 계산
ㄴ> 이 과정은 체인 룰을 사용하여 이루어짐
ㄴ> 체인 룰: 복잡한 함수의 미분 계산 시, 각 단계별 미분 값을 곱하는 방법
④ 가중치 업데이트: 경사 하강법을 사용하여 가중치 조정


딥러닝 프레임워크

1. 딥러닝 프레임워크의 이해

딥러닝 모델을 쉽고 효율적으로 개발할 수 있도록 도와주는 도구

1) Tensorflow

  • 구글에서 개발한 오픈소스 딥러닝 라이브러리
  • 복잡한 수학적 연산 자동 처리 가능

특징

  • 유연성: 저수준의 연산도 제어 가능, 필요에 따라 매우 복잡한 모델 설계 가능
  • 멀티플랫폼 지워니 CPU, GPU, TPU에서 실행 가능
  • 확장성: 대규모 분산 학습 지원

2) Keras

  • Tensorflow 위에서 작성하는 고수준 딥러닝 API
  • 다양한 딥러닝 구조를 지원, 필요에 따라 커스터마이징 가능
  • 복잡한 코드 없이 직관적으로 모델을 설계하고 학습시킬 수 있음

특징

  • 간결함: 코드가 간단하고 직관적
  • 빠른 프로토타이핑: 모델을 빠르게 설계하고 실험 가능
  • 유연성: 다양한 백엔드 엔진 지원

2. 간단한 신경망 모델 구성 및 훈련

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification


# 1. 데이터 생성 및 전처리
x, y = make_classification(
    n_samples=1000,                          	# 데이터 샘플 수
    n_features=20,                           	# 특징(특성) 수
    n_classes=2,                            	# 클래스 수
    random_state=42                         	# 랜덤 시드 고정
)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

# 2. 모델 생성
model = Sequential([
    Dense(16, activation='relu', input_shape=(x_train.shape[1],)),
    Dense(8, activation='relu'),                                  
    Dense(1, activation='sigmoid')                                 
])

# 3. 모델 컴파일
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

# 4. 모델 훈련
history = model.fit(
    x_train, y_train,							# 학습용 데이터와 레이블
    validation_split=0.2,                       # 검증 데이터 비율 (학습 데이터의 20%)
    epochs=10,                                  # 학습 반복 횟수
    batch_size=32,                              # 한 번의 학습에서 사용하는 데이터 샘플 수
    verbose=1                                   # 학습 진행 상태를 출력
)

# 5. 모델 평가
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(f"테스트 손실: {test_loss:.4f}, 테스트 정확도: {test_accuracy:.4f}")

# 6. 모델 예측
predictions = model.predict(x_test[:5])         # 테스트 데이터 중 5개의 샘플 예측
print("예측 결과:", predictions)

① 모델의 구성: 입력층 -> 은닉층 -> 출력층으로 구성
ㄴ> 활성화 함수는 모델이 데이터를 비선형적으로 표현
② 학습의 흐름: 데이터 준비 -> 모델 설계 -> 모델 컴파일 -> 훈련 -> 평가 -> 예측
③ Keras 장점: 코드가 직관적이고 간단하여 초보자도 쉽게 모델 설계 및 학습 가능


딥러닝 모델 실습(1) 이진 분류

1. 이진 분류 문제 해결

주어진 데이터를 두 개의 클래스로 구분하는 문제를 해결하는 과정

1) 문제 정의

  • 주어진 입력 데이터(특성, Feature)를 기반으로 해당 데이터가 두 개의 클래스 중 어디에 속하는지 예측
  • 출력 -> 클래스 0 또는 클래스 1

2) 데이터 수집

  • 데이터 수집: 문제에 맞는 데이터셋 확보
  • 데이터 전처리: 특성 선택 및 정규화, 결측값 처리, 데이터 분할
    ㄴ> 숫자 데이터 정규화 하거나 범주형 데이터를 인코딩
    ㄴ> 데이터를 훈련(Train), 검증(Validation), 테스트(Test) 데이터셋으로 나눔

3) 모델 설계

  • 입력층(Input Layer): 데이터의 특성 수에 따라 노드 수 결정
  • 은닉층(Hidden Layer): Full Connected Layer 사용, 활성화 함수, (과적합 방지를 위해)Dropout Layer 추가 가능
  • 출력층(Output Layer): 1 -> 이진 분류는 하나의 확률값 출력), 활성화 함수

4) 모델 컴파일

  • 손실 함수: Binary Cross-Entropy
  • 최적화 함수: Adam, SGD
  • 평가 지표: 정확도, F1-Score, Precision, Recall 등
model.compile(optimizer='adam',
			loss='binary_crossentropy',
			metrics=['accuracy'])

5) 모델 훈련

  • 훈련 데이터를 사용하여 모델 학습
  • 동시 검증 데이터를 사용하여 모델의 성능을 평가, 과적합 방지
history = model.fit(x_train, y_train,
				validation_data=(x_val, y_val),
				epochs=20,
				batch_size=32)

6) 과적합 방지

  • Early Stopping: 훈련 중 검증 성능이 더 이상 향상되지 않으면 조기에 학습을 멈춤
from tensorflow.keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(monitor='val_loss', patience=3)
history = model.fit(x_train, y_train,
				validation_data=(x_val, y_val),
				epochs=50,
				batch_size=32,
				callbacks=[early_stopping])
  • Dropout: 학습 중 일부 노드를 무작위로 제외하여 과적합 방지
from tensorflow.keras.layers import Dropout
model.add(Dropout(0.5))

7) 모델 평가

  • 훈련 후 테스트 데이터를 사용해 모델 성능을 평가
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(test_accuracy)

8) 예측

predictions = model.predict(new_data)
predicted_classes = (predictions > 0.5).astype(int)

2. 데이터셋 준비 및 모델 훈련

혼련(Training), 검증(Validation), 테스트(Test) 데이터셋이 있으며, 모델 학습 과정에서 중요한 역할을 함

1) 훈련 데이터셋

  • 정의 모델을 학습 시키는데 사용됨
  • 입력 데이터(X)와 그에 해당하는 실제 레이블(y, 정답)을 포함

역할

  • 모델이 데이터의 패턴과 관계를 학습하도록 하고 모델의 가중치와 바이어스 조정에 사용
  • 학습 과정에서 손실을 계산 -> 최적화 알고리즘으로 모델 업데이트

2) 검증 데이터셋

  • 훈련 중 모델의 성능을 평가하기 위해 사용됨

역할

  • 모델이 훈련 데이터에만 치우치지 않고 새로운 데이터에도 잘 작동하는지 평가
    ㄴ> 과적합 감지에 사용
  • 하이퍼파라미터 튜닝에 사용

특징

  • 훈련 중에는 검증 데이터를 사용하여 모델 성능 변화를 실시간 모니터링
  • 검증 데이터 손실이 일정 수준 이상 줄어들지 않으면 학습 중단함

3) 테스트 데이터셋

  • 학습이 완료된 후 모델의 최종 성능을 평가하기 위해 사용됨
  • 모델이 훈련/검증에서 본 적 없는 새로운 데이터로 구성

역할

  • 실제 환경에서 얼마나 잘 동작할 지 예측
    ㄴ> 모델의 일반화 능력을 평가하는데 적합
  • 최종 평가 결과로 모델의 신뢰성과 성능을 판단

특징

  • 테스트 데이터는 모델이 학습 과정에서 한 번도 접하지 않음 -> 새 데이터에 대한 모델의 성능을 측정

4) 데이터 분할 비율

  • 훈련 데이터: 70-80%
  • 검증 데이터: 10-15%
  • 테스트 데이터: 10-15%
    => 데이터가 적은 경우, 교차 검증을 활용하여 데이터를 효율적으로 사용 가능

5) 왜 나누는가?

  • 과적합 방지: 검증/테스트 데이터를 통해 과적합 여부 확인
  • 모델 성능 평가: 테스트 데이터는 실제 환경에서 모델이 얼마나 잘 작동할지 평가하기 위한 기준
  • 데이터 유출 방지: 검증/테스트 데이터가 훈련 데이터에 섞이면 안됨 -> 모델이 데이터를 암기할 수 있음
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report

# 1. 데이터 생성 및 전처리
X, y = make_classification(
    n_samples=1000,
    n_features=20,
    n_informative=15,
    n_redundant=5,
    random_state=42
)

X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

# 정규화
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
X_test = scaler. transform(X_test)

# 2. 모델 설계
model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(X_train.shape[1],)),
    tf.keras.layers.Dense(64, activation='relu'), 
    tf.keras.layers.Dropout(0.5), 
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid') 
])

# 3. 모델 컴파일
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 4. Early Stopping 설정
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)

# 5. 모델 훈련
history = model.fit(X_train, y_train, 
                    validation_data=(X_val, y_val), 
                    epochs=50, batch_size=32, 
                    callbacks=[early_stopping])
# 6. 모델 평가
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(f"Test Loss: {test_loss:.4f}, Test Accuracy: {test_accuracy:.4f}")

# 7. 예측
predictions = model.predict(X_test)
predicted_classes = (predictions > 0.5).astype(int)

# 8. 분류 보고서 출력
print(classification_report(y_test, predicted_classes))

# 9. 학습 결과 시각화
# 훈련 및 검증 손실 시각화
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Loss Over Epochs')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

# 훈련 및 검증 정확도 시각화
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Accuracy Over Epochs')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

딥러닝 모델 실습(2) 다중 분류

다중 분류 문제 해결

입력 데이터를 여러 클래스 중 하나로 분류하는 문제

1) 데이터 준비

① 데이터 수집: 사용할 데이터셋을 준비 (각 클래스에 해당하는 레이블이 있어야 함)
② 데이터 전처리: One-Hot Encoding, 정규화
③ 데이터 분리: 데이터를 훈련, 검증, 테스트로 나눔

2) 모델 설계

① 입력층: 데이터의 차원과 동일한 입력을 받는 층
② 은닉층: 활성화 함수로 ReLU를 사용하여 비선형성 추가
ㄴ> Fully Connected Layer(완전 연결층), Convolutional Layer(이미지 문제의 경우)를 포함
③ 출력층: 출력 뉴런의 수는 클래스 수와 동일
ㄴ> Softmax 활성화 함수를 사용하여 각 클래스에 대한 확률을 계산

3) 모델 훈련

① 손실 함수: Categorical Crossentropy 손실 함수 사용
② 옵티마이저: Gradient Descent 기반 알고리즘(ex. Adam)을 사용하여 가중치 업데이트
③ 훈련 프로세스: 모델에 훈련 데이터를 입력 -> 반복적으로 가중치 업데이트하여 손실 최소화
ㄴ> 과적합 방지, 성능 모니터링

4) 모델 평가

  • 정확도: 테스트 데이터에서 모델이 얼마나 정확히 예측하는지 평가
  • 혼동 행렬: 각 클래스에 대한 잘못된 예측과 정확한 예측을 시각화
  • 클래스별 평가: 클래스별 정밀도, 재현율, F1 점수를 계산하여 모델의 성능 평가

5) 예측

  • 학습된 모델을 사용하여 새로운 데이터 예측
  • Softmax 출력 기반으로 가장 높은 확률값을 가진 클래스 선택
profile
열심히 살아보아요

0개의 댓글