티스토리 뷰
딥러닝을 처음 접하는 사람들에게 케라스(Keras)는 직관적인 API를 제공하여 모델을 쉽게 구축할 수 있도록 도와줍니다. 그중에서도 Sequential API는 가장 간단한 방식으로 신경망을 구성할 수 있는 방법입니다. 이번 글에서는 Sequential 모델의 기본 개념과 사용법을 배우고, 간단한 MNIST 손글씨 분류 모델을 만들어보겠습니다.
1. Sequential 모델의 기본 구조와 사용법
Sequential 모델이란?
Sequential 모델은 **레이어(Layer)**를 차례대로 쌓아 올리는 방식으로 신경망을 구성하는 방법입니다.
하나의 입력에서 시작하여 여러 레이어를 거쳐 최종 출력을 도출하는 순차적인(feedforward) 신경망을 만들기에 적합합니다.
Sequential 모델의 기본 구조
Sequential 모델은 여러 개의 레이어를 순차적으로 추가하여 구성됩니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# Sequential 모델 생성
model = Sequential([
Flatten(input_shape=(28, 28)), # 2D 이미지를 1D 벡터로 변환
Dense(128, activation='relu'), # 은닉층
Dense(10, activation='softmax') # 출력층 (10개 클래스)
])
Sequential 모델의 사용법
Sequential 모델을 사용하려면 크게 다음 3단계를 거칩니다.
- 모델 구성(Model Building)
- Sequential()을 사용해 모델을 생성하고, add()를 통해 레이어를 추가할 수도 있습니다.
- 컴파일(Compile)
- 손실 함수(Loss Function), 최적화 알고리즘(Optimizer), 평가 지표(Metrics)를 정의합니다.
- 학습(Training)
- fit()을 사용하여 데이터에 모델을 학습시킵니다.
- 평가(Evaluation)
- evaluate()로 모델 성능을 확인하고, predict()로 예측을 수행할 수 있습니다.
2. 간단한 예제: MNIST 손글씨 분류
MNIST 데이터셋 소개
MNIST는 0부터 9까지의 숫자로 구성된 손글씨 데이터셋으로, 총 70,000개의 흑백 이미지(28x28 픽셀)로 이루어져 있습니다.
이 데이터셋을 이용해 신경망을 학습하고 손글씨 숫자를 분류하는 모델을 만들어 보겠습니다.
MNIST 데이터 로드 및 전처리
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import numpy as np
# MNIST 데이터 로드
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 데이터 정규화 (0~255 값을 0~1 범위로 조정)
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# 라벨을 원-핫 인코딩으로 변환
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
3. 모델 구성, 컴파일, 학습 및 평가 단계
1️⃣ 모델 구성
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# Sequential 모델 정의
model = Sequential([
Flatten(input_shape=(28, 28)), # 28x28 이미지를 1D 벡터로 변환
Dense(128, activation='relu'), # 은닉층 (128개 뉴런, ReLU 활성화 함수)
Dense(10, activation='softmax') # 출력층 (10개 클래스, Softmax 활성화 함수)
])
각 레이어 설명
- Flatten(): 28x28 이미지를 1차원 벡터로 변환하여 Fully Connected Layer에 입력할 수 있도록 함
- Dense(128, activation='relu'): 128개의 뉴런을 가진 은닉층, 활성화 함수로 ReLU 사용
- Dense(10, activation='softmax'): 출력층으로, 10개의 숫자를 분류하는 다중 클래스 문제에 적합한 Softmax 활성화 함수 사용
2️⃣ 모델 컴파일
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
컴파일 과정 설명
- Adam Optimizer: 가중치를 최적화하는 알고리즘으로, 학습 속도와 정확도를 높이는데 효과적
- Categorical Crossentropy Loss: 다중 클래스 분류에서 사용되는 손실 함수
- Accuracy Metric: 모델의 성능을 평가할 지표로 정확도를 사용
3️⃣ 모델 학습
model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
학습 옵션
- epochs=10: 데이터셋을 10번 반복 학습
- batch_size=32: 한 번에 32개의 샘플을 처리
- validation_split=0.2: 학습 데이터의 20%를 검증 데이터로 사용
4️⃣ 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"테스트 정확도: {test_acc:.4f}")
평가 결과
- 테스트 데이터에 대한 손실(loss)과 정확도(accuracy)를 반환
- 정확도가 높을수록 모델이 손글씨 숫자를 더 잘 분류함
5️⃣ 숫자 예측
import matplotlib.pyplot as plt
# 테스트 이미지 하나를 예측
sample_image = np.expand_dims(x_test[0], axis=0) # 배치 차원 추가
prediction = model.predict(sample_image)
# 예측된 클래스 출력
predicted_label = np.argmax(prediction)
print(f"예측된 숫자: {predicted_label}")
# 실제 이미지 출력
plt.imshow(x_test[0], cmap='gray')
plt.title(f"모델의 예측: {predicted_label}")
plt.show()
결론
이 글에서는 Sequential 모델의 기본 개념과 사용법을 익히고, 이를 활용해 MNIST 손글씨 분류 모델을 구현해 보았습니다. Sequential 모델을 사용하면 간단하게 신경망을 구축할 수 있으며, 모델의 학습과 평가 과정이 직관적이고 이해하기 쉽습니다.
다음 단계로, Functional API를 활용한 모델 구성에 대해 작성해 보도록 하겠습니다.
'머신러닝&딥러닝' 카테고리의 다른 글
| 모델 저장 및 재사용 (0) | 2025.02.28 |
|---|---|
| 모델의 컴파일, 학습 및 평가 (0) | 2025.02.28 |
| Functional API를 활용한 모델 구성 (1) | 2025.02.28 |
| 케라스 기본 개념 이해하기 (0) | 2025.02.28 |
| 딥러닝: 치트시트 (Deep Learning : CheatSheet) (3) | 2024.11.07 |
- Total
- Today
- Yesterday
- 퀀트투자
- 골든크로스
- chat gpt 모델 별 가격
- 차트분석
- 티스토리챌린지
- chat gpt 가격 예상
- 클래스형 뷰
- 주식투자
- chat gpt 한국어 가격
- 1165회 로또
- 오블완
- 인공지능 로또 예측
- 자동매매로직
- chat gpt api 비용 계산
- 주식공부
- chat gpt 4o 예산
- Python
- 기술적분석
- 재테크
- Numpy
- 로또 1164회 당첨
- chat gpt 모델별 예산
- 케라스
- 자동매매
- 장고 orm sql문 비교
- 주린이탈출
- 토치비전
- 1164회 로또
- chat gpt 모델 api 가격 예측
- 로또 ai
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |