티스토리 뷰

Convolutional Layers in Keras

- Convolution with 3x3 window and stride 1




- Keras에서 convolutional layer를 생성하기위해 위와 같은 모듈을 임포트해야한다.




- 임포트 이후 아래의 포맷으로 convolutional layer를 생성할 수 있다.

- 인자로 지정해줄 수 있는 값으로는 아래와 같은 것들이 있다.

- filters : 필터의 개수를 지정

- kernel_size : convolution window의 너비와 높이(height and width)를 지정

- strides : convolution의 stride를 지정(디폴트 = 1)

- padding : 'valid' 또는 'same' 을 지정(디폴트 = 'valid')

- activation : activation function을 지정(디폴트 = 'relu'). 

- 모든 convolutional layer에는 ReLU activation function을 적용시키는 것이 강력하게 권장됨.

- kernel_size와 strides는 숫자 또는 튜플로 값을 넘겨줄 수 있음

- convolution layer를 input layer 바로 다음 레이어로 사용할 경우, 추가적으로 input_shape 인자를 넘겨줘야한다.

- input_shape : input의 높이, 너비 및 깊이를 지정해주는 튜플

- 단, convolution layer가 input layer의 바로 다음에 오는 레이어가 아닌 경우 input_shape를 지정해주지 않도록 해야한다.

- 더 많은 매개변수들이 존재하는데 이것들의 모든 역할을 확인하려면 여기






Example #1

- 200 by 200픽셀(높이 200, 너비 200, 깊이 1인 3D 배열)의 이미지가 input으로 들어감

- 그리고 너비와 높이 모두 2인 16개의 필터가 있는 convolution layer를 만든다.

- convolution layer 수행시 한 번에 두 픽셀 씩 이동시키고,

- 필터가 이미지로부터 패턴을 얻어낼 때, 경계 밖으로 확장되지 않도록(이미지를 0으로 채우지 않음)

- 이 경우 아래와 같이 인자를 넘겨준다.




Example #2

- 위에서 생성한 convolutional layer를 input으로 하는 CNN을 만들고자 함.

- 너비와 높이 모두 3인 32개의 필터를 필요로 하고,

- convolution layer 수행시 한 번에 한 픽셀 씩 이동시킴

- convolutional layer가 이전 레이어의 모든 영역을 확인해야함. 

- 즉, 필터가 이전 레이어의 edge에 걸려도 상관없다.

- 이러한 옵션에서 convolutional layer를 구현한다면 아래와 같다.




Example #3

- convolutional layer에 관련된 코드를 온라인상으로 타인의 코드를 확인해보면 아래와 같은 포맷의 코드들이 많이 보인다.

- 이 경우 2 by 2 크기의 필터를 64개 둔다는 것이며, activation function으로 ReLU 를 지정해 준 것이다.

- 그 외 나머지 인자들은 디폴트이기 때문에 stride는 1, padding은 'valid'가 되겠다.






Quiz : Dimensionality

- 신경망 네트워크에서와 마찬가지로 Keras를 이용하여 먼저 Sequencial 모델을 만들어 CNN을 구현해보자.

- .add() 메소드를 이요하여 네트워크에 레이어를 추가해주면 된다.

1
2
3
4
5
6
7
from keras.models import Sequential
from keras.layers import Conv2D
 
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, strides=2, padding='valid'
    activation='relu', input_shape=(200, 2001)))
model.summary()
cs

- 위 코드에서 이 CNN을 학습시키진 않는다. 

- 다만 exe파일을 사용하여 함수의 매개변수에 넘겨준 인자값에 의해 

- convolutional layer의 차원(dimensionality)이 어떻게 변하는지를 알아보도록 하자.




- 코드 실행시 위와같이 결과가 나오게 되는데, convolutional layer의 차원을 살펴보자.

- convolutional layer의 차원은 Param # 아래의 숫자를 의미한다.

- 콘볼루션 레이어의 차원을 변경하려면 filter와 kernel_size의 인자 값을 변경해줘야 한다.

- 또한 콘볼루션 레이어의 shape의 변화도 살펴보도록 하자.

- Output Shape 아래에 적힌 숫자가 콘볼루션 레이어의 shape에 해당한다.

- None은 batch size를 의미하며, 위의 결과상 convolutional layer는 높이 100, 너비 100, 뎁스 16이 된다.






Formula : Number of Parameters in a Convolutional Layer

- convolutional layer의 매개변수의 수는 filters, kernel_size, input_shape에 주는 값에 따라 달라진다.

- 예를들어 몇몇 변수들을 정의해보면 다음과 같다.

- K : 콘볼루션 레이어의 필터의 수

- F : 콘볼루션 필터들의 높이와 너비(the height and width)

- D_in : 이전 레이어의 뎁스(the depth of the previous layer)

- K = filters / F = kernel_size / D_in = input_shape 튜플의 마지막 값 을 의미한다.


- 필터당 F * F * D_in 만큼의 가중치들이 있고, convolutional layer는 K개의 필터로 구성되므로

- 콘볼루션 레이어의 전체 가중치는 K * F * F * D_in 이 된다.

- 필터당 하나의 바이어스 항이 존재하기 때문에 콘볼루션 레이어는 총 K개의 바이어스를 갖는다.

- 따라서, convolutional layer의 파라미터의 개수는 K * F * F * D_in + K 가 된다.


- 마찬가지로 K = filters / F = kernel_size / S = stride 를 의미한다.

- 또, H_in = input_shape 튜플의 첫번째 값 / W_in = input_shape 튜플의 두번째 값 을 의미한다.


- 콘볼루션 레이어의 뎁스는 항상 필터의 수 K와 동일하다.


- padding = 'same' 인 경우, 콘볼루션 레이어의 공간 차원(spatial dimensions)은 다음과 같다.

- height = ceil(float(H_in) / float(S))

- width = ceil(float(W_in) / float(S))

- padding = 'vaild' 인 경우, 콘볼루션 레이어의 공간 차원(spatial dimensions)은 다음과 같다.

- height = ceil(float(H_in - F + 1) / float(S))

- width = ceil(float(W_in - F + 1) / float(S))



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/03   »
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
31
글 보관함