일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jupyter
- Manager
- Skip Connectioin
- cnn
- Vanilla RNN
- Inception V1
- vim-plug
- Peephole Connection
- Inception Module
- Bottleneck Layer
- version
- DL
- GoogLeNet
- Generative
- DCGAN
- Residual Connection
- Regression
- RNN
- sigmoid
- virtualenv
- iTerm2
- classification
- Gated Skip Connection
- AI
- GCN
- ResNet
- Linear
- Optimizer
- python
- Skip Connection
- Today
- Total
IT Repository
(1) Basic of CNN - What is CNN 본문
Problems of FC¶
아래는 우리가 여태껏 보아왔던 MLP 구조에 대한 사진입니다.
여기서 주목할 것은 각 레이어의 node가 일렬로 펴진 채로 이전 층의 모든 node와 연결되어 구성되어 있다는 점입니다.
이러한 층을 FC 레이어(Fully Connected Layer)라고 합니다.
참고.
tensorflow.keras.layers.Dense(), torch.nn.Linear() 가 바로 FC층 입니다.
이러한 FC 레이어는 몇가지 문제점을 가지고 있습니다.
(1)
파라미터가 너무 많아서 훈련 시간이 너무 오래 걸릴뿐만 아니라 과대적합이 일어나기 쉽습니다.
위의 사진만 보아도 히든 레이어가 2개이고 그 유닛 수가 크지 않음에도 불구하고 수많은 Weight들이 생겨버립니다.
(2)
또한 이미지를 다루는 문제의 경우, 이미지 행렬을 한줄로 펴서 계산하기 때문에 불필요한 픽셀의 정보까지 다음 층에 반영되어 버립니다.
FC 레이어를 사용해서 이미지를 다룬다고 생각해보면 아래와 같을 것입니다.
$\text{input}(1 \times 32 \times 32) \rightarrow \text{stretch}(1 \times 3072) \cdot W_x(3072 \times 10) \rightarrow \text{output}(1 \times 10)$
인풋으로 32 x 32의 흑백컬러 사진이 들어온다고 했을 경우에 위와 같이 FC 레이어로 다루기 위해서 이 행렬을 3072개의 픽셀값으로 펴주는 작업이 필요합니다.
하지만 3072개의 픽셀에서 모든 픽셀들이 중요한 정보를 담고 있다고 보기는 힘듭니다.
사실은 많은 부분이 의미없는 정보일 수 있습니다.
예를 들어 배경이나 사람의 눈으로 식별하기 어려운 정도의 작은 점과 같은 픽셀은 아무 의미도 없는 정보입니다.
그러나 우리가 기존과 동일하게 FC 레이어를 사용해서 이미지를 다루는 경우는 필수 불가결하게 의미없는 정보들이 학습과정에서 반영되어 버립니다.
그러면 이러한 FC 레이어의 단점을 어떻게 극복하면 될까요?
특히 이미지 문제에서 말이죠.
정답은 Convolutional Neural Network, CNN 입니다.
What is CNN (Convolutional Neural Network)?¶
실제로 딥러닝을 통해 이미지에 대한 문제를 해결할 때 거의 대부분은 이 CNN이라는 신경망을 사용합니다.
오랜 시간 정체기에 있었던 딥러닝 기술이 각광을 받게 된 시작 역시 이 CNN이었습니다.
고양이는 이미지를 한번에 보고 인식하는 것이 아니라 이미지의 작은 조각조각을 먼저 보고 그 정보들을 합쳐서 사물을 판단한다고 합니다.
CNN은 고양이의 시신경 세포가 작동하는 방식을 모방한 방법입니다.
Hierarchical Organization of CNN¶
이제 위에서 언급한 시신경 세포가 작동하는 방식에 대해서 조금 더 구체적으로 알아봅시다.
(1)
뉴런은 "어떠한 이미지가 보이는가"(Visual stimulus)에 따라 서로 다른 뉴런들이 활성화 됩니다.
예를 들어 A1, A2, A3 뉴런이 있을 때에
선을 보면 A1(on), A2(off), A3(off)
원을 보면 A1(on), A2(off), A3(on)
모서리를 보면 A1(off), A2(off), A3(off)
와 같은 상태가 된다는 것입니다.
이를 통해 선의 방향이나 형태, 색깔, 움직임 등의 간단한 정보들을 담당하는 뉴런이 있다는 것을 알게 되었습니다.
(2)
또한, 이러한 뉴런은 무작위하게 얽혀있는 구조가 아니라 계층구조를 이루고 있습니다.
다시 예를 들어 시신경 세포와 가까운 얕은 부분(Shallow)에서 깊은 부분(Deep)까지 순서대로 A, B, C 의 뉴런이 있을 때에
A 뉴런은 선이 있는지 없는지 혹은 빛이 있는지 없는지에 따라 활성화
B 뉴런은 선의 방향이 무엇인지 혹은 빛의 세기가 얼마나 되는지에 따라 활성화
C 뉴런은 선이 곡선인지 직선인지, 선이 끝나는지 등에 따라 활성화
즉, 얕은 부분에서는 단순한 정보를 처리하고, 이전 뉴런에서 정보를 받아, 깊어지면 깊어질 수록 점점 더 고차원적인 정보를 담게 됩니다.
Dimension of Image Data¶
딥러닝을 하기 위해서 데이터를 전처리하다보면 의외로 헷갈리는 게 데이터의 차원에 대한 문제입니다.
여기에서는 tensorflow와 torch로 이미지 데이터의 차원에 대해서 설명합니다.
(Samples, Height, Width, Channel) : Tensorflow
(Samples, Channel ,Height, Width) : PyTorch
두 프레임워크를 사용하기 위한 데이터는 위와 같아야 합니다.
Channel
여기서 Channel은 이미지가 RGB(컬러)이면 3, Grayscale(흑백)이면 1입니다.
Grayscale이라면 이미지가 0~255까지의 값을 갖는 하나의 행렬으로 표현이 가능할 것이고, RGB라면 R/G/B 각각 0~255까지의 세개의 행렬로 표현할 수 있겠죠.
Height & Width
또한, 일반적으로 사용하는 (Width, Height)가 아닌 (Height, Width)를 사용합니다.
행렬 관점에서의 Row, Column 입니다.
항상 행렬으로 계산한다는 것을 명심하세요.
(이미지를 처리하기 위해서 OpenCV를 사용할 때에는 Width, Height 순서이기 때문에 헷갈립니다.)
'CNN > Study' 카테고리의 다른 글
(5) VGGNet (Small Filters with Deeper Networks) (0) | 2020.01.14 |
---|---|
(4) AlexNet (0) | 2020.01.14 |
(3) Basic of CNN - Structure of CNN (4) | 2020.01.14 |
(2) Basic of CNN - Convolutional Operation (0) | 2020.01.14 |
(0) Overview of CNN (0) | 2020.01.14 |