[tensorflow] #6. Convolutional Layer

exoluse·2021년 10월 27일
0

python - tensorflow

목록 보기
6/7

Flatten() 으로 결과는 냈지만

아래와 같이 dense_2 (Dense) 레이어의 Output Shape가 2D의 형태로 되어 있는데...

Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 28, 64)            1856      
_________________________________________________________________
dense_1 (Dense)              (None, 28, 128)           8320      
_________________________________________________________________
dense_2 (Dense)              (None, 28, 10)            1290      
=================================================================

tensorflow.keras.layers.Flatten() 으로 원하는 데이터 형태가 되었다.

Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 28, 64)            1856      
_________________________________________________________________
dense_1 (Dense)              (None, 28, 128)           8320      
_________________________________________________________________
flatten (Flatten)            (None, 3584)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                35850     
=================================================================

이미지 분석 본질과는 멀어지게 된다.

원래 2D 형태의 이미지([[1,2],[3,4]],[[5,6],[7,8]]...[[9,0],[1,2]],[[3,4],[5,6]]....]) 를 분석해야 하지만 Flatten() 을 사용하게 되면 [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6] 과 같이 1D의 형태로 놓고 분석하게 되기 때문에 이미지를 분석하는 것과는 조금 동떨어진 방법이다.

그 대안이 Convolutional Layer

개념 자체는 쉬운 편은 아니지만 쉽게 말하자면 포인트가 되는 중요한 부분을 축소 및 계산하여 새로 만든 레이어를 의미한다. 아래 이미지를 보면 4x4의 비슷한 색상이 섞여있는 정사각형이 있는데 이를 2x2로 축소해 놓았다.

1) Convolution Layer를 넣은 모델은 대충 이러하다.

2) Max Pooling 2D

3) 이런 식으로 레이어를 여러개 만든다.

학습 이미지와 테스트 이미지를 3차원으로 변경

trainX = trainX.reshape( (trainX.shape[0], 28, 28, 1) )
testX = testX.reshape( (testX.shape[0], 28, 28, 1) )

Convolutional Layer 적용

첫 레이어를 아래와 같이 수정해 보자.

tf.keras.layers.Conv2D(32, (3,3), padding="same", activation="relu", input_shape=(28, 28, 1)),

해설
1) Conv2D : 2D용 Convolution Layer
2) 32 : 32개의 Feature Layer를 생성
⚡️ Feature Layer : 이미지를 놓고 갖가지(?) 방법으로 요소를 뽑아낸 레이어라고 보면 됨
3) (3,3) : 커널(kernal) 사이즈
⚡️ kernal : Feature Layer를 만들 때 조건이 되는 요소
4) activation="relu" : 활성함수로 relu 를 쓰겠음
5) input_shape=(28, 28, 1) : 인풋값은 3차원의 데이터임

MaxPooling2D() 로 이미지 사이즈 줄이기

2x2 사이즈로 줄여준다.

tf.keras.layers.MaxPooling2D( (2,2) ),

0개의 댓글