본문 바로가기
DeepLearning Framework & Coding/Tensorflow 2.X

[코드로 이해하는 딥러닝 2-11] - CNN(Convolutional Neural Network)

by 노마드공학자 2021. 1. 15.

※ Tensorflow1문법을 2로만 바꾸는것이기에, 코드분석 위주로 진행하고있습니다.

[Tensorflow1 링크종합] https://limitsinx.tistory.com/50

 

 

※ 이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다.

코드만 해석하고 넘어가기에 다소 불친절한 글 일수 있습니다..

   개념적인 부분은 하기 링크에 따로 정리해두어, 참조 부탁드립니다.

https://limitsinx.tistory.com/47

 

딥러닝이라고 하면 흔히 떠오르는 ,CNN(Convoltuional Neural Network)에 대해 정리해보겠습니다.

개념적인 부분은 상기 링크에 정리를 해두었으므로, 이번 글에서는 코드 분석 위주로 정리를 하겠습니다.(tensorflow2.1)

 

 

[코드 전문]

 

import numpy as np

import tensorflow as tf

import random

 

mnist = tf.keras.datasets.mnist

 

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_test = x_test / 255

x_train = x_train / 255

x_train = x_train.reshape(x_train.shape[0], 28281)

x_test = x_test.reshape(x_test.shape[0], 28281)

 

# one hot encode y data

y_train = tf.keras.utils.to_categorical(y_train, 10)

y_test = tf.keras.utils.to_categorical(y_test, 10)

 

# hyper parameters

learning_rate = 0.001

training_epochs = 12

batch_size = 128

 

tf.model = tf.keras.Sequential()

# L1

tf.model.add(tf.keras.layers.Conv2D(filters=16kernel_size=(33), input_shape=(28281), activation='relu'))

tf.model.add(tf.keras.layers.MaxPooling2D(pool_size=(22)))

 

# L2

tf.model.add(tf.keras.layers.Conv2D(filters=32kernel_size=(33), activation='relu'))

tf.model.add(tf.keras.layers.MaxPooling2D(pool_size=(22)))

 

# L3 fully connected

tf.model.add(tf.keras.layers.Flatten())

tf.model.add(tf.keras.layers.Dense(units=10kernel_initializer='glorot_normal'activation='softmax'))

 

tf.model.compile(loss='categorical_crossentropy'optimizer=tf.keras.optimizers.Adam(lr=learning_rate), metrics=['accuracy'])

tf.model.summary()

 

tf.model.fit(x_train, y_train, batch_size=batch_size, epochs=training_epochs)

 

# predict 10 random hand-writing data

y_predicted = tf.model.predict(x_test)

for x in range(010):

    random_index = random.randint(0, x_test.shape[0]-1)

    print("index: ", random_index,

          "actual y: ", np.argmax(y_test[random_index]),

          "predicted y: ", np.argmax(y_predicted[random_index]))

 

evaluation = tf.model.evaluate(x_test, y_test)

print('loss: ', evaluation[0])

print('accuracy', evaluation[1])

 

 

[코드 분석]

① tf.model.add(tf.keras.layers.Conv2D(filter=16,kernel_size=(3,3), input_shape=(28,28,1),activation='relu'))

: CNN을 모델링 하며, filter의 갯수는 16개, 커널(필터)사이즈는 3X3으로 ReLU function을 통과시키는 코드로써, strides값은 default로 1이 들어갑니다.(Convolution window 1칸씩 옆으로 이동)

※ 모든 CNN에서는 ReLU를 쓰는것이 권장됩니다.(성능)

 

② tf.model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2))

: Max pooling을 2X2 사이즈의 커널로 진행

 

위의 과정이 1개 Layer인데 이것을 3층으로 작성하고, 마지막 Layer만 Softmax를 통과시켜주는 코드입니다.

 

 

[결과값]

정확도는 약 98.7%가 나왔습니다.

이 전글에서는 5개의 Layer임에도 DWNN인지라, Drop out부터 별짓을 다해도 97%가 한계처럼 보였는데요

 

CNN은 기본뼈대만 돌려도 98%가 넘는 정확도를 보여주고 있습니다.

 

역시 한 세대의 획을 그은 네트워크 답습니다..

 

제가 진행하는 연구분야는 실험데이터 기반이기에 pooling이나 filtering이 필요하지 않을 뿐만아니라, 실수형 데이터들이기에 CNN은 잘사용하지 않고, 주로 RNN을 많이 사용하는데요

 

이미지 처리분야에서는 CNN은 독보적인 획을 그은 기술임에는 틀림 없는듯 합니다.

댓글