이미지 데이터
1. 이미지 데이터의 전처리 흐름 이미지 데이터를 컴퓨터가 이해할 수 있는 형태로 바꾸는 과정입니다.
- 입력: $28 \times 28$ 형태의 2차원 배열 (MNIST 데이터셋 기준)
- Flatten (평탄화): 2차원 배열을 1차원 벡터로 만드는 작업입니다. $28 \times 28$은 총 784개의 픽셀이 됩니다
- 문제점: 784개의 픽셀을 모두 독립적인 변수($x_1, x_2, ..., x_{784}$)로 사용하면 데이터의 복잡도가 너무 커져서 과적합(Overfitting)이 발생하기 쉽습니다.
2. 차원 축소 (Dimension Reduction) : 과적합을 방지하고 학습 속도를 높이기 위해 특성(Feature)의 개수를 줄이는 전략
| 구분 | 방법론 | 특징 |
| Selection (선택) | 변수 선택 | • 784개 중 중요한 픽셀만 남기고 나머지는 버림 • 데이터 고유의 의미가 유지됨. |
| Extraction (추출) | 변수 추출 (PCA 등) | • 기존 픽셀들을 조합해 새로운 축(Basis Vector)을 만듦. • 정보 손실을 최소화하면서 변수 개수를 획기적으로 줄임. |
PCA의 작동 원리 (수학적 느낌)
- $w_1x_1 + w_2x_2 + \dots$ 형태⇒ 선형 결합
- 가중치(Weight)의 역할:
- PCA는 데이터의 분산(정보량)을 가장 잘 보존하는 방향 찾음
- 그 방향을 만들기 위해 기존 변수들에 어떤 것은 높게, 어떤 것은 낮게 가중치를
- 기저 벡터(Basis Vector)의 변화: 원래의 축($x, y$축)을 데이터가 가장 길게 뻗어 있는 쪽으로 회전시킨다고 생각하면 쉽습니다. 이 새로운 축이 곧 데이터의 특징을 가장 잘 설명하는 '주성분'이 됩니다.
- 왜 모든 변수를 고려하나? 추출(Extraction)이 선택(Selection)보다 강력한 이유는 정보의 손실을 최소화하기 때문입니다.
- 단순히 변수를 제거하면 그 변수가 가진 미세한 정보도 사라집니다.
- 하지만 PCA는 모든 변수의 정보를 적절한 비율(가중치)로 버무려서 새로운 벡터를 만들기 때문에, 적은 수의 벡터로도 전체 데이터의 특성을 최대한 유지할 수 있습니다.
CNN
1. CNN의 핵심 목적: 특징 추출과 분류
CNN은 단순히 데이터를 읽는 것을 넘어, 이미지 속에서 "어떤 특징(Feature)을 배워야 할지" 스스로 학습합니다.
- 학습 방향: 분류(Classification)를 위해 이미지의 고유한 속성을 압축하여 뽑아냅니다.
- 공간 정보 유지: 일반적인 신경망과 달리 2차원 이미지의 구조적 정보를 파괴하지 않고 특징을 추출합니다.
2. Convolutional Layer (합성곱 계층)의 원리
이미지의 특징을 찾아내기 위해 필터를 사용
- 합성곱 연산: 원본 이미지 위에서 작은 단위의 필터를 일정한 간격으로 이동(Sliding)시키며 내적을 수행합니다.
- 행렬곱과 내적: 벡터 간의 내적은 **'두 데이터가 얼마나 유사한가'**를 나타내는 상관지표입니다.
- 이미지와 필터의 패턴이 유사하면 결과값이 커지고,
- 유사하지 않으면 결과값이 작아집니다.
- 결과물: 이 과정을 거쳐 나온 결과물이 바로 **Feature Map(특징 지도)**입니다.
3. 필터(Filter)와 슬라이딩(Sliding)
- 필터의 역할: 처음에는 직선이나 곡선 같은 단순한 패턴을 찾고, 층이 깊어질수록 복잡한 형태(눈, 코, 입 등)를 인식하게 됩니다.
- 스트라이드(Stride): 필터가 움직이는 간격을 의미합니다.
- 간격이 작을수록(예: 1) 연산량은 많아지지만, 이미지의 특징을 세밀하게 확인할 수 있습니다.
- "이 위치에 내가 찾는 필터 패턴이 있어? 없어?"를 촘촘하게 검사하는 과정입니다.
CNN(합성곱 신경망)의 구조적 원리와 딥러닝의 학습 메커니즘
1. 데이터 입력과 차원의 구성
일반적인 뉴런 네트워크(MLP)는 데이터를 1차원 형태로 받아들입니다.
- 데이터 구조: 입력을 **(Samples, Features)**의 크기로 받습니다.
- 특성 조율: Features의 수가 너무 많으면 학습이 어렵기 때문에, Convolutional Layer를 통해 이미지의 크기를 줄이고 핵심 특성만 남기는 '조율' 과정을 거칩니다.
2. Convolutional Layer: 필터와 패턴 인식
단순히 색상 정보를 읽는 것이 아니라, 이미지 내에 특정 패턴이 '존재하는지'를 확인합니다.
- 필터(Filter)의 역할: 필터가 이미지 위를 지나가며 연산할 때, 필터의 패턴과 원본 이미지의 패턴이 관련이 있으면(유사하면) 매우 큰 값이 생성됩니다(선형적 상관관계).
- 계층적 학습: 층이 깊어질수록(하위 계층) 필터는 더 세밀하고 예민하게 특징을 잡아냅니다. 초기엔 선을 찾다가 나중엔 복잡한 형상을 찾게 됩니다.
- 패딩(Padding): 연산 과정에서 이미지 사이즈가 줄어드는 것을 막거나 외곽 정보를 보존하기 위해 테두리를 채워 사이즈를 늘려주는 역할을 합니다.
3. 비선형성의 핵심: ReLU 활성화 함수
신경망이 복잡한 문제를 풀기 위해서는 '비선형성'이 반드시 필요합니다.
- ReLU의 메커니즘: 필터가 적용되지 않은 지역(음수 값 등)은 0으로 적용하여 무시합니다. 반면, 필터가 잘 적용된 영역은 원래 값 그대로 유지합니다.
- 다층 구조의 위력: 단순히 한 번의 연산으로 끝나는 것이 아니라, 층이 쌓일 때마다 곱하기 연산과 ReLU를 반복하며 모델은 점점 비선형적인 분류기로 변모합니다.
4. 파인튜닝(Fine-tuning)과 높은 성능
딥러닝이 높은 성능을 내는 이유는 이 복잡한 비선형 분류기를 잘 학습시키기 때문입니다.
- 재활용의 원칙: 이미 학습된 모델을 가져올 때, **뒷부분(분류기)**을 그대로 쓰는 것이 아니라 특징을 추출하는 앞부분의 '안목'을 빌려옵니다.
- 분류기 교체: 앞부분의 특징 추출 능력은 유지하되, 내 데이터에 맞게 뒷부분의 분류 층만 새로 학습시키는 것이 파인튜닝의 핵심입니다.
| 구분 | 메모 내용 기반 정리 |
| 입력 형태 | (Samples, Features) / 1차원 벡터 형태 |
| 필터 연산 | 이미지 속 특징 존재 여부 확인 (유사할수록 큰 값) |
| ReLU | 적용 안 된 곳은 0, 적용된 곳은 원래 값 (비선형화) |
| 계층 심화 | 내려갈수록 필터가 세밀화/예민화됨 |
| 파인튜닝 | 앞부분(특징 추출)은 재활용, 뒷부분(분류)은 수정 |
풀링
합성곱 연산을 통해 얻은 특징 정보 전체를 다음 층으로 넘기는 대신, 서브 샘플링(Sub-sampling)이라는 과정을 통해 데이터의 양을 전략적으로 줄입니다.
- 대표값 추출: 모든 데이터를 반영하지 않고, 특정 영역에서 가장 큰 값(Max Pooling) 등이 해당 지역의 특징을 대표한다는 개념을 사용합니다.
- 차원 축소: 이 과정을 통해 전체 데이터 사이즈가 줄어들며, 결과적으로 연산에 필요한 컴퓨팅 리소스가 감소하여 학습 효율이 높아집니다.

- 오버피팅(과적합) 방지: 사소한 변화나 노이즈에 민감하게 반응하지 않도록 정보를 요약하기 때문에 모델이 데이터에 너무 딱딱하게 맞물리는 것을 막아줍니다.
- 특징 보존: 데이터의 크기는 줄어들지만, 이미지 내 주요 특징의 존재 여부는 그대로 유지되어 분류 성능을 보존합니다.
정밀도가 높아야 되면 더 깊게 학습하면 됨.
층이 쌓이면 → 기울기 소실 발생
- 정밀도와 깊이: 더 높은 정밀도가 필요한 복잡한 문제일수록 층을 더 깊게 쌓아 세밀하게 학습해야 합니다.
- 기울기 소실(Vanishing Gradient): 하지만 층이 너무 깊어지면 미분 값이 앞쪽 층까지 제대로 전달되지 않아 기울기 소실 현상이 발생합니다. 이는 학습이 제대로 이루어지지 않는 원인이 됩니다.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
#시퀀셜 객체 사용하면 ,로 나열만 해도 됨 => 스스로 이전 층의 출력을 다음 층의 입력으로 사용함
#시퀀스가 한방향으로 안 흐를수도 있음 -> 함수형 api 사용
#filter size 3x3(정방행렬)
#함수형 !!
inputs = keras.Input(shape=(28, 28, 1)) #가로 세로 채널(1=흑백)
x= layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding='same')(inputs)
x= layers.MaxPooling2D((2,2))(x) #어짜피 앞에 있는 x 안쓰니까 덮어써도 괜찮음
x= layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu')(x)
x= layers.MaxPooling2D((2,2))(x)
x=layers.Conv2D(filters=128, kernel_size=3, activation='relu')(x)
model = keras.Model(inputs=inputs, outputs=x) #입력과 출력이 무엇인지 명시적으로 지정
model.summary()
#none은 미지정상태를 의미 : 들어오는만큼 받겠다는 뜻

📌 CNN 모델 구조 해설
입력: (None, 28, 28, 1)
- None → batch size (미정, 자동 결정)
- 28×28 → 이미지 크기
- 1 → 채널 수 (흑백 이미지)
1️⃣ Conv2D (32 filters, 3×3, padding='same')
출력: (None, 28, 28, 32)
✔ padding='same' → 공간 크기 유지 ✔ 채널 수 = 필터 수 = 32
파라미터 계산: (3 × 3 × 1 × 32) + 32(bias) = 288 + 32 = 320
2️⃣ MaxPooling2D (2×2)
출력: (None, 14, 14, 32)
✔ 28 ÷ 2 = 14 ✔ 채널 수 유지 (32) ✔ 학습 파라미터 없음
3️⃣ Conv2D (32 filters, 3×3, padding='valid')
출력: (None, 12, 12, 32)
✔ padding='valid' 공식: 출력 = (입력 - 커널 + 1)
14 - 3 + 1 = 12
파라미터 계산: (3 × 3 × 32 × 32) + 32 = 9,216 + 32 = 9,248
4️⃣ MaxPooling2D (2×2)
출력: (None, 6, 6, 32)
12 ÷ 2 = 6 파라미터 없음
5️⃣ Conv2D (128 filters, 3×3, padding='valid')
출력: (None, 4, 4, 128)
6 - 3 + 1 = 4
파라미터 계산: (3 × 3 × 32 × 128) + 128 = 36,864 + 128 = 36,992
📌 전체 차원 변화
28×28×1 → 28×28×32 → 14×14×32 → 12×12×32 → 6×6×32 → 4×4×128
고차원 vs 고차수
기저벡터가 여러개로 다중으로 있는 걸 → 고차원 (특성에 대해 영향을 주는 거)
고차수 : 같은 수를 여러번 곱한다는 의미
w가 다른 층으로 넘어갈 때 곱하기가 나이루어짐 —→ 다층 (w에 대한 차원이 점점 커짐 ).
비정형적인 분류기를 만들어 냄
분류기를 만들 때 w가 n제곱 함수처럼 선형적이지 않게 되는 것
미분 값을 사용하여 방향을 잡겠다는 ..
순간 기울기가 0으로 수렴하고 있으면 ⇒ 최저점으로 다가가고 있구나 ⇒ 경사하강법
국소에 빠질 수 있으므로 울퉁불퉁하지 않게 구현하는게 중요 ⇒ w를 잘 찾아야됨
민감하게 학습된 모델 (울퉁불퉁) → 완만하게 최적화 할 필요
완만하게 → 정규화v
객체인식 (object detection)
rain test
test : 학습에서 제외된 자료로 진행
train data 학습해가는 중간에 학습 방향이 잘 이루어져 있는지 validation(훈련중에)
학습 과다 → 과적합 → validation 불가
과적
