아래와 같이 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의 형태로 놓고 분석하게 되기 때문에 이미지를 분석하는 것과는 조금 동떨어진 방법이다.
개념 자체는 쉬운 편은 아니지만 쉽게 말하자면 포인트가 되는 중요한 부분을 축소 및 계산하여 새로 만든 레이어를 의미한다. 아래 이미지를 보면 4x4의 비슷한 색상이 섞여있는 정사각형이 있는데 이를 2x2로 축소해 놓았다.
1) Convolution Layer를 넣은 모델은 대충 이러하다.
2) Max Pooling 2D
3) 이런 식으로 레이어를 여러개 만든다.
trainX = trainX.reshape( (trainX.shape[0], 28, 28, 1) )
testX = testX.reshape( (testX.shape[0], 28, 28, 1) )
첫 레이어를 아래와 같이 수정해 보자.
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차원의 데이터임
2x2 사이즈로 줄여준다.
tf.keras.layers.MaxPooling2D( (2,2) ),