완전 연결 계층, Fully connected layer

(JY) Keras 사용해보기 1. What is keras? 케라스(Keras)는 텐서플로우 라이버러리 중 하나로, 딥러닝 모델 설계와 훈련을 위한 고수준 API이다. 사용자 친화적이고 모델의 구성이 쉽기 때문에 기본 이미지

dsbook.tistory.com

기존에는 완전 연결 계층을 이용해 이미지를 분류했었다. 완전 연결 계층이란 한 층(Layer)의 모든 뉴런이 다른 층(Layer)의 모든 뉴런과 연결되어 있는 형태로, 기본적으로 2차원의 흑백 이미지를 (컬러 이미지는 RGB의 채널이 들어가므로 3차원이다.) 1차원 배열로 평탄화시킨 후 연산 작업을 진행한다. 문제는 이 평탄화 작업이다. 이미지 데이터의 경우 인접한 픽셀들끼리의 명암 혹은 RGB채널의 픽셀 값은 관련이 많고, 멀리 떨어져 있는 픽셀들끼리는 서로 관련이 없는 등의 정보를 내포하고 있다. 하지만 평탄화, Flatten 작업을 통해 2차원(혹은 3차원) 배열을 1차원 배열로 펼치는 순간 이미지 데이터의 형상이 훼손된다. 이것이 왜 문제가 되느냐고 하면, 필기체 인식을 위해 28 * 28을 완전 연결 계층 (여기서는 Fully-connected multi-layered neural network로 보는 것이 맞다.)으로 학습시켰다고 하자. 이렇게 학습된 가중치 값들은 그 주변의 픽셀값들에 대한 정보가 없기 때문에, 글자의 크기가 달라지거나, 글자가 이동하거나 회전되거나, 혹은 변형이 조금만 생기더라도, 그리 좋은 결과를 기대하기가 어렵다. 즉, 글자의 형상을 전혀 고려하지 않는 방식이기 때문에 많은 학습데이터와 거기에 맞는 학습시간을 대가로 지불해야 한다. 이 문제를 해결하기 위한 방식으로 제시된 방법이 CNN이다.

 

CNN의 기본적인 모델 구성은 다음과 같다. FCL에서는 Affine계층과 활성화 함수로 구현됐지만, CNN에서는 합성곱 계층(Convolution Layer)과 풀링 계층 (Pooling Layer)이 추가 된다. (여기서 Affine계층은 순전파 과정에서 수행하는 뉴런에 가중치를 곱하고 편향을 더하는 계층, 즉 행렬의 내적이라고 생각하면 된다.)

밑바닥부터 시작하는 딥러닝

 

1. 라이브러리 및 데이터 셋 불러오기

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

 

2. 데이터 전처리

train_images = train_images / 255.0
test_images = test_images / 255.0
train_images = train_images.reshape([-1, 28, 28, 1])
test_images = test_images.reshape([-1, 28, 28, 1])

 

3. 모델 구성

model = keras.Sequential([
    keras.layers.Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), padding="SAME", activation=tf.nn.relu),
    keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding="SAME"),
    keras.layers.Conv2D(64, kernel_size=(3, 3), padding="SAME", activation=tf.nn.relu),
    keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding="SAME"),
    keras.layers.Flatten(),
    keras.layers.Dense(1024, activation="relu"),
    keras.layers.Dense(10, activation="softmax"),
    keras.layers.Dropout(0.25)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

 

4. 모델 훈련

tracking = model.fit(train_images, train_labels, epochs=5)

 

5. 정확도 평가

(test_loss, test_acc) = model.evaluate(test_images,  test_labels, verbose=2)
print('\n테스트 정확도:', test_acc)

def plt_show_acc(history):
    plt.plot(history.history['accuracy'])
    plt.title('Model accuracy')
    plt.ylabel('Accuracy')
    plt.xlabel('Epoch')
    plt.legend(['Train'], loc=0)
plt_show_acc(tracking)

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기