CS231. CNN (part 1)

포도·2021년 8월 27일
0

지난 몇달 Stanford 강의 S231을 일주일에 한개씩 듣고 공부한 내용을 정리해 보려 한다.

1. What is Neural Network?

CS231강의의 이름은 Convolutional Neural Networks for Visual Recognition.

Convolutional Neural Networks은 줄여서 CNN이라고 부른다. CNN은 초기에 이미지 분류의 문제를 풀기위해 사용되었기 때문에 강의도 visual recognition 즉, computer vision 쪽에 초점을 맞추고 있다. 강의의 내용은 대략적으로 CNN의 원리를 가르치고 CNN이 어떻게 쓰이는지를 소개한다.

예를 들어, 이미지를 네트워크에 집어 넣으면 사람, 개, 고양이 등의 종류를 판별할 수도 있고, 혹은 이미지에 나타난 다양한 사물/사람들을 구분해 낼수 있는 기술도 이를 바탕으로 만들어진다. facebook에서 사진을 올리면 친구들의 사진에 이름이 매칭되는것도 이런 기술을 바탕으로 한다.

그럼 Neural Network(신경망)이 무엇인가?

Neural Networks: It is a network of artificial neurons or nodes. (출처: 위키백과)

인공신경망은 사람의 뇌 신경망 작용에서 모티브를 얻어 아래의 그림과 같이 input을 넣으면 neuron(뉴런)들의 복잡한 network를 거쳐서 output을 내놓게 된다.

[출처:https://en.wikipedia.org/wiki/Artificial_neural_network]

한개의 뉴런 안에서의 작용을 보여주는 예는 다음과 같다. 예를들어, 내 앞에 엄청 맛있어 보이는 케이크가 있다. 시각, 청각 자극이 각 각 입력값 x1, x2 라고 해보자. 이 입력값들은 한개의 뉴런에서 2개의 함수를 거친다.

  1. linear함수: x1은 W1를 거치고 x2는 W2를 거친다. 케이크가 좋다 싫다를 판단하는데 있어서 시각정보는 중요하므로 W1은 0.9라고 청각은 별로 중요하지 않기때문에 0.1로 정한다. W1x1 + W2x2가 더해져서 2번으로 넘어간다.
  2. non-linear activation(활성화) 함수: 2에서는 자극의 크기가 일정크기 이상이면 다음 뉴런으로 신호를 보내고 아니면 다음 뉴런에 아무 신호도 보내지 않는다.

물론 위의 함수들은 다양하게 쓸수 있지만, neural network에서는 뉴런안에 non-linear activation 함수를 쓴다고 하는게 machine learning과 큰 차이점이라고 할 수 있다!

2. CNN

기술을 얘기하기에 앞서 일단 입력되는 이미지부터 이해해야 한다.

2.1. Image(이미지)

이미지는 pixel(픽셀)로 이루어져 있다. 컴퓨터는 이미지를 인식할때 이미지의 pixel단위로 인식한다. 이 글에서 예를들어 볼 이미지는 가로, 세로 32x32 pixel의 컬러 이미지라고 한다면 32x32x3으로 컴퓨터에 인식될 것이다. 3이 컬러를 나타낸다. 사진이 흑백이면 32x32x1이라고 표현될 것이다. 컬러 사진이 3이라고 표현되는 이유는 색이 R(red), G(green), B(blue) 세가지 색깔의 조합으로 나타나기 때문이다. 그러므로 컬러 이미지는 3차원 정보로 컴퓨터에 입력된다.

위의 예를 가져오면, 컴퓨터는 입력이미가 들어왔을때 1024(32x32)개 pixel들의 각 pixel 별로 red, green, blue 세가지를 각 각 고려해서 입력이 된다. 우리가 보기엔 화질 안 좋은 사진이라도 벌써 컴퓨터에 입력되는 정보는 3,072 (1024*3)개가 된다.

2.2 Convolutional layer 원리

이미지에서 pixel의 위치정보는 중요하다. 예를 들어, 사람의 얼굴 이미지를 인식한다고 할 때 눈과 눈 사이의 간격, 코의 길이, 입의 위치 정보는 특정 사람을 구분해 내는데 중요한 요인이 될 것이다. convolutional layer는 이미지의 위치 정보를 보존할 수 있다.

filter, activation map, stride
아래의 그림에 5x5x3 filter(필터)가 있다. 필터는 특정한 특성을 추출한다. 예를 들어 빨간색을 추출하는 필터라고 가정해 보자. 이 필터가 사진의 맨위, 왼쪽부터 오른쪽으로 훑고 지나가면서 필터 닿는 부분의 빨간색이 있는지 확인하면서 특성을 activation map에 기록한다.

필터가 이미지에 닿는 부분의 결과를 압축하여 1개의 숫자로 activation map에 기록된다. 다시말하면, 필터는 닿는 이미지에서 빨간색에 대한 정보를 계산해서 집약적으로 1개의 숫자로 표현한다.

필터가 10개 있다고 하면 activation map 10개가 생성된다.

필터는 오른쪽으로 1개 픽셀씩 이동할 수 있고, 혹은 2개, 3개단위씩 이동할 수 있다. 이것을 정해주는걸 stride라고 한다. stride가 2이면 필터는 2픽셀 단위로 건너뛰면서 움직인다.

필터의 가로, 세로크기는 다양하게 설정할 수 있지만 depth, 5x5x3에서 마지막 부분(3)은 input image와 같아야 한다.

필터의 개수는 보통 2의 제곱으로 해주고, 적게는 32개에서 많게는 512개까지 될 수도 있다. 이미지에서 추출할 특성이 많다고 판단될때 필터의 개수를 늘려준다.

parameter
parameter의 개수는 어떻게 될까? 필터의 크기가 5x5x3이고 이런 필터가 10개가 있다고 할때, 파라미터의 개수는 760개이다.

760=((5*5*3)+1(bias))*10

activation map 계산
activation은 어떻게 계산될까?

앞서 언급됐듯이 parameter는 필터의 크기만큼 존재한다. 필터가 이미지에 적용됐을때 필터가 닿는 이미지의 pixel값과 filter의 parameter의 dot product(내적)을 구하고 bias값을 더해줘서 하나의 숫자가 activation map에 기록이된다. 필터는 이미지를 지나면서 이 숫자들을 activation map에 기록하게 된다.

[출처:https://gruuuuu.github.io/machine-learning/cnn-doc/]

activation map size
activiation map의 크기는 어떨까? 위 사진에는 28이라고 나와있다. why?? 그림으로 그려보면 쉽다. 아래의 예를 살펴보자.

activation map의 크기는 아래와 같은 공식으로 구할 수 있다.

N=image 크기, F=filter 크기, stride
(N-F)/stride + 1

[출처:http://taewan.kim/post/cnn/]

padding
인공 신경망은 몇십개 혹은 몇백개층으로 쌓기도 한다. 신경망을 통과하면서 activation map의 크기는 점점 줄어들면서 나중엔 특성을 추출하기 어려워 질 것이다.

activation map의 크기를 input 이미지와 동일하게 만들어 주기 위해 padding(패딩) 처리를 해 준다.

예를들어, 아래와 같이 7x7 이미지가 있다고 할 때, 패딩처리를 해 주면, 이미지의 크기가 9로 커지고 activiation map의 크기는 동일하게 7x7이 될 것이다. (수식: (9-3)+1)

패딩의 개수는 보통 이 공식에 따라 추가해 준다. 아래의 사진에서는 필터크기가 3이므로 패딩을 1개 추가해 줬다. 예를들어, 필터크기(F)가 5라고 하면 패딩은 2를 추가해 준다. (F-1)/2

2.3 CNN

위에서는 input 이미지가 convoluation layer에서 어떻게 작동되는지 원리를 살펴보았다.

CNN이란 이러한 convolutional layer들이 여러개 쌓인 신경망이다. 아래의 그림을 살펴보자. 비선형 함수인 ReLU가 섞여있지만 일단 여기서는 생각하지 않기로 한다.

Step 1: 처음에 input 이미지 32x32x3이 들어가고 padding을 입히지 않고 6개의 동일한 크기의 필터 5x5x3을 적용시켜 주면 output은 28x28x6 (6개의 acitvation map) activation map이 될 것이다.

Step 2: 그러면 이 output이 다음 convolutional layer의 input으로 들어간다. 다음 layer에는 5x5x6 사이즈의 10개의 필터가 있다. 역시 패딩은 씌워주지 않았다. output은 24x24x10 (10개의 activation map)이 된다.

이와 같은 과정들이 반복되는것이 CNN의 원리이다. 물론 여기에 다양한 비선형 함수라든가, pooling기법 같은것들이 중간중간에 들어가지만 그건 나중에 따로 다룰예정이다.

2.4 tensorflow

그러면 위의 CNN원리가 어떻게 tensorflow에서 구현될까?

tf.keras.layers.Conv2D (filters, kernel_size, strides=(1, 1), padding, , activation=None, use_bias=True, kernel_initializer='glorot_uniform')

  • Filters는 filter의 개수
  • kernel_size는 filter의 크기. e.g., (5,5)
  • padding은 padding을 입혀줄것인지의 여부. "valid"은 default값으로 padding이 없다는 뜻. 즉, 패딩을 원하지 않으면 아무것도 안 써주면 된다. padding ="same" 이렇게 쓰면 input 사이즈와 동일하게 패딩을 입혀준다는 뜻이다. 다만 이것은 stride를 고려하지 않을 경우다. 만약 stride를 2로 주면 output의 사이즈는 반으로 줄 것이다.
  • activation: 위에서 언급했다시피, 선형함수는 비선형함수와 결합해서 신경망을 통과한다. 어떤 비선형 함수를 쓸 것인지 정한다. ReLU함수를 쓸 거면 activation='ReLU' 이렇게 써준다.
    수식은 activation(conv2d(inputs, kernel) + bias) 즉 선형함수를 통과하고 비선형 함수를 입혀준다. 아주 중요한 개념이다!!
  • use_bias: bias를 넣을수도 안 넣을수도 있다.
  • 이것이 input에 처음으로 입혀지는 layer라면 input_shape = (32, 32, 3)도 첨가해 준다. 이미지의 사이즈가 32x32x3 (RGB)이미지라는 뜻이다.
profile
문과로 한평생 살다가 현재 펜실베니아 주립대 (University of Pennsylvania) 에서 Computer and Information Technology 공부하고 있습니다.

0개의 댓글