라이브러리 import & data set 받아오기
▪ 먼저 필요한 라이브러리를 import 해주도록 합니다.
import numpy as np
from keras import datasets
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
▪ 이미지 분류를 위한 데이터를 load 해줍니다.
▪ 데이터는 패션 MNIST 데이터셋을 사용했습니다.
▪ 패션 MNIST는 10개의 범주와 70,000개의 흑백 이미지로 구성되어 있으며, 이미지는 해상도는 28x28입니다.
fashion_mnist = datasets.fashion_mnist
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
▪ 데이터에 대한 자세한 설명은 아래에서 확인할 수 있습니다.
GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark
A MNIST-like fashion product database. Benchmark :point_down: - GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark
github.com
데이터 탐색
▪ 데이터를 확인해보면 train 데이터는 6만개, test 데이터는 1만개로 구성되어 있습니다. 또한 이미지가 28x28 픽셀로 표현된 것을 확인할 수 있습니다.
▪ x_train의 개별 데이터를 확인해보면, 2차원 array로 표현되어 있고 array의 픽셀 값은 0~255 사이의 값 가집니다.
▪ 픽셀 값은 명암비를 나타내며, 0에 가까울 경우 어두운 음영을 나타내고 1에 가까울 경우는 밝은 음영을 나타냅니다.
데이터 전처리
▪ 0~255 사이인 픽셀 값의 범위를 0~1 사이로 조정합니다.
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
▪ 2차원 array의 이미지를 3차원 array 형태로 변환합니다.
▪ 해당 과정을 통해 input_shape을 (28,28)에서 (28,28,1)으로 변경할 수 있습니다.
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)
x_test = x_test.reshape(x_test.shape[0], x_test.shape[1], x_test.shape[2], 1)
▪ 클래스 레이블을 one-hot encoding 벡터로 변환합니다.
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
▪ 데이터 전처리 후 변환된 데이터 shape은 다음과 같습니다.
모델구성
▪ Convolution Layer와 Dense Layer로 구성된 모델을 생성합니다.
▪ 과적합 방지를 위해 중간에 Dropout 계층도 추가합니다.
input_shape = (28, 28, 1)
num_classes = 10
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'])
▪ 생성된 모델은 다음과 같습니다.
모델 훈련 및 평가
▪ batch_size는 128, epochs은 12로 설정하여 모델을 훈련합니다.
hist = model.fit(x_train, y_train, batch_size=128, epochs=12, verbose=1, validation_data=(x_test, y_test))
▪ Train, Test 데이터를 사용하여 모델을 평가합니다.
▪ 결과를 비교해보면 Test 데이터의 정확도가 Train 데이터의 정확도보다 조금 낮습니다. 하지만 92.64%로 꽤 준수한 성능을 보이는 것을 확인할 수 있습니다.
train_score = model.evaluate(x_train, y_train, verbose=0)
test_score = model.evaluate(x_test, y_test, verbose=0)
print('Train accuracy:', train_score[1])
print('Test accuracy:', test_score[1])
참고:
5.4.2. CNN(Convolutional Neural Network) | OneBook(Python & Deep Learning)
5.4.2. CNN(Convolutional Neural Network) CNN을 사용하여 Keras로 MNIST 손글씨 인식 예제를 풀어 봅니다. CNN (convolutional neural network)은 딥러닝은 한 종류로 주로 이미지를 인식하는데 사용됩니다. CNN은 이미지
sdc-james.gitbook.io
'ML & DL' 카테고리의 다른 글
[ML & DL] 다중회귀분석 실습하기 (0) | 2024.03.22 |
---|