머신러닝야학 2기 - Tensorflow 102. CNN
데이터와 차원.
차원 (Dim)을 정의하는 두 가지 관점
- '표'에서의 열
- 데이터의 포함 관계
- 데이터 공간 ('표 형태')
- 표에서 Column의 개수가 2개 = 2차원 평면의 한 점.
- 3개 = 3차원 공간의 한 점
- n개 = n차원 공간의 한 점.
즉 관측치 = "N차원 공간의 한 점". 그러면 변수의 개수 (column의 개수) = 공간의 차원 수와 동일함.
데이터를 (관측치를) 차원의 한 점으로 표현한다는 건,
- 데이터 간 거리를 잴 수 있게 되고
- 가까운 정도를 숫자로 정밀하게 비교할 수 있게 된다.
- 데이터 형태 (데이터 포함관계)
표의 데이터는
- 4차원 공간의 점 (관측치) 라고도 볼 수 있고
- 1차원 배열 세 개를 품고 있는 하나의 배열 = 2차원 배열
으로도 볼 수 있다. 이 경우 배열의 깊이 = "차원 수"가 된다.
이미지 데이터는 최소 단위가 2차원 배열이다. 가로 / 세로, 흑백일 경우 최소 2 * 2 크기의 배열이 됨.
- 관측치 관점에서 보면 데이터 x1과 img1의 데이터 개수는 둘 다 4개다. 즉 데이터 공간 맥락에서는 둘 다 4차원 공간의 데이터라고 볼 수 있다.
- 데이터 표현 형태의 관점에서는 x1은 1차원, img1은 2차원 데이터다.
"배열의 깊이"를 "차원"으로 볼 때, 여러 차원의 형태로 구성된 데이터 구조를 Tensor라고 한다.
이미지 데이터?
흑백 이미지
- 28 * 28로 구성된, 2차원 형태의 데이터
- 28 * 28 = 784차원 공간의 한 점
칼라 이미지의 경우, 흑백이미지에는 숫자 하나만 들어가있는 저 공간에 3개 데이터가 들어간 array가 있다고 보면 된다.
- 따라서 3개 array가 가로, 세로로 각각 32개씩 쌓인 모양이므로 (32, 32, 3)인 3차원 형태의 데이터가 되고, 데이터 개수가 50000개라면 (50000, 32, 32, 3) 구조가 된다.
- 하나의 사진을 구성하는 데이터 개수는 3072 (32 * 32 * 3) 이므로, 3072차원 공간의 한 점이라고도 볼 수 있다.
Flatten
MNIST의 데이터 28 * 28을 flattern
- 784개의 column을 가진 표 형태의 데이터로 변환하는 것.
- 데이터 개수만큼의 row를 가진 표 형태가 됨.
이 features들을 그대로 사용해서 0 ~ 9까지의 숫자를 분류하려고 하면,
- '분류를 잘 예측할 수 있는' feature일 수록 가중치가 높을 것이다.
Neural Net을 사용한다는 건, 원래의 784개 feature 중 '예측에 사용하기 적합한 feature를 찾아달라'는 것과 같다.
Conv2D
Convolution의 결과는 이차원 형태의 숫자 집합으로 리턴됨. 따라서 2차원으로 표시 가능.
대상 이미지로부터 Filter를 사용해 특징을 잡아낸 Convolution의 결과
= feature의 위치정보가 표현된 Feature Map 이라고 부른다.
- 하나의 필터당 하나의 feature Map을 만들어낸다.
Conv2D 메소드에서 설정할 것은 두 가지.
- 몇 개의 filter를 사용할 것인가 -> 3개일 경우 "3채널의 feature map을 생성한다" 는 용어를 쓴다.
- filter의 크기는 몇 * 몇인가.
이렇게 추출한 feature Map을 학습에 사용. (flatten -> Dense)
Conv2D를 사용하기 위해서는 데이터를 3차원으로 변경해야 함.
- = Input에 Shape=[28, 28, 1]로 변경한 이유.
- reshape으로 데이터 차원을 맞춰 줌
Filter
필터셋 == filter.
"feature map 전체를 본다"의 예시
- 흑백사진일 경우 (가로, 세로, 1) dim 이미지. 따라서 featureMap의 크기는 (size, size, 1) -> 채널 1개이므로 featureMap도 채널 1개
- 컬러사진일 경우 (가로, 세로, 1) dim이므로 featureMap의 크기는 (size, size, 3)이 된다. -> 채널 3개이므로 featureMap도 채널 3개.
Conv2D(3)...
의 경우 featureMap이 3개이므로, Conv2D를 통과한 데이터의 차원은 (5,5,3)가 세 개이므로 (3,5,5,?)이 된다.
- 28 * 28 * 1 이미지를 5 by 5 filter 세 개를 활용하면
- 필터 개수가 3개이므로 리턴되는 featureMap은 세 개 = 3
- 필터 크기가 5이므로 사이즈는 28 - 5 + 1 = 24.
- 따라서 24 * 24 * 3이 된다.
- 24 * 24 * 3 형태의 데이터를 5 by 5 filter 6개를 활용한다면
- 필터 개수가 6개이므로 리턴되는 featureMap은 6개
- 필터 크기가 5이므로 24 - 5 + 1 = 20
- 여기서 filter는 앞의 featureMap
Conv2D 연산의 과정: https://www.youtube.com/watch?v=VHQbRI2Xvl0
MaxPool2D
Flatten 이후, feature들의 가중치를 조절해 원하는 결과를 얻어내기 위한 연산에는 비용이 든다. (파라미터 개수 측정 과정에서 +1은 bias값이다.)
특히 Conv2D 연산 결과로 나온 feature 크기가 클수록, Dense 레이어에서 연산해야 하는 feature의 가중치 개수는 점점 커진다. 즉 연산속도를 느리게 만든다.
이 때문에 등장한 개념이 Pooling. 입력으로 사용할 column (feature) 개수를 줄이는 것이 목적임.
Pooling : 이미지 크기를 절반으로 줄이는 것.
- featureMap의 값이 크다 = 원하는 feature 특징이 가장 두드러지는 부분.
- 따라서, 특징을 최대한 해치지 않는 선에서 feature 개수를 줄이는 것.
cf. 개인적으로 정리가 필요해서 기록한 내용
Batch Normalization이 필요한 이유
https://www.youtube.com/watch?v=nUUqwaxLnWs
- Hidden Layer의 input으로 들어오는 이전 hidden layer값의 변동을 줄여준다. (데이터가 신경망을 지날수록, 뒤쪽 신경망의 input으로 들어오는 값의 변동성이 커지기 마련이다. 이 변동성을, 최소한 평균은 0 / 분산은 1인 데이터 분포를 갖도록 줄여주는 역할.)
- 앞쪽 layer / 뒤쪽 layer 매개변수 간 relation을 약화시킨다. 즉, 각 층의 학습이 보다 독립적으로 전개될 수 있다. = 전체 신경망의 학습속도를 늘려준다. = 원래의 의도.
- 약간의 regularization 효과.
- mini-batch 형태로 데이터 학습. 배치는 어쨌든 전체 데이터의 샘플이므로, 배치 데이터의 평균과 분산은 모집단 전체의 평균과 분산값에 약간의 잡음이 낀 상태가 된다. (noisy - bcuz the data size is relatively small)
- 데이터에 'noisy 평균'값을 빼고, 'noisy 분산'값을 나누는 과정... 학습과정과 결과에 약간의 Noise가 추가된다.
- dropOut은 학습된 layer값에 0 / 1을 곱해 진행한다는 점에서 regularization을 추가한다면, batch normalization도 평균 / 분산값을 연산에 추가해 진행한다는 점에서 regularization 역할도 일부 담당한다. 다만, batch norm만 가지고 regularization을 논할 만큼 유의미하다고 보긴 힘듬.
- batch의 사이즈가 커지면, 보다 모집단에 가까운 평균과 분산을 사용하므로 노이즈가 줄어든다. 따라서 regularization 효과가 약해진다.
noise가 추가된다 = 각 layer간 지나친 의존성을 낮추는 효과.