Skip to content

Latest commit

Β 

History

History
117 lines (79 loc) Β· 5.53 KB

File metadata and controls

117 lines (79 loc) Β· 5.53 KB

5.4.2. CNN(Convolutional Neural Network)

CNN을 μ‚¬μš©ν•˜μ—¬ Keras둜 MNIST 손글씨 인식 예제λ₯Ό ν’€μ–΄ λ΄…λ‹ˆλ‹€. CNN (convolutional neural network)은 λ”₯λŸ¬λ‹μ€ ν•œ μ’…λ₯˜λ‘œ 주둜 이미지λ₯Ό μΈμ‹ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€.

CNN은 μ΄λ―Έμ§€μ—μ„œ 객체, μ–Όκ΅΄, μž₯면을 μΈμ‹ν•˜κΈ° μœ„ν•΄ νŒ¨ν„΄μ„ μ°ΎλŠ” 데 특히 μœ μš©ν•©λ‹ˆλ‹€. CNN은 λ°μ΄ν„°μ—μ„œ 직접 ν•™μŠ΅ν•˜λ©°, νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ 이미지λ₯Ό λΆ„λ₯˜ν•˜κ³  νŠΉμ§•μ„ μˆ˜λ™μœΌλ‘œ μΆ”μΆœν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

자율 μ£Όν–‰ μžλ™μ°¨, μ–Όκ΅΄ 인식 μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό 같이 객체 인식과 컴퓨터 비전이 ν•„μš”ν•œ λΆ„μ•Όμ—μ„œ CNN을 많이 μ‚¬μš©ν•©λ‹ˆλ‹€. μ‘μš© 뢄야에 따라 CNN을 μ²˜μŒλΆ€ν„° λ§Œλ“€ μˆ˜λ„ 있고, λ°μ΄ν„°μ…‹μœΌλ‘œ 사전 ν•™μŠ΅λœ λͺ¨λΈμ„ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

CNN은 이미지 인식과 νŒ¨ν„΄ 감지λ₯Ό μœ„ν•œ 졜적의 μ•„ν‚€ν…μ²˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. CNN은 λ°œμ „μ„ κ±°λ“­ν•΄ 온 GPU와 병렬 μ»΄ν“¨νŒ…κ³Ό ν•¨κ»˜ ν™œμš©λ˜μ–΄ 자율 μ£Όν–‰κ³Ό μ–Όκ΅΄ 인식 기술이 μƒˆλ‘­κ²Œ λ“±μž₯ν•˜λŠ” λ°œνŒμ„ λ§ˆλ ¨ν–ˆμŠ΅λ‹ˆλ‹€. μΌλ‘€λ‘œ λ”₯λŸ¬λ‹ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ CNN을 톡해 수천 개의 병리학 λ³΄κ³ μ„œλ₯Ό λΆ„μ„ν•˜μ—¬ 암세포λ₯Ό μ‹œκ°μ μœΌλ‘œ κ²€μΆœν•©λ‹ˆλ‹€. 자율 μ£Όν–‰ μžλ™μ°¨κ°€ 객체λ₯Ό κ°μ§€ν•˜κ³  λ„λ‘œ ν‘œμ§€νŒκ³Ό λ³΄ν–‰μžμ˜ 차이λ₯Ό ꡬ뢄할 수 μžˆλŠ” 것도 λ°”λ‘œ CNN λ•λΆ„μž…λ‹ˆλ‹€.

CNN은 λ‹€λ₯Έ 신경망과 λ§ˆμ°¬κ°€μ§€λ‘œ μž…λ ₯ 계측, 좜λ ₯ 계측 및 두 계측 μ‚¬μ΄μ˜ μ—¬λŸ¬ 은닉 κ³„μΈ΅μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

각 계측은 ν•΄λ‹Ή λ°μ΄ν„°λ§Œμ΄ κ°–λŠ” νŠΉμ§•μ„ ν•™μŠ΅ν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό λ³€κ²½ν•˜λŠ” 계산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. κ°€μž₯ 자주 μ‚¬μš©λ˜λŠ” κ³„μΈ΅μœΌλ‘œλŠ” μ»¨λ²Œλ£¨μ…˜, ν™œμ„±ν™”/ReLU, 풀링이 μžˆμŠ΅λ‹ˆλ‹€.

μ»¨λ²Œλ£¨μ…˜μ€ 각 μ΄λ―Έμ§€μ—μ„œ νŠΉμ • νŠΉμ§•μ„ ν™œμ„±ν™”ν•˜λŠ” μ»¨λ²Œλ£¨μ…˜ ν•„ν„° 집합에 μž…λ ₯ 이미지λ₯Ό ν†΅κ³Όμ‹œν‚΅λ‹ˆλ‹€.

**ReLU(Rectified Linear Unit)**λŠ” 음수 값을 0에 λ§€ν•‘ν•˜κ³  μ–‘μˆ˜ 값을 μœ μ§€ν•˜μ—¬ 더 λΉ λ₯΄κ³  효과적인 ν•™μŠ΅μ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€. μ΄λ•Œ ν™œμ„±ν™”λœ νŠΉμ§•λ§Œ λ‹€μŒ κ³„μΈ΅μœΌλ‘œ μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— 이 과정을 ν™œμ„±ν™”λΌ λΆ€λ₯΄κΈ°λ„ ν•©λ‹ˆλ‹€.

풀링은 λΉ„μ„ ν˜• λ‹€μš΄μƒ˜ν”Œλ§μ„ μˆ˜ν–‰ν•˜κ³  λ„€νŠΈμ›Œν¬μ—μ„œ ν•™μŠ΅ν•΄μ•Ό ν•˜λŠ” 맀개 λ³€μˆ˜ 수λ₯Ό μ€„μ—¬μ„œ 좜λ ₯을 κ°„μ†Œν™”ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μž‘μ—…μ΄ μˆ˜μ‹­ 개 λ˜λŠ” 수백 개의 κ³„μΈ΅μ—μ„œ λ°˜λ³΅λ˜μ–΄ 각 계측이 μ—¬λŸ¬ νŠΉμ§•μ„ κ²€μΆœν•˜λŠ” 방법을 ν•™μŠ΅ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ—¬λŸ¬ 개의 μ»¨λ²Œλ£¨μ…˜ κ³„μΈ΅μœΌλ‘œ κ΅¬μ„±λœ λ„€νŠΈμ›Œν¬μ˜ 예. ν•„ν„°λŠ” 각 ν•™μŠ΅ 이미지에 μ„œλ‘œ λ‹€λ₯Έ ν•΄μƒλ„λ‘œ 적용되고, ν•„ν„°μ˜ 좜λ ₯은 λ‹€μŒ κ³„μΈ΅μ˜ μž…λ ₯으둜 ν™œμš©λ©λ‹ˆλ‹€.

Keras λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œ μˆœμ„œλ„ μœ„μ˜ CNNꡬ쑰와 일치 ν•©λ‹ˆλ‹€. μ§κ΄€μ μ΄μ–΄μ„œ 이해가 λΉ λ¦…λ‹ˆλ‹€.

 import sys
 import tensorflow as tf
 import keras
 from keras.models import Sequential
 from keras.layers import Dense, Dropout, Flatten
 from keras.layers.convolutional import Conv2D, MaxPooling2D
 import numpy as np

 img_rows = 28
 img_cols = 28

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

 input_shape = (img_rows, img_cols, 1)
 x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
 x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)

 x_train = x_train.astype('float32') / 255.
 x_test = x_test.astype('float32') / 255.

 print('x_train shape:', x_train.shape)
 print(x_train.shape[0], 'train samples')
 print(x_test.shape[0], 'test samples')

 batch_size = 128
 num_classes = 10
 epochs = 12  #μ—¬λŸ¬λ²ˆ ν•™μŠ΅ν•˜λ©΄ μ’‹κ² μ§€λ§Œ μ‹œκ°„κ΄€κ³„μƒ 3번만 ν•™μŠ΅ν•˜κ³  κ²°κ³Όλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

 y_train = keras.utils.to_categorical(y_train, num_classes)
 y_test = keras.utils.to_categorical(y_test, num_classes)

 model = Sequential()
 model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1), padding='same', activation='relu', input_shape=input_shape))
 model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
 model.add(Conv2D(64, (2, 2), activation='relu', padding='same'))
 model.add(MaxPooling2D(pool_size=(2, 2)))
 model.add(Dropout(0.25))
 model.add(Flatten())
 model.add(Dense(1000, activation='relu'))
 model.add(Dropout(0.5))
 model.add(Dense(num_classes, activation='softmax'))
 model.summary()

 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
 hist = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))

 score = model.evaluate(x_test, y_test, verbose=0)
 print('Test loss:', score[0])
 print('Test accuracy:', score[1])

60,000개 전체λ₯Ό 12번 ν•™μŠ΅ν•˜λŠ”λ° λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ©λ‹ˆλ‹€.

κ²°κ³ΌλŠ” 99.14% 정확도가 λ‚˜μ˜΅λ‹ˆλ‹€.

Test loss: 0.02729845507494465

Test accuracy: 0.9914

ν•™μŠ΅μ˜ κ²°κ³Όλ₯Ό 그림으둜 확인해 보고 μ‹Άλ‹€λ©΄ μœ„μ˜ μ½”λ“œ μ•„λž˜μ— λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. 16개의 ν•™μŠ΅ κ²°κ³Όλ₯Ό λΉ„κ΅ν•©λ‹ˆλ‹€.

 import random
 import matplotlib.pyplot as plt

 predicted_result = model.predict(x_test)
 predicted_labels = np.argmax(predicted_result, axis=1)

 test_labels = np.argmax(y_test, axis=1)

 count = 0

 plt.figure(figsize=(12,8))
 for n in range(16):
     count += 1
     plt.subplot(4, 4, count)
     plt.imshow(x_test[n].reshape(28, 28), cmap='Greys', interpolation='nearest')
     tmp = "Label:" + str(test_labels[n]) + ", Prediction:" + str(predicted_labels[n])
     plt.title(tmp)

 plt.tight_layout()
 plt.show()