이번에 다룰 내용은 convolutional neural network입니다.

 

이미지, 음성 처리에 사용되는 모델입니다.

 

CNN도 앞서 설명한 것처럼 계층을 레고 블록처럼 조합하여 만들 수 있습니다.

 

convolutional layer & pooling layer이 새롭게 도입되는 계층입니다.

 

나머지는 이전과 같습니다.

 

 

1. cnn 의 구조

지금까지 본 신경망은 모든 뉴런이 결합되어 fully-connected라고 하며 affine layer로 구현하였습니다.

 

cnn은 다음과 같은 구조로 이루어집니다.

 

conv -> relu -> pooling -> conv -> relu -> pooling -> conv -> relu -> affine -> relu -> affine -> softmax ...

 

 

2. cnn 고유의 용어

- padding: convolutional layer을 수행하기 전에 입력 데이터 주변을 특정 값으로 채우는 기법.

(이를 사용하면 원래는 이미지가 축소되지만, 크기를 늘려서 output도 같은 shape를 가질 수 있게 할 수 있습니다. 즉, 출력 크기를 조정할 목적에서 사용될 수 있습니다.)

 

- stride: filter를 적용하는 위치의 간격

(stride가 커지면, output의 shape는 축소됩니다.)

 

- feature map : I/O data

 

- filter == kernel

 

- window: 필터의 size

 

- 각 계층 사이에는 3차원 데이터같이 입체적인 데이터가 흐른다. -> 원래는 flatten data가 흐른다.

 

 

3. fully connected layer의 문제점

데이터의 shape가 무시됩니다. mnist에서 flatten하게 784로 데이터가 들어갔었죠. 그러나 이 shape에는 공간적 정보가 들어가 있습니다. 예를 들어, 공간적으로 가까운 픽셀은 값이 비슷하거나, 거리가 먼 픽셀끼리는 연관이 없는 등 3차원 속 의미를 갖는 패턴이 있을 거란 얘기입니다. 

 

한편, conv layer는 shape를 유지합니다. 따라서 공간적인 정보를 이해할 가능성이 높습니다.

-> 왜?

1.질문: cnn을 사용하면 이미지의 shape을 살려서 데이터를 전달하기때문에 이미지를 더 잘 이해할 수 있다고 하는데, 일반적인 nn에서 flatten한 데이터를 전달할때보다 더 성능이 좋다는 건가요?? 만약에 그렇다면 3차원 데이터를 사용하든 축소한 1차원 데이터를 사용하든 어차피 데이터에서 패턴을 찾아가는 건데 왜 그런 차이가 발생할까요? 그냥 그런가보다하고 넘어가도 되긴한데 뭔가 이해가 안가고 궁금해서 여쭤봅니다.

2.답변: 저는 딥러닝을 'LocalOptimal 찾는 효율적인 방법'이라고 생각하는데요, 원본 데이터가 2차원 이미지 데이터라면 2차원 단위로 쪼갰을 보다 연관성이 높은 데이터끼리 뭉치는(보다 의미있는) 패턴을 찾기 쉬워서라고 생각합니다. 1차원으로 flatten 경우에도 물론 패턴을 찾아가겠지만 잘못된 LocalOptimal 빠질 가능성이 높아지겠죠. CNN 철학이 LocalOptimal 상대적으로 찾기 쉬우니 쪼개서 의미를 찾은 전체적으로 합치는 거라고 생각하면 원본 데이터와 같은 차원을 이용하는 것이 유리하기 때문에 그렇다고 보면 같아요.

요즘 나오는 mlp mixer 조금 다른 철학으로 접근하는 같아요. 쪼개서 찾는 보다 통째로 차원을 이리저리 변환하면서 찾는 것도 괜찮다는 같은데, 말씀하신 부분이 딥러닝 방법론의 핵심인듯 하니 깊게 고민해보셔도 좋을 같습니다.

덧붙이자면... 일반 NN으로도 오래 학습하면 인접 픽셀 간의 관계 패턴을 인식하는 네크워크가 발달하겠지만, CNN 시작부터 인접 픽셀 관계가 중요하다고 못박아놓고 학습하는 셈이라 효율성 면에서 차이가 수밖에 없을 같습니다.

네. 효율성이 좋아야 이리저리 시도해볼 수 있으니 정답에 가까워질 가능성도 높아질거고요.

하지만 못박아놓고 들어가기 때문에 혹시나 정답이 좀 다른 방향에 있다면 그쪽으로는 접근하지 못하는 한계도 있을겁니다. 그걸 극복하기 위해 이런 저런 방법들이 제안되고 있구요.

3.정리: cnn은 시작부터 인접 픽셀 간 관계가 중요하다고 못 박아놓고 학습하는 셈이라 연관성이 높은 데이터끼리 뭉치는 패턴을 찾기 쉽고, 그래서 효율성 면에서 좋은 반면에 이렇게 못 박아놓고 들어가기때문에 정답이 다른 방향에 있다면 그쪽으로는 접근 못하는 한계가 있다. 그래서 그걸 해결하기 위한 방법들이 제안되고 있다.

4. 더 나아간 연구: attention기법들이라고 생각하는데요. 따라가다 보면 만나실 같아요. Transformer 보심 좋을 같네요.

https://glee1228.tistory.com/3

https://lsjsj92.tistory.com/453

 

 

4. convolutional layer 연산

input feature map에 filter를 곱하고 bias를 더하면 output feature map이 완성되는 합성곱 연산을 사용한다.

아래 링크를 보면 쉽게 알 수 있습니다. 이를 통해 feature를 요약한 feature map을 얻게 됩니다.

 

https://m.blog.naver.com/arar2017/221791762760

 

CNN의 핵심원리 : 합성곱 연산, 예시를 통해 살펴보자

곱셈과 덧셈만 알면 정말 쉬운 '합성곱' 합성곱 연산은 CNN의 핵심원리라고 할 만큼 중요하다...

blog.naver.com

 

 

4-1. pooling layer 연산

세로, 가로 방향의 공간을 줄이는 연산입니다. 매개변수를 학습하지도 않고 채널의 수를 바꾸지 않습니다. 게다가 입력 데이터가 조금 변해도 예를 들어서 가로로 1원소만큼 어긋나도 범위 내의 최댓값은 같으므로 결과가 변하지 않습니다.

 

 

5. output shape의 계산

input size (H, W),  filter size (FH, FW),  output size (OH, OW),  padding P,  stride S

 

 

 

6. conv, pooling layer의 의미

The Convolutional Layer makes use of a set of learnable filters. A filter is used to detect the presence of specific features or patterns present in the original image (input). It is usually expressed as a matrix (MxMx3), with a smaller dimension but the same depth as the input file.

 

This layer basically reduces the number of parameters and computation in the network, controlling overfitting by progressively reducing the spatial size of the network. the maximum parameter is taken out and the rest is dropped. This actually down-samples the network.

 

https://machinelearningmastery.com/convolutional-layers-for-deep-learning-neural-networks/

https://cs231n.github.io/convolutional-networks/#conv

 

7. 블록으로 생각하기

여기서 나온 filter블록을 여러 개로 늘리면 output도 filter 블록의 갯수만큼 늘어나게 된다. 이 정보는 편향 정보를 더한 후, 다음 계층으로 넘어갑니다.

 

 

8. conv/pooling layer 구현하기

 

1)numpy reshape

https://rfriend.tistory.com/345

 

[Python NumPy] reshape에서 -1 은 무슨 의미인가? (reshape(-1, 1))

파이썬 NumPy 에서 배열의 차원(Dimension)을 재구조화, 변경하고자 할 때 reshape() 메소드를 사용합니다. 가령, 3개의 행과 4개의 열로 구성된 2차원의 배열로 재설정하고 싶으면 reshape(3, 4) 처럼 reshape(

rfriend.tistory.com

 

2)numpy transpose

https://rfriend.tistory.com/289

 

[Python NumPy] 행렬의 행과 열 바꾸기, 축 바꾸기, 전치행렬 : a.T, np.transpose(a), np.swapaxes(a,0,1)

지난번 포스팅에서는 다차원 행렬 ndarray에 축을 추가하는 방법으로 arr(:, np.newaxis, :), np.tile() 을 소개했었습니다. 이번 포스팅에서는 행렬의 행과 열을 바꾸기, 행렬의 축을 바꾸는 방법을 알아

rfriend.tistory.com

 

 

학습을 시켜보면 일반적인 nn이 아닌 cnn을 통해서 성능이 개선되는 것을 알 수 있습니다. 거의 98%까지 가능하다고 합니다.

 

9. cnn 시각화하기

 

필터는 처음에 랜덤으로 초기화되어 아무런 패턴이 보이지 않지만 학습 후에는 1번째 필터에서는 basic feature(대각선, 엣지 등)이 잡히기 시작합니다. 이처럼 필터를 통해서 우리는 이미지의 feature를 뽑아낼 수 있습니다.

 

1번째 필터에서도 필터1, 필터2... 으로 나눠지고 각각 feature를 뽑아냅니다. 대각선만 맡는 필터, 엣지만 맡는 필터처럼 말입니다.

 

결론적으로 마지막 합성곱 레이어에서는 사물을 분류할 수 있게 됩니다.

 

 

10. 모델소개

LeNet, AlexNet, ResNet 등이 모델로 있습니다. 

활성화 함수 바꾸기, sub sampling -> max sampling으로 바꾸기, local response normalization 계층 추가하기, dropout 기법 사용하기 등을 하면서 개선되면 새로운 모델이 탄생하는 것 입니다!

 

 

gpu와 big data의 발전으로 가능해진 딥러닝, 최종적으로 아래 링크를 통해 cnn을 이해해보자.

https://excelsior-cjh.tistory.com/180

 

06. 합성곱 신경망 - Convolutional Neural Networks

이번 포스팅은 핸즈온 머신러닝 교재, cs231n 강의를 가지고 공부한 것을 정리한 포스팅입니다. CNN에 대해 좀 더 간략하게 알고 싶으신 분들은 아래의 링크를 참고하면 됩니다. 간략한 설명 : 합성

excelsior-cjh.tistory.com

 

 

최종정리.

기존의 nn에서 conv, pooling layer을 추가한 cnn은 이미지, 음성처리에 사용되는 모델입니다.

여기서 convolution layer는 feature를 filter을 통해서 feature map을 뽑아내는 역할을 합니다. 이를 pooling layer을 통해 down sampling을 합니다. 이렇게하면 각 layer마다 basic feature에서 high level feature를 탐지할 수 있습니다.

결론적으로 기존의 nn보다 더 좋은 성능을 보이는데 그 이유는 공간 상의 연관성을 유지하기 위해서 축소된 차원의 데이터가 아닌 원본 차원을 유지하기 때문입니다.

그리고 cnn을 이해하기 위해서 다음과 같은 용어도 알아보았습니다.

(stride, padding, convolution, pooling, window, filter == kernel, feature map)

마지막으로 실제 구현을 통해서 이론을 코드로 옮겨보았습니다. 구현 과정에서는 이미지를 행렬로 바꿔주는 im2col 메소드가 유용하게 사용되었는데 그 이유는 기본적인 로직이 데이터 블록을 행렬로 바꾸고 필터도 행렬로 바꿔서 행렬 연산을 통해 효율적인 계산을 하기 위함이였습니다. 이렇게 나온 ouput 행렬은 reshape하여 원래 shape으로 바꿔주었습니다. 이때, 공식으로 미리 구해둔 output height, output width를 사용하였습니다.

 

끗!

 

+ Recent posts