CNN이란 |
CNN 은 Convolution Neural Network의 약자로 이미지를 인식하는 분류기입니다.
CNN의 구조는 다음과 같습니다.
위의 이미지는 32*32의 이미지 데이터를 LeNet 모델로 처리하는 이미지입니다.
1) C1 레이어 : 32*32 이미지를 6개의 5*5 필터와 컨볼루션 연산을 이용해 6장의 28*28 특징맵을 만듭니다.
2) S2 레이어 : 6장의 28 * 28 특성 맵에 대해 서브샘플링을 진행한다. 결과적으로 28 * 28 사이즈의 특성맵이 14*14 사이즈의 특성맵으로 축소된다. 2*2 필터를 stride2로 설정해서 서브샘플링해주기 때문이다. 사용하는 서브샘플링 방법은 평균풀링(average pooling) 이다.
3) C3 레이어 : 6장의 14*14 특성맵에 6개의 5*5 필터와 컨볼루션 연산을 수행해서 16장의 10 * 10 특성맵을 산출해낸다.
4) S4 레이어 : 16장의 10*10 특성 맵에 대해서 서브샘플링을 이용해서 16장의 5 * 5 특성맵으로 축소
5) C5 레이어 : 16장의 5*5 특성맵을 120개 5 * 5 * 16 사이즈의 필터와 컨볼루션 해 준다.
6) F6 레이어 : 84개의 유닛을 가진 피드포워드 신경망이다. C5의 결과에서 84개의 특성을 추출한다.
7) 아웃풋 레이어 : 84개의 유닛으로 인풋을 받은 후 10개의 Euclidean radial basis function(RBF) 유닛을 출력한다
이러한 CNN 구조를 살펴 보면 너무 어려워 보이네요~
이번 CNN 실습과정에서는 최종 목표가 위의 구조를 이해하고 실습하는 데 의의를 두겠습니다.
그렇다면 위의 구조를 이해하기 위해 차례대로 접근을 해 봅시다.
이미지 분류(CNN)은 어떻게 하는 것일까요?
위의 이미지는 강아지와 한소년입니다.
과거 컴퓨터 과학자들은 컴퓨터에게 위의 이미지를 컴퓨터에게 강아지와 소년이 있다는 정보를 알려 주고 싶었습니다.
하지만 컴퓨터에게 이러한 방법을 알려 주는 것은 너무 어려운 일이었죠.
2012년 Hinton 교수가 이미지분류기 AlexNet을 발표하기 전까지는 말이죠~
이러한 이미지분류기를 알아보기 전에 이미지 데이터의 생김새를 살펴 봅시다.
이미지 데이터셋 |
일반적으로 CNN 데이터를 다룰때 이 두가지 이미지셋을 가장 많이 활용하는것 같네요~
위의 이미지는 0부터 9 까지의 손글씨 이미지를 분류할수 있는 MNIST 데이터셋이며 28*28 픽셀의 손글씨 숫자 이미지 60000장으로 이루어져 있습니다.
아래 이미지는 32*32 픽셀의 50000장의 사진이 준비 되어 있으며 10개의 분류모델입니다. 단 이때 32*32픽셀의 이미지는 칼러 이미지입니다.
MNIST 이미지 확인하기 |
위와 같은 흑백 이미지의 데이터는 다음과 같은 형태의 숫자 모음으로 표현 됩니다.
검은색 부분은 0 흰색부분은 255에 가까운 숫자로 표현이 됩니다.
위의 이미지는 28 * 28 크기의 행렬로 이루어져 있습니다.
이 데이터는 28 * 28 = 784개의 데이터를 가지고 있는 2차원 형태의 데이터로 표현 됩니다.
이러한 데이터가 60000장이 준비 되어 있으므로 60000 * 28 * 28 의 데이터셋이 됩니다.
CIFA10 이미지 확인하기 |
위와 같은 칼러 이미지는 다음과 같은 데이터로 표현 됩니다.
데이터 이미지는 16진수로 표현 되어 있으며 한 픽셀은 R/G/B 의 3가지 형태로 표현 되어 있습니다. 0000FF 의 의미는 R:0, G:0, B:255 를 의미하며 한 픽셀 데이터가 3개의 데이터를 포함합니다.
따라서 이러한 이미지는 한개의 이미지를 표현하기 위해서는 32 * 32 * 3 = 3072 의 데이터로 표현 될수 있는 3차원 데이터가 됩니다.
이런 데이터가 50000장 준비되어 있다면 50000 * 32 * 32 * 3 형태의 데이터셋이 됩니다.
텐서플로우에서 제공해 주는 이미지데이터를 가지고 살펴 보겠습니다.
http://tensorflow.org/api_docs/python/tf/keras/datasets
Module: tf.keras.datasets | TensorFlow Core v2.7.0
Public API for tf.keras.datasets namespace.
www.tensorflow.org
텐서플로우의 데이터셋을 보면 위와 같이 준비 되어 있습니다.
여기서 우리는 cifar10/mnist 데이터를 살펴 보도록 하겠습니다.
데이터 준비하기 |
- MNIST
import tensorflow as tf
#MNIST
(mnist_x, mnist_y), _ = tf.keras.datasets.mnist.load_data() #여기서 _ 는 사용하지 않는 값을 받아서 버림
print(mnist_x.shape, mnist_y.shape)
MNIST 데이터를 로딩해서 모양을 살펴 보면 독립 변수가 60000 * 28 * 28 인 것을 알 수 있습니다.
- CIFAR10
import tensorflow as tf
#CIFA10
(cifar_x, cifar_y), _ = tf.keras.datasets.cifar10.load_data()
print(cifar_x.shape, cifar_y.shape)
CIFAR10 데이터는 50000 * 32 * 32 * 3 인 것을 알 수 있습니다.
화면에 이미지 출력해 보기 |
print(mnist_y[0:10])
import matplotlib.pyplot as plt
plt.imshow(mnist_x[4], cmap='gray')
10개의 결과를 보면 4번째 데이터의 값은 9 이고 4번째 이미지를 출력 해 보면 위와 같다.
print(cifar_y[0:10])
import matplotlib.pyplot as plt
import numpy as np
plt.imshow(cifar_x[0])
10개의 종속데이터를 살펴 보면 0번째 데이터는 6(frog)를 의미하며 이미지를 출력해 보면 위와 같은 것을 알 수 있습니다.
이 데이터로 다음시간 부터 CNN 데이터 실습을 진행해 보도록 하겠습니다.
<출처>
'강의자료 > 머신러닝' 카테고리의 다른 글
[딥러닝실습] 이미지 분류(CNN) II-Flatten을 이용한 딥러닝 학습 (8) | 2022.09.16 |
---|---|
[딥러닝실습] 이미지 분류(CNN) II-Conv2D을 이용한 딥러닝 학습 (7) | 2022.09.01 |
[딥러닝실습] pandas와 tensorflow를 이용한 보스턴 집값 예측 (11) | 2022.08.12 |
[딥러닝실습] 히든레이어 생성 실습 (13) | 2022.08.05 |
[딥러닝실습] pandas와 tensorflow를 이용한 아이리스 품종 분류 (5) | 2022.07.12 |