딥러닝 - tensorflow(CNN) - 1

김찬울·2021년 9월 9일
0

CNN

딥러닝 모델의 기초 알고리즘이라 할 수 있는 CNN은 이미지에 대한 딥러닝 모델이다.
Convolutional Neural Network 라는 뜻으로 합성곱 신경망이라 불린다.

기존 신경망에서는 이미지같이 1차원이 넘는 데이터에 대해서 Flatten으로 1차원화 시킨다음 학습을 시키기 때문에 이미지 특성상 x축과 y축을 기준으로 가까운 픽셀의 영향을 많이 받는데
이를 평활화 하면 y축이 무시되는 단점이 있기에 합성곱을 이용해서 근처인 픽셀에게 영향력을 주는 방식이다.

이는 tensorflow에서 해당 모듈을 사용하면 된다.

from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D

각각 Input을 받고, 합성곱하고, maxpool을 해준다.

합성곱 먼저 설명하면

이런 형태인데 Input받은 (6, 6, 1) 형태의 데이터에 영역별로 Filter를 곱하고 곱한 값을 모두 더한 것이 Result의 한 픽셀이다.

이를통해 데이터 자체를 축소할 수도 있고 간략히 나타낼수도 있으며, 또한 근처의 데이터에게 영향을 주게된다.

코드로 나타내면 이렇다.

input_tensor = Input(shape=(28, 28, 1)) # 여기서 Flatten이 필요 없고 채널을 추가해줌.
x = Conv2D(4, kernel_size=(3, 3), strides=1, padding='same', activation='relu')(input_tensor)
x = MaxPooling2D(2)(x) # 절반으로 줄었다. 대부분 pool_size랑 stride는 동일하게 쓴다. 따로 써도 되긴하는데 왠만해서 동일하다.

Conv2D부분을 보자,
filter = 4라는 것은 가중치가 4개 있다는 느낌으로 4번을 실행한다.

kernel_size는 filter를 조금더 자세히 말하면 커널인데
필터의 사이즈라고 생각하자. 해당 코드는 3 * 3형태이다.

strides는 몇간 단위로 묶을 것이냐인데 해당 코드는 1이라서 옆으로 아래로 1칸씩 내려가면서 묶어서 filter로 계산한다 그러다보니 3 * 3의 영향으로 6 - 2, 6 - 2 의 형태로 result가 나온다.

하지만 padding이란 것이 있는데 padding은 소실되는 데이터를 막기 위해서 8 * 8로 늘리고 새롭게 추가된 줄에는 0을 넣는다. 값이 크진 않게되지만 그래도 데이터 소실을 막는다.

activation은 다른 모델에서와 같이 result에 대해서 활성화 함수를 적용한 것이다.

내일은 해당 코드에 Dense등 완전한 모델로 만들 예정이다.

profile
코린코린이

0개의 댓글