tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME')
합성곱 연산은, 이름 그대로 합성곱 신경망에서 계층이 연결되는 가장 기본적인 방법이다. 텐서플로에서 기본 제공되는 conv2d()함수를 사용한다.
여기의 x는 입력 이미지 또는 네트워크를 따라 이전 합성곱 계층들에서 얻어진 아래층의 특징 맵 데이터이다.
이전에 설명한 것처럼 일반적인 CNN 모델에서는 합성곱 계층을 층층이 쌓아 올리는데 Feature map은 일반적으로 이들 각 계층의 출력을 칭하는 말이다.
각 계층의 출력을 필터와 몇몇 연산을 적용한 결과인 "처리된 이미지"로 생각하는 것도 한 방법이다.
여기서 필터는 합성곱 필터를 나타내는 네트워크의 학습된 가중치인 W로 매개변수화된다.
conv2d의 매개변수를 한번 알아보자.
이미지 데이터 x는 다음과 같은 모양이다.
[None, 28, 28, 1]
이 표현은 이미지의 개수는 모르고, 각각은 28 * 28 픽셀이고, 색 채널은 1개 ( 회색조 이미지 ) 임을 나타낸다.
가중치 W의 형태는 다음과 같다.
[5, 5, 1, 32]
여기서 앞의 5 * 5 * 1 은 이미지에서 합성곱에 사용될 작은 " 윈도 " 의 크기를 나타내는데 여기서는 5 * 5 영역이다. 1채널 데이터는 2차원 텐서이며 합성곱 필터는 2차원 영역에 적용된다.
마지막 32는 특징 맵의 수이다. 즉 합성곱 계층의 가중치 집합을 여러 개를 가질 수 있으며, 이 경우는 32개가 있다는 뜻이다.
strides인수는 이미지 ( 또는 특징 맵 ) x 위에서 필터 W의 공간적 이동을 제어한다.
값 [1, 1, 1, 1]은 필터가 각 차원에서 한 픽셀 간격으로 입력 데이터에 적용되며 " 완전한 " 합성곱에 대응한다는 뜻이다.
stride에 대한 자세한 내용은 아래 링크를 참조하길 바란다.
https://blog.naver.com/kkang9901/221775702374
마지막으로 padding을 ' SAME ' 라고 설정하면 연산 결과의 크기가 x의 크기와 같도록 x의 테두리에 패딩이 적용된다.
패딩에 대한 자세한 내용 또한 아래 링크를 참조하길 바란다.
https://blog.naver.com/kkang9901/221775690287
풀링
합성곱 계층 다음에는 풀링을 하는 것이 일반적이다. 기술적으로는 풀링( pooling )의 의미는 보통 각 특징 맵 내에서 어떤 지역적 집계 함수를 사용해 데이터의 크기를 줄이는 것을 뜻한다.
풀링의 배경에는 기술적인 이유와 이론적인 이유 둘 다 있다.
기술적 측면에는 풀링은 차례로 처리되는 데이터의 크기를 줄인다. 이 과정으로 모델의 전체 매개변수의 수를 크게 줄일 수 있는데, 합성곱 계층 뒤에 완전 연결 계층을 사용할 때 특히 그러하다.
폴링을 적용하는 이론적인 근거는 계산된 특징이 이미지 내의 위치의 사소한 변화에 영향을 받지 않기를 바란다는 것이다.
예를 들어 이미지의 우상단에서 눈을 찾는 특징은, 카메라를 살짝 오른쪽으로 옮겨 눈이 이미지의 중앙 쪽에 위치하더라도 크게 영향을 받지 않아야 한다. " 눈을 찾는 특징 " 을 공간적으로 모아내면 어떤 형태에서라도 불변성을 찾아내야 한다. 그래서 이미지 간의 공간적 변화를 극복할 수 있는 모델을 만들 수 있다.
NOTE_ ) 불변성 ?
이미지 속에서 어떤 물체를 찾을 때, 예를 들어서 고양이의 얼굴을 찾는다고 하면, 이미지 내의 위치와는 무관하게 찾을 수 있어야 한다. 이는 동일한 내용이 이미지의 다른 위치에서 발견될 수 있다는 자연스러운 이미지의 속성을 반영한다. 이것을 불변성 이라고 한다. 이런 특성은 회전이 발생하거나, 조명 조건이 변하더라도 유지되어야 한다.
풀링에 대한 자세한 설명도 아래 내용을 참조하길 바란다.
https://blog.naver.com/kkang9901/221776454163
tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
최댓값 풀링은 미리 정의한 크기의 각 영역에서 입력값의 최댓값을 출력한다. ksize 인수는 풀링의 크기를 정의하고, strides 인수는 합성곱 계층과 마찬가지로 x에서 움직이는 풀링 조각이 얼마나 크게 stride, slide ( 건너뛸지, 미끄러질지) 를 제어한다. 이를 2*2 그리드로 설정하면 풀링의 결과는 원본의 높이와 폭은 절반이 되고, 크기는 1/4이 된다.
dropout, 드롭아웃
모델에 필요한 마지막 요소는 dropout이다. 이는 정규화를 위한 트릭이며 네트워크가 전체 뉴런에 걸쳐 학습된 표현을 배포하도록 강제한다. 학습 중 값을 0으로 세팅해서 계층 내의 유닛 중 임의의 사전에 설정된 부분을 " 꺼버리는 " 방식으로 드롭아웃시킨다. 드롭아웃된 뉴런은 각 연산마다 다르게 무작위로 선택되며, 네트워크가 드롭아웃 이후에도 표현을 학습하도록 강제한다. 이 과정은 여러 네트워크의 ' 앙상블 ' 학습으로도 간주할 수 있으며, 따라서 일반화를 강화한다고 할 수 있다. 테스트 시점 ( " 추론 " )에 네트워크를 분류기로 사용할 때는 드롭아웃 없이 네트워크 전체를 그대로 사용한다.
tf.nn.dropout(layer, keep_prob=keep_prob)
keep_proba는 각 단계에서 학습을 계속할 뉴런의 비율이다.
이 값은 수정 가능해야 하므로, ( 테스트 단계에서는 드롭아웃을 적용하지 않으므로 이 값을 1.0으로 지정해야 한다.) tf.placeholder를 사용해야 한다. 학습 단계에서는 0.5를, 테스트 단계에서는 1.0을 넘겨줄 것이다.
다음에 게시할 예제는 MNIST에서의 데이터를 사용해 분류기로 작은 합성곱 신경망을 적용할 것이다. 위의 내용이 포함될 것이다.
'머신러닝, 딥러닝' 카테고리의 다른 글
미니 배치 학습 (0) | 2020.01.20 |
---|---|
교차 엔트로피 오차 ( Cross Entropy Error, CEE ) (0) | 2020.01.20 |
손실 함수와 평균 제곱 오차 ( MSE ) (1) | 2020.01.19 |
신경망 학습 (0) | 2020.01.19 |
머신러닝과 딥러닝 (0) | 2020.01.19 |