728x90
반응형
1. return_sequences의 의미
RNN 층에서 return_sequences는 출력의 형태를 결정하는 옵션입니다. 즉, “모든 시점의 출력을 반환할지, 마지막 시점만 반환할지” 를 설정합니다.
🔹 구조 비교
| 설정값 | 출력 형태 | 출력 크기 | 사용 예시 |
|---|---|---|---|
return_sequences=False |
마지막 시점의 출력만 반환 | (batch_size, units) |
문장 전체의 감정 분류 등 (한 개의 출력) |
return_sequences=True |
모든 시점의 출력 반환 | (batch_size, timesteps, units) |
다음 RNN 층 연결, 시계열 예측 등 |
🧩 예시 코드
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense, Input
# 1. 마지막 시점 출력만 반환 (기본값)
model_1 = Sequential([
Input(shape=(4, 9)), # (timesteps=4, input_dim=9)
SimpleRNN(8, return_sequences=False),
Dense(9, activation='softmax')
])
model_1.summary()
출력: (batch_size, 8) → Dense(9)
# 2. 모든 시점의 출력 반환
model_2 = Sequential([
Input(shape=(4, 9)),
SimpleRNN(8, return_sequences=True),
Dense(9, activation='softmax')
])
model_2.summary()
출력: (batch_size, 4, 8) → 각 시점마다 예측 (시계열 전체 예측)
💬 비유로 이해하기
| 상황 | 비유 |
|---|---|
return_sequences=False |
영화 전체를 보고 마지막에 평가 한 번 하는 경우 |
return_sequences=True |
영화의 매 장면마다 평가를 기록하는 경우 |
2. RNN 구조 설계 연습
(입력 차원, 출력층 설정 이해)
🧩 입력 구조
RNN의 입력은 항상 3차원 텐서입니다.
(batch_size, timesteps, input_dim)
| 요소 | 의미 | 예시 |
|---|---|---|
batch_size |
학습 시 한 번에 처리할 샘플 수 | 32 |
timesteps |
시계열의 길이 (몇 개의 데이터가 순서대로 들어오는가) | 4 (예: hell → o) |
input_dim |
각 시점의 입력 벡터 길이 | 9 (예: one-hot 인코딩된 문자) |
🧠 출력층 구조
- 이진 분류 →
Dense(1, activation='sigmoid') - 다중 분류 →
Dense(클래스 수, activation='softmax') - 회귀 예측 →
Dense(1, activation='linear')
✅ 예시 코드
model = Sequential([
Input(shape=(4, 9)), # 4개의 timestep, 각 timestep은 9차원 벡터
SimpleRNN(16, activation='tanh'),
Dense(9, activation='softmax') # 9개의 알파벳 중 하나 예측
])
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
3. 평균, 오차, 정확도의 문제점
모델 평가에서 자주 사용하는 평균(loss) 과 정확도(accuracy) 는 단순하지만, 데이터 불균형이나 손실 종류에 따라 한계가 있습니다.
⚙️ 주요 지표 요약
| 지표 | 의미 | 문제점 |
|---|---|---|
| Loss (손실) | 모델이 정답에서 얼마나 벗어났는지 (예: crossentropy) | 값의 절대적 의미는 어려움 (낮을수록 좋음) |
| Accuracy (정확도) | 전체 중 예측이 맞은 비율 | 데이터 불균형 시 신뢰도 낮음 |
| Average (평균) | 전체 손실의 평균값 | 이상치(outlier)에 민감함 |
💡 보완 방법
- 정확도만 보지 말고 손실곡선(loss curve) 함께 보기
- F1-score, Precision, Recall 등 다른 지표도 확인
- Epoch마다 시각화로 학습 상태 모니터링
4. 시각화 코드 (학습 결과 확인)
학습 후 손실(loss)과 정확도(acc)를 시각화하면 학습 흐름을 쉽게 볼 수 있습니다.
import matplotlib.pyplot as plt
# h1 = model.fit(X_data, y_data, epochs=1000, verbose=0)
plt.figure(figsize=(10,4))
plt.plot(h1.history['accuracy'], label='Accuracy')
plt.plot(h1.history['loss'], label='Loss')
plt.xlabel('Epochs')
plt.ylabel('Value')
plt.title('RNN 학습 정확도 및 손실 변화')
plt.legend()
plt.show()
✅ 의미
accuracy상승 → 모델이 점점 더 정확하게 예측loss감소 → 예측이 실제값에 가까워짐accuracy가 멈추고loss만 진동 → 과적합 신호
5️⃣ 예측 결과를 판다스로 변환하고 정렬하기
예측 결과를 DataFrame으로 바꿔서, 가장 확률이 높은 클래스를 직관적으로 볼 수 있습니다 👇
import pandas as pd
class_names = ['h','e','l','o','a','p','b','y','w']
# 예측
pred = model.predict(X_test)
# DataFrame으로 변환
pred_df = pd.DataFrame(pred, columns=class_names)
# 확률 높은 순으로 정렬
sorted_pred = pred_df.T.sort_values(by=0, ascending=False)
display(sorted_pred)
| 출력 예시 |
|---|
| (예시 형태) |
✅ 결과 해석
- 각 문자가 예측될 확률이 표시됨
- 예:
'o'의 확률이 0.98 → “hell → o” 예측 성공
📘 전체 요약
| 항목 | 핵심 내용 |
|---|---|
| return_sequences | False → 마지막 출력만 / True → 모든 시점 출력 |
| 입력 구조 | (batch_size, timesteps, input_dim) |
| 출력층 구조 | 분류 목적에 따라 Dense 설정 |
| 평균·오차·정확도 | 단일 지표 의존은 위험, 시각화 병행 |
| 시각화 코드 | 학습곡선으로 과적합 판단 가능 |
| pandas 변환 | 예측 확률을 정렬해 직관적으로 확인 가능 |
✨ 한 줄 요약
return_sequences는 출력의 개수, 입력/출력 차원은 데이터 구조의 핵심, 정확도보다 손실곡선과 시각화를 함께 보며 모델을 이해하는 것이 진짜 실력입니다.
728x90
반응형
'학습 > AI' 카테고리의 다른 글
| 텍스트마이닝 - 한글 텍스트 전처리 (0) | 2025.11.16 |
|---|---|
| 한글 텍스트 전처리와 감성분류 (0) | 2025.11.15 |
| 임베딩(Embedding) 이란? (0) | 2025.11.13 |
| RNN( Recurrent Neural Network )의 개념 (0) | 2025.11.12 |
| 합성곱 신경망(CNN), 신경망 성능 개선, 전이학습 (0) | 2025.11.11 |