컨볼루션 신경망 (CNN)
- 하위 레이어의 노드들과 상위 레이어의 노드들이 부분적으로만 연결되어 있음
- 모든 신경망 구조 중 가장 강력한 성능을 보여주는 신경망 중 하나
- 2차원 형태의 입력을 처리한다
- 영상, 음성에서 좋은 성능을 보임
- 여러 레이어를 연결하여 신경망을 구성한다
CNN 구조
특징 추출 영역은 Convolution Layer와 Pooling Layer를 여러겹 쌓은 형태로 구성된다.

컨벌루션을 수행한 결과 = 특징맵 (feature map)
Convolution Layer는 입력 데이터에 필터를 적용 후 여러 겹 쌓는 형태로 구성된다.
필터가 여러개일때 당연히 특징 맵도 많아짐 !
-> 필터 값은 학습되는 것
stride -> 커널을 한번에 몇 픽셀씩 이동할건지?
CNN 구현 시 주로 1로 설정된다.
padding -> 이미지의 가장자리를 처리하기 위한 기법
입력 이미지에 대해 합성곱을 수행하면 출력 이미지의 크기가 입력 이미지의 크기보다 작아지게 되기 떄문에 가장자리의 정보가 점점 소실된다. 이 문제점을 해결하기 위해 패딩을 사용한다.
풀링
입력 데이터의 크기를 줄이는 것
-> 이미지의 크기를 유지하면 연산량이 기하급수적으로 늘기 떄문에 크기를 줄이고 특정 feature를 강조함
레이어의 크기가 작아지므로 계산이 빨라지며, 신경망의 매개변수가 작아져 과적합이 나올 가능성이 줄어든다.
공간에서 물체의 공간이동에 대해 둔감해진다.
1) 최대 풀링 (주로 사용)

윈도우 안에 있는 숫자 중 가장 큰 값만 출력
2) 평균 풀링
윈도우 안의 숫자들의 평균을 출력
합성곱 신경망 (Convolutional Neural Network)

컨볼루션 - 폴링 - 컨볼루션 - 폴링
하나의 필터를 합성곱 하면 하나의 출력 이미지가 나온다 !

- 28X28X1의 흑백 입력 이미지에 5X5 의 필터를 합성곱
- 패딩 0, 스트라이드 1, 필터 사이즈 5이므로 28-5+1=24
- 합성곱 이후 이미지의 크기가 너무 크므로 풀링을 수행해서 이미지의 크기를 줄임
- 다시 합성곱을 수행하여 5x5필터 합성곱 하면 12-5+1=8
- 다시 풀링 수행하여 크기 절반으로 줄임
- reshape하여 긴 벡터 생성 (flatten 과정)
- 이 flatten 벡터를 MLP의 은닉층에 입력, 가중치 (16n2, n3)으로 초기화
-> (1,16n2) @ (16n2, n3)이 수행, (1, n3)벡터 출력
- n3 사이즈의 벡터를 MLP의 출력층에 입력, 가중치 (n3, 10)으로 초기화
-> (1,n3) @ (n3,10)이 수행, (1,10) 벡터 출력
- softmax 활성화 함수 도입, 확률값
- 정답 원핫벡터와 확률벡터의 차이의 제곱을 최소화
컨볼루션
tf.keras.layers.Conv2D(filters, kernel_size, strides=(1,1), activation= None, input_shape, padding= 'valid')
풀링
tf.keras.layers.MaxPooling2D(pool_size=(2,2), strides=None, padding="valid")
(2,2)라면 2x2 풀링 윈도우에서 최대값을 추출한다.
model = Sequential()
model.add(Conv2D(32, k ernel_size=(3, 3), activation='relu')) # 합성곱 필터수 32, 필터의 크기 (3X3), ReLu 함수 적용
model.add(MaxPooling2D(pool_size=2)) # 최대 풀링
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) # 필터 수 64, 더 많은 특징을 학습
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.25)) # 뉴런 25% 비활성화 gka
model.add(Flatten()) # 다차원 배열 1차원으로 펼침
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', #분류 문제에서 사용되는 손실 함수
optimizer='adam', # Adam 최적화 알고리즘 !!
metrics=['accuracy']) # 정확도

'etc' 카테고리의 다른 글
| [딥러닝] 12장 자연어 처리 (0) | 2024.12.08 |
|---|---|
| [딥러닝] 11장 순환신경망 (2) | 2024.12.08 |
| [딥러닝] 10장 영상인식 (1) | 2024.12.07 |
| [딥러닝] 8장 심층신경망 (0) | 2024.12.06 |
| [딥러닝] 7장 MLP-2 (2) | 2024.12.06 |