일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- numpy/pandas
- 머신러닝
- 컴퓨터구조
- 정수와유리수
- 데이터분석
- 파이썬
- 텍스트마이닝
- 영어공부
- CSS
- 데이터베이스
- 코딩테스트
- SQL
- 정보처리기사실기
- 자바 실습
- 자바
- 중학수학
- CNN
- 혼공머신
- 데이터입출력구현
- 딥러닝
- html/css
- JSP/Servlet
- pandas
- 운영체제
- 중학1-1
- 파이썬라이브러리
- C++
- 컴퓨터비전
- 정보처리기사필기
- 연습문제
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
이미지를 위한 인공 신경망 2 - 합성곱 신경망의 구성 요소 2 : 케라스 합성곱 층 및 합성곱 신경망의 전체 구조 본문
이미지를 위한 인공 신경망 2 - 합성곱 신경망의 구성 요소 2 : 케라스 합성곱 층 및 합성곱 신경망의 전체 구조
huenuri 2024. 10. 27. 08:26이어서 케라스 합성 층부터 학습을 진행해 보겠다.
케라스 합성곱 층
케라스 층은 모두 keras.layers 패키지 아래 클래스로 구현되어 있다. 합성곱 층도 마찬가지다. 특별히 입력 위를 (왼쪽에서 오른쪽으로, 위에서 아래로) 이동하는 합성곱은 Conv2D 클래스로 제공한다.
Conv2D 클래스의 첫 번째 매개변수는 필터의 개수이다. kernel_size 매개변수는 필터에 사용할 커널의 크기를 지정한다. 필터의 개수와 커널의 크기는 반드시 지정해야 하는 매개변수이다.
마지막으로 밀집층에서처럼 활성화 함수를 지정한다. 여기서는 렐루 함수를 선택했다.
합성곱 신경망의 정의는 무엇일까? 일반적으로 1개 이상의 합성곱 층을 쓴 인공 신경망을 합성곱 신경망이라고 부른다. 꼭 합성곱 층만 사용한 신경망을 합성곱 신경망이라고 부르는 건 아니다. 클래스에 대한 확률을 계산하려면 마지막 층에 클래스 개수만큼의 뉴런을 가진 밀집층을 두는 것이 일반적이다.
패딩과 스트라이드
합성곱 계산은 (4, 4) 크기의 입력에 (3, 3) 크기의 커널을 적용하여 (2, 2) 크기의 특성 맵을 만들었다. 그런데 만약 커널 크기는 (3, 3)으로 그대로 두고 출력의 크기를 입력과 동일하게 (4, 4)로 만들려면 어떻게 해야 할까?
(4, 4) 입력과 동일한 크기의 출력을 만들려면 마치 더 큰 입력에 합성곱 하는 척해야 한다. 예를 들어 실제 입력 크기는 (4, 4)이지만 (6, 6)처럼 다룬다고 가정해 보겠다.
위의 왼쪽 그림과 같이 (6, 6) 크기이면 (3, 3) 크기의 커널로 합성곱을 했을 때 출력의 크기가 얼마나 될까? (3, 3) 커널로 도장을 찍어 보면 출력의 크기가 (4, 4)가 되는 것을 알 수 있다. 가운데 그림의 빨간색 상자가 커널을 나타낸다. 입력과 같은 (4, 4) 크기의 출력을 만들 수 있다.
이렇게 입력 배열의 주위를 가상의 원소로 채우는 것을 패딩이라고 한다. 실제 입력값이 아니기 때문에 패딩은 0으로 채운다. 즉 (4, 4) 크기의 입력에 0을 1개 패딩하면 다음과 같은 (6, 6) 크기의 입력이 된다. 패딩의 역할은 순전히 커널이 도장을 찍을 횟수를 늘려주는 것밖에는 없다. 실제 값은 0으로 채워져 있기 때문에 계산에 영향을 미치지는 않는다.
이렇게 입력과 특성 맵의 크기를 동일하게 만들기 위해 입력 주위에 0으로 패팅하는 것을 세임 패딩(same padding)이라고 부른다. 합성곱 신경망에서는 세임패딩이 많이 사용된다. 바꿔 말하면 입력과 특성 맵의 크기를 동일하게 만드는 경우가 아주 많다.
패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우를 밸리드 패딩이라고 한다. 밸리드 패딩은 특성 맵의 크기가 줄어들 수밖에 없다.
그럼 왜 합성곱에서는 패딩을 즐겨 사용할까? 만약 패딩이 없다면 위의 예에서 (4, 4) 크기의 입력에 패딩 없이 합성곱을 합할 때 왼쪽 위 모서리의 3은 커널 도장에 딱 한 번만 찍힌다.
반면 다른 원소들은 2번 이상 커널과 계산된다. 가운데 있는 4개 원소 4, 8, 5, 1은 4번의 합성곱 계산에 모두 포함된다. 만약 이 입력을 이미지라고 생각하면 모서리에 있는 중요한 정보가 특성 맵으로 잘 전달되지 않을 가능성이 높다. 반면 가운데 있는 정보는 두드러지게 표현된다.
위 그림을 보면 패딩을 하지 않을 경우 중앙부와 모서리 픽셀이 합성곱에 참여하는 비율은 크게 차이 난다(4:1). 1픽셀을 파딩하면 이 차이는 크게 줄어든다(9:4). 만약 2픽셀을 패딩하면 중앙부와 모서리 픽셀이 합성곱에 참여하는 비율이 동일해진다(1:1).
직접 손으로 그림을 그려 계산해 보자. 합성곱을 이해하는 데 큰 도움이 된다. 먼저 (4, 4) 그림을 칠해보자. 커널 크기가 (3, 3) 일 때 a, b, c가 각각 몇 번 합성곱에 참여할까?
이번에는 패딩을 준 (6, 6)을 확인해 보자. 커널 크기가 (3, 3) 일 때 a, b, c는 합성곱에 몇 번 참여할까?
정확하게 그렸다면 첫 번째는 4, 2, 1씩, 두 번째는 9, 6, 4번씩 참여한다고 확인할 수 있다. 적절한 패딩은 이처럼 이미지의 주변에 있는 정보를 잃어버리지 않도록 도와준다.
케라스 Conv2D 클래스에서는 padding 매개변수로 패딩을 지정할 수 있다. 기본값은 'valid'로 패딩을 나타낸다. 세임 패딩을 사용하려면 'same'으로 지정한다.
지금까지 본 합성곱 연산은 좌우, 위아래로 한 칸씩 이동했다. 하지만 두 칸씩 건너뛸 수도 있다. 이렇게 두 칸씩 이동하면 만들어지는 특성 맵의 크기는 더 작아진다. 커널 도장을 찍는 횟수가 줄어들기 때문이다.
이런 이동의 크기를 스트라이드라고 한다. 기본으로 스트라이드는 1이다. 즉 한 칸씩 이동한다. 이 값이 케라스 Conv2D의 strides 매개변수의 기본 값이다.
strides 매개변수는 오른쪽으로 이동하는 크기와 아래쪽으로 이동하는 크기를 (1, 1)과 같이 튜플을 사용해 각각 지정할 수 있다. 하지만 커널의 이동 크기를 가로세로 방향으로 다르게 지정하는 경우는 거의 없다. 또 1보다 큰 스트라이드를 사용하는 경우도 드물다. 대부분 기본값을 그대로 사용하기 때문에 strides 매개변수는 잘 사용하지 않는다.
케라스 API를 사용하면 Conv2 D 클래스의 옵션으로 간단히 처리할 수 있다. 꼭 기억해야 할 것은 세임 패딩의 경우 입력과 만들어진 특성 맵의 가로세로 크기가 같다는 점이다.
폴링
폴링은 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할을 수행한다. 하지만 특성 맵의 개수는 줄이지 않는다. 예를 들면 다음 그림처럼 (2, 2, 3) 크기의 특성 맵에 풀링을 적용하면 마지막 차원인 개수는 그대로 ㅇ지하고 너비와 높이만 줄어들어 (1, 1, 3) 크기의 특성 맵이 된다.
여기서는 간단한 예를 위해 특성 맵의 값을 정소로 표현했지만 일반적으로 특성 맵에 들어있는 값은 실수값이다.
풀링도 합성곱처럼 입력 위를 지나가면서 도장을 찍는다. 위 그림에서는 (2, 2) 크기로 풀링을 한다. 하지만 풀링에는 가중치가 없다. 도장을 찍은 영역에서 가장 큰 값을 고르거나 평균값을 계산한다. 이를 각각 최대 풀링과 평균 풀링이라고 부른다. 풀링은 합성곱 층과 뚜렷이 구분되기 때문에 풀링 층이라고 부른다.
가령 다음과 같은 (4, 4) 크기의 특성 맵이 있다고 가정해 보겠다. 여기에 (2, 2) 최대 풀링을 적용하면 절반으로 크기가 줄어든다. 최대 풀링은 가장 큰 각을 고르기 때문에 첫 번째 (2, 2) 영역에서 9를 고르고 그다음 7, 8, 6을 차례대로 골라 (2, 2) 크기의 출력을 만든다. 특성 맵이 여러 개라면 동일한 작업을 반복한다.
즉 10개의 특성 맵이 있다면 풀링을 거친 특성 맵도 10개가 된다.
눈여겨볼 점은 풀링 영역이 두 칸씩 이동했다는 점이다. 합성곱에서는 커널이 한 칸씩 이동했기 때문에 겹치는 부분이 있었다. 하지만 풀링에서는 겹치지 않고 이동한다. 따라서 풀링의 크기가 (2, 2)이면 가 로세로 두 칸씩 이동한다. 즉 스트라이드가 2이다. (3, 3) 풀링이면 가로세로 세 칸씩 이동한다.
풀링은 가중치가 없고 풀링 크기와 스트라이드가 같기 때문에 이해하기 쉽다. 또 패딩도 없다.
캐라스에서는 MaxPooling2D 클래스로 풀링을 수행할 수 있다. MaxPooling2D의 첫 번째 매개변수로 풀링의 크기를 지정한다. 대부분 풀링의 크기는 2이다. 즉 가로세로 크기를 절반으로 줄인다. 가로세로 방향의 풀링 크기를 다르게 하려면 첫 번째 매개변수를 정수의 튜플로 지정할 수 있다. 하지만 이런 경우는 극히 드물다.
합성곱 층과 마찬가지로 strides와 padding 매개변수를 제공한다.
평균 풀링을 제공하는 클래스는 AveragePooling2D이다. 최댓값 대신 평균을 계산하는 것만 빼면 MaxPooling2D와 동일하며 제공하는 매개변수도 같다. 많은 경우 평균 풀링보다 최대 풀링을 많이 사 용한다. 평균 풀링은 특성 맵에 있는 중요한 정보를 (평균하여) 희석시킬 수 있기 때문이다.
꼭 기억할 점은 풀링은 가로세로 방향으로만 진행한다. 특성 맵의 개수는 변하지 않고 그대로이다.
합성곱 신경망의 전체 구조
지금까지 합성곱 층, 필터, 패딩, 스트라이드, 풀링 등 중요한 합성곱 신경망의 개념을 모두 살펴보았다. 이들을 합쳐서 전체 구조를 그려보겠다. 합성곱 신경망은 일렬로 늘어선 뉴런으로 표현하기 힘들다. 합성곱 신경망의 입력은 일반적으로 너비와 높이가 있는 이미지이기 때문에 조금 입체적으로 그리게 된다.
합성곱 층에서 사용할 커널의 크기는 (3, 3) 크기이고 세임 패딩이므로 1 픽셀이 입력 데이터의 주변에 추가되었다. 이때 패딩은 텐서플로에서 자동으로 추가하므로 수동으로 입력에 어떤 작업을 추가할 필요가 없다. 그다음 패딩이 추가된 입력에서 합성곱이 수행된다.
이 그림에서 합성곱 필터는 3개이다. 각각 (3, 3) 크기 가중치를 갖고 있으며 필터마다 절편이 하나씩 있다(도장마다 ⓑ가 끝에 매달린 것이 보임). 밀집층의 뉴런과 마찬가지로 필터의 가중치는 각기 서로 다르다.
따로 언급하지 않는다면 합성곱의 스트라이드는 항상 1이다. 따라서 만들어지는 특성 맵의 크기는 압력과 동일한 (4, 4)이다. 3개의 필터가 하나씩 합성곱의 출력을 만들고 이 출력이 합쳐져서 (4, 4, 3) 크기의 특성 맵이 만들어진다. 밀집층과 마찬가지로 합성곱 층에서도 활성화 함수를 적용한다. 합성곱 층은 활성화 함수로 렐루 함수를 많이 사용한다.
그다음은 풀링층이다. 풀링층은 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄인다. 보통 (2, 2) 풀링을 사용해 절반으로 줄인다. 특성 맵의 개수는 변하지 않으므로 (4, 4, 3)에서 (2, 2, 3)으로 특성 맵 개수는 유지된다.
풀링을 거친 특성 맵의 크기는 절반으로 줄었기 때문에 (2, 2, 3)이 된다. 밀집층인 출력층에 전달하려면 이 3차원 배열을 1차원으로 펼쳐야 한다. 이 배열은 12개 원소를 가진 1차원 배열이고 출력층의 입력이 된다.
출력층에는 3개의 뉴런을 두었다. 즉 3개의 클래스를 분류하는 다중 분류 문제이다. 출력층에서 계산된 값은 소프트맥스 활성화 함수를 거쳐 최종 예측 확률이 된다.
컬러 이미지를 사용한 합성곱
이 장에서 다룰 패션 MNIST 데이터는 실제로 흑백 이미지이기 때문에 2차원 배열로 표현할 수 있다. 하지만 컬러 이미지라면 어떨까? 컬러 이미지는 RGB 채널로 구성되어 있기 때문에 컴퓨터는 이를 3차원 배열로 표시한다.
하나의 컬러 이미지는 너비와 높이 차원 외에 깊이 차원(또는 채널 차원)이 있다. 이를 들어 앞의 예제에서 입력이 (4, 4)가 아니라 (4, 4, 3)이 되는 것이다. 마지막 3이 깊이 차원이다. 이런 경우에는 어떻게 합성곱이 수행될까?
깊이가 있는 입력에서 합성곱을 수행하기 위해서는 도장도 깊이가 필요하다. 필터의 커널 크기가 (3, 3)이 아니라 (3, 3, 3)이 된다. 위의 그림처럼 커널 배열의 깊이는 항상 입력의 깊이와 같다.
여기서 중요한 것은 입력이나 필터의 차원이 몇 개인지 상관없이 항상 출력은 하나의 값이라는 점이다. 즉 특성 맵에 있는 한 원소가 채워진다. 사실 케라스 합성곱 층은 항상 이렇게 3차원 입력을 기대한다. 만약 패션 MNIST 데이터처럼 흑백 이미지일 경우에는 깊이 차원이 1인 3차원 배열로 변환하여 전달한다.
두 번째 합성곱 층의 필터 개수가 10개라면 만들어진 특성 맵의 크기는 (2, 2, 10)이 될 것이다. 이렇게 합성곱 신경망은 너비와 높이는 점점 줄어들고 깊이는 점점 깊어지는 것이 특징이다. 그리고 마지막에 출력층 전에 특성 맵을 모두 펼쳐서 밀집층의 입력으로 사용한다.
합성곱 신경망에서 필터는 이미지에 있는 어떤 특징을 찾는다고 생각할 수 있다. 처음에는 간단한 기본적인 특성(직선, 곡선 등)을 찾고 층이 깊어질수록 다양하고 구체적인 특징을 감지할 수 있도록 필터의 개수를 늘린다. 또 어떤 특징이 이미지의 어느 위치에 놓이더라도 쉽게 감지할 수 있도록 너비와 높이 차원을 점점 줄여가는 것이다.
단원 마무리하기
이번 단원은 잘 이해하지 못했던 것 같다. 아무래도 계산하는 문제는 많이 약하다. 1번부터 다시 풀어보자.
1번은 (2, 2) 풀링은 특성 맵의 가로세로 크기를 절반으로 줄이기 때문에 합성곱의 출력 크기는 2를 곱한 (8, 8)이 된다. 여기에 컬러 이미지라고 했으니 3차원의 특성을 반영한 (8, 8, 3)이 된다.
2번과 3번은 아무리 생각하고 풀이를 읽어도 도저히 무슨 말인지 하나도 모르겠다. 나중에 다른 책으로도 학습을 한 후에 다시 공부해보려고 한다.
학습을 마치고
이번 단원은 첫 번째 부분에 비해 굉장히 많이 어려웠다. 처음에는 그냥 이런 게 있구나 하고 넘어갔는데 문제를 보니 난이도가 굉장히 높았다. 너무 슬렁슬렁 공부한 건 아닌가 하는 생각이 들며 다시 책을 뒤적이며 이해를 해보려고 했지만 정말 이해가 안 되었다.
아마도 행렬에 대한 개념이 어느 정도 있어야 풀 수 있는 문제 같았다. 난 고등학교 때 수학을 너무 공부하지 않아서 이과였음에도 수학을 정말 못했다. 어쨌거나 다른 책으로 학습하며 반드시 이 문제를 해결할 수 있으리라 믿는다.
'인공지능 > 딥러닝' 카테고리의 다른 글
이미지를 위한 인공 신경망 4 - 합성곱 신경망을 사용한 이미지 분류 2 : 모델 컴파일과 훈련 (0) | 2024.10.27 |
---|---|
이미지를 위한 인공 신경망 3 - 합성공 신경망을 사용한 이미지 분류 1 : 합성곱 신경망 만들기 (0) | 2024.10.27 |
이미지를 위한 인공 신경망 1 - 합성곱 신경망의 구성 요소 1 : 합성곱에 대하여 (0) | 2024.10.27 |
케라스 11 - tf.data.Dataset 클래스 (0) | 2024.10.26 |
케라스 10 - 텐서플로 데이터셋 (0) | 2024.10.26 |