Project & Kaggle

Deep learning( CNN을 활용한 Mnist classification kernel)

판교데싸 2020. 11. 30. 10:28

 Mnist 데이터 로드 후 tensorflow를 통한 train/test split.

from tensorflow.keras import datasets

(train_x, train_y), (test_x, test_y) = datasets.mnist.load_data()

 28바이28 의 데이터가 6만개 쌓여있다 라는 뜻 

from tensorflow.keras import datasets

(train_x, train_y), (test_x, test_y) = datasets.mnist.load_data()
image=train_x[0]
image.shape
(60000, 28, 28)
plt.imshow(image,'gray')
plt.show()

 

# 차원 수 높이기 
image=image[tf.newaxis,...,tf.newaxis]

*이미지를 불러왔을 때는 주저없이 shape를 확인하여 이미지 사이즈 채널 등등을 확인

*이미지 데이터는 항상

(batch_size,height,weight,channel) 이렇게 들어가게 만들어야함 -> 아래처럼

filters: layer에서 나갈 때 몇 개의 filter를 만들 것인지 (a.k.a weights, filters, channels)  
kernel_size: filter(Weight)의 사이즈  
strides: 몇 개의 pixel을 skip 하면서 훑어지나갈 것인지 (사이즈에도 영향을 줌)  
padding: zero padding을 만들 것인지. VALID는 Padding이 없고, SAME은 Padding이 있음 (사이즈에도 영향을 줌)  
activation: Activation Function을 만들것인지. 당장 설정 안해도 Layer층을 따로 만들 수 있음

1. Convolution

tf.keras.layers.Conv2D(filters=3,kernel_size=(3,3),strides=(1,1),padding='SAME',activation='relu')

각각의 하이퍼 파라미터를 설정해둔 뒤에 image는 항상 float형식으로 맞춰준다

Convolution을 거치면서 위에서 아래로 변한것을 확인 가능

weight를 불러온 뒤 확인 -> 첫번째는[0]는 웨이트고 두번째[1]는 Bias 

2. Activation Function

Activation function (Relu)를 통과 시킨 이후에는 0이하값이 모두 0이 된것을 볼 수 있다.

->Relu가 0미만을 모두 0으로 바꿔줌

3. Pooling(Stride)

pooling후 확실히 이미지가 줄어든 것을 확인 (원래는 14*14)

 

4. Fully Connected

4-1 Flatten

flatten.shape를 보면 쫙펴진것을 알수있음(1,245) 

4.2 Dense

tf.keras.layers.Dense(32,activation='relu')

tf.keras.layers.Dense(32,activation='relu')

위에서 나온 245를 연결하는것 그다음레이어의 노드의수 =32

레이어를 통과시키고 output을 보면 32개가 되어있음

4.3 DROPOUT

overfitting이 될 수 있어 전체노드를 끊어주는 역할을 함 -> 학습이 안되는 부분을 학습이 되게끔 해줌

*인공지능 학습중에만 drop_out이 실행이되고(B) Test에서는 dropout이 다시 (A)로 돌아옴

얼마나 끊고 살릴건지 비율을(0.7) 주는 것이라 보면 됨

5. Build Model

Feature Extraction 부분안에서 32,64노드의 수 구별을 정확하게 하고 

Fully Connected 와의 차이도 살핀다

*마지막에는 Class가 몇개인지에 따라 노드의 갯수가 다르고 Softmax(모든 값을 더했을 때 1이나옴)를 사용

 

6. Summary

반응형
반응형