728x90
# CNN, RNN - 한글로 치면 기역니은
합성곱 신경망(Convolution Neural Networks)

7 + 5 + 10 + 15 + 3
40
- 합성곱: 입력 데이터에서 유용한 특성만 드러나게 하는 것
- 합성곱 계산을 통해 만들어진 출력을 특성맵(feature map)이라고 부름
- 사람의 시신경 구조를 모방한 구조로써 데이터의 특징을 추출하여 패턴을 파악
- 1989년 필기체 zip code인식 알고리즘 개발 프로젝트에서 시작됨
- 인간은 시신경이 인식하는 픽셀 단위에서 "A"라는 글자가 채워진 영역의 형태를 기억했다가 이와 비슷한 모양을 보았을 때 "A"라고 인식
- CNN도 마찬가지로 각 픽셀 단위에 값이 채워져 있는가를 구분하여 전체 픽셀 조합이 어떤 알파벳과 유사한지 판단하여 결과를 출력
- 하지만 픽셀 단위가 커지게 되면 연산해야할 양이 기하급수적으로 증가하여 모든 픽셀 단위를 일일이 연산하는 것은 비효율적
- 또한 같은 "A"라도 글씨체나 위치, 크기 등이 조금이라도 바뀌면 이와 동일한 새로운 학습 데이터로 학습해야함
- 따라서 CNN은 Convolution과 Pooling 의 단계를 통해 데이터를 효율적으로 연산
- 일반적으로 1개 이상의 합성곱 층을 사용한 인공신경망을 합성곱 신경망이라고 부름
- 합성곱층만을 이용한 신경망은 아님
- 합성곱과 밀집층의 차이
- 밀집층에서는 유닛마다 입력 개수만큼의 가중치가 존재
- 합성곱은 입력 데이터의 일부에 가중치를 곱함
- 합성곱 신경망에서는 유닛을 필터(filter) 또는 커널(kernel) 이라고 부름
- 입력 데이터가 2차원 배열이라면 필터도 2차원이어야 함
- 위 이미지에서 커널 크기는 (3, 3)
- 밀집층에서 여러 개의 유닛을 사용하듯이 합성곱 층에서도 여러 개의 필터를 사용할 수 있음
- 합성곱은 2차원의 형태를 유지함
- 공간적 특성의 손실을 줄일 수 있기 때문에 이미지 처리 분야에서 성능이 뛰어남
- 합성곱 연산 순서
- 왼쪽 위 모서리부터 합성곱을 시작
- 1개의 출력을 계산
- 오른쪽으로 이동
- 오른쪽으로 이동 할 수 없으면 아래로 이동
- 2 ~ 3의 과정을 반복해서 합성곱 연산을 수행
from tensorflow import keras
# 합성곱
keras.layers.Conv2D(10, kernel_size = (3, 3), activation = "relu", padding = "same", strides = 1)
# 10: 입력 데이터로부터 10개의 특징을 찾아내겠다는 의미
<Conv2D name=conv2d, built=False>
- Conv2D 의 첫 번째 매개변수는 필터의 개수(필수)
- kernel_size : 필터의 크기(필수)
- 일반적으로 (3, 3)이나 (5, 5)의 크기로 사용(취향대로 사용, 논문에서 많이 사용됐던 값))
- 활성화 함수
- 합성곱 신경망에서 특성맵은 절편과 활성화함수를 적용한 후의 결과물
패딩

- 입력 배열의 주위를 가상의 원소로 채우는 것
- 합성곱층을 통과하면 출력의 크기가 입력데이터의 크기보다 작아지게 되는데 이것을 방지하기 위해 사용
- 마치 (4, 4)보다 더 큰 입력이 들어온 것처럼 계산
- (6, 6)의 데이터를 (3, 3)크기의 커널로 합성곱 연산을 하면 출력의 크기가 (4, 4)로 유지됨
- 실제로는 입력값이 아니기 때문에 패딩은 0으로 채움
- 값이 0으로 채워져있기 때문에 계산에 영향을 미치지 않음
- 세임 패딩(same padding) : 입력과 특성맵의 크기를 동일하게 만들기 위해 입력 데이터 주위에 0으로 패딩하는 것
- 일반적으로는 세임 패딩이 많이 사용됨
- 밸리드 패딩(valid padding): 패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성맵을 만드는 것
- 특성맵의 크기가 입력보다 줄어듦
- 패딩을 사용하는 이유
- 패딩을 사용하지 않으면 입력값의 가운데에 있는 원소와 모서리 부분의 비율이 크게 차이남
- 적절하게 패딩을 사용하면 이미지 주변의 정보 소실을 막을 수 있음
스트라이드

- 커널을 적용하는 위치의 간격(이동의 크기)
- 기본값은 1
- 오른쪽으로 이동하는 크기와 아래쪽으로 이동하는 크기를 (1, 1)과 같이 튜플로 각각 지정할 수도 있음
- 하지만 일반적으로는 가로세로의 크기를 똑같이 지정
- 1보다 큰 스트라이드를 사용하는 경우도 드문 편이었으나
- 최근에는 pooling을 사용하지 않고 스트라이드를 높이는 방식도 점점 도입됨(경량화하기 위해) ※ 성능과 경량화를 트렌드에 맞게 향상시킴
풀링

# convolution은 영역이 겹치게 도장을 찍지만, 풀링은 영역이 겹치지 않게 찍음
# 풀링을 하면 출력의 크기는 줄어들지만 화질을 낮게 하여 찾고자 하는 특징을 더 잘 찾게 함
# 보통 convolution뒤에 풀링이 붙음
- 합성곱 층에서 만든 특성맵의 가로세로 크기를 줄이는 역할을 수행
- 특성맵의 개수는 변하지 않음
- 합성곱 층에서 추출한 특징을 유지하면서 계산량을 줄여주고 다음 계층 신경망과 쉽게 연결해주기 위해서 사용
- 풀링에는 가중치가 없고 최댓값을 계산하거나(max pooling) 평균값을 계산(average pooling)
- average pooling 보다는 max pooling이 많이 사용됨
- average pooling은 특성맵의 중요한 정보를 평균 계산하는 과정에서 희석될 수 있기 때문에
- 합성곱은 커널이 겹치는 부분이 있지만 풀링은 겹치지 않고 이동
- 최근에는 신경망이 점점 깊어지면서 미세하지만 중요한 특징들이 소실되는 현상을 막기 위해서 풀링층 사용을 줄이는 방식도 도입되고 있음
- 하지만 여전히 풀링은 적은 계산량으로 좋은 성능을 유지하는 데에 유용한 신경망 계층임
# 풀링
keras.layers.MaxPool2D(2, strides = 2, padding = "valid")
<MaxPooling2D name=max_pooling2d, built=True>
- MaxPool2D의 첫 번째 매개변수는 풀링의 크기
- 일반적으로 2를 사용(가로세로 크기를 절반으로 줄임)
- 가로세로 방향의 풀링 크기를 다르게 하려면 튜플로 입력가능하지만 실제로 사용되는 경우는 매우 드문 편
- strides : 자동으로 풀링의 크기가 입력되기 때문에 따로 지정할 필요는 없음
- padding : 기본값은 valid. 일반적으로 valid를 사용
- valid : 남는 모서리 부분이 pool_size와 맞지 않을 경우 무시
- same : 0값을 추가하여 사이즈를 맞춘 뒤 처리(남는 부분에 0을 채워서 풀링을 진행)
합성곱 신경망의 구조

- 합성곱 신경망은 너비와 높이는 점점 줄어들고 깊이는 점점 깊어지는 것이 특징
- 마지막 분류 신경망에서 특성맵을 모두 펼쳐서 밀집층의 입력으로 사용
- 합성곱 신경망에서 필터는 이미지에 있는 어떤 특징을 찾는 역할
- 필터의 개수를 늘릴수록, 층이 깊어질 수록 데이터의 구체적인 특징을 감지
- 어떤 특징이 이미지의 어느 위치에 놓이더라도 쉽게 감지할 수 있도록 너비와 높이를 압축(풀링)
컬러 이미지를 사용한 합성곱

# (데이터개수, 높이, 너비, 채널(3차원처럼 보임))
# conv2d라도 입력데이터가 3차원이 될것을 전체로 깔고있음
- 흑백 이미지는 2차원 배열로 표현할 수 있음
- 컬러 이미지는 RGB(빨강, 초록, 파랑) 채널로 구성되어 있기 때문에 하나의 이미지는 3차원 배열로 표시
- 깊이가 있는 입력에서 합성곱을 수행하기 위해서는 커널도 깊이가 있어야 함(3차원으로 구성되어야 함)
- 커널 배열의 깊이는 항상 입력의 깊이와 같음
- 입력이나 필터의 차원이 몇 개인지와 관계없이 항상 출력은 하나의 값
- 케라스의 합성곱층은 기본적으로 3차원 입력에 맞춰져 있음
- 흑백 이미지는 깊이 차원이 1인 3차원 배열로 변환하여 전달
728x90
'09_DL(Deep_Learning)' 카테고리의 다른 글
| 10_합성곱 신경망_시각화(부츠) (1) | 2025.04.25 |
|---|---|
| 09_합성곱 신경망(컬러 이미지 분류) (0) | 2025.04.24 |
| 07_보스턴 집값 예측 (0) | 2025.04.24 |
| 06_초음파 광물 예측 (0) | 2025.04.24 |
| 05_다중분류(Iris) (0) | 2025.04.23 |