SW/Python

Python : Keras : CIFAR10 : 예제, 실습, 사용법

얇은생각 2020. 2. 8. 07:30
반응형
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from keras.layers import *
from keras.models import *
from keras.utils import *
from sklearn.preprocessing import *
import seaborn as sns

 

먼저 필요한 라이브러리들을 임포트 합니다.

 

 

 

from keras.datasets import cifar10

(X_train, Y_train) , (X_test, Y_test) = cifar10.load_data()

X_train.shape

fig = plt.figure(figsize=(20,5))

for i in range(36):
    ax = fig.add_subplot(3, 12, i+1, xticks=[], yticks=[])
    ax.imshow(X_train[i])

 

cifar 10 data

 

사용할 데이터를 로드하고, 어떠한 데이터인지 확인합니다. 위와 같은 데이터들이라는 것을 확인할 수 있습니다.

 

 

 

X_train = X_train/255.0
X_test = X_test /255.0

 

데이터를 정규화합니다.

 

 

 

Y_train = to_categorical(Y_train)
Y_test = to_categorical(Y_test)

 

출력 데이터는 다음과 같이 전처리합니다.

 

 

 

model = Sequential()
model.add(Conv2D(filters=16, kernel_size=4, padding='same', strides=1, activation='relu', input_shape=(32,32,3)))
model.add(MaxPool2D(pool_size=2))
model.add(Conv2D(filters=32, kernel_size=4, padding='same', strides=1, activation='relu'))
model.add(MaxPool2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=4, padding='same', strides=1, activation='relu'))
model.add(MaxPool2D(pool_size=2))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()

"""
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 32, 32, 16)        784       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 16, 16, 16)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 16, 16, 32)        8224      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 8, 8, 32)          0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 8, 8, 64)          32832     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 64)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 1024)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 512)               524800    
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 571,770
Trainable params: 571,770
Non-trainable params: 0
_________________________________________________________________
"""

 

간단한 모델을 구현하였습니다.

 

 

 

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

 

모델 컴파일을 진행합니다.

 

 

 

model.fit(X_train, Y_train, batch_size=150, epochs=1, validation_split=0.1)

"""
Train on 45000 samples, validate on 5000 samples
Epoch 1/1
45000/45000 [==============================] - 11s 248us/step - loss: 1.6029 - acc: 0.4202 - val_loss: 1.3092 - val_acc: 0.5284
"""

 

훈련을 진행합니다.

 

 

 

score = model.evaluate(X_test, Y_test)
print(score)

"""
10000/10000 [==============================] - 1s 78us/step
[1.3261255556106568, 0.5187]
"""

 

모델 평가를 진행합니다.

 

 

pred = model.predict(X_test)
label = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

fig = plt.figure(figsize=(20,10))

for i, idx in enumerate(np.random.choice(X_test.shape[0], size=32)):
    ax = fig.add_subplot(4,8, i+1 , xticks=[], yticks=[])
    ax.imshow(X_test[i])
    
    pred_idx = np.argmax(pred[idx])
    true_idx = np.argmax(Y_test[idx])
    
    ax.set_title("{}_{}".format(label[pred_idx], label[true_idx]), color='green' if pred_idx == true_idx else 'red')

 

cifar 10 예측 결과

 

입력 데이터에 따라, 어떻게 예측을 했는 지에 대해 확인할 수 있습니다. 다양한 모델을 가지고 훈련을 진행해보고 결과를 위와 같이 확인해볼 수 있습니다. 이러한 방식으로 표현을 하면, 어떤한 데이터가 어떻게 예측을 했는 지, 유추해볼 수 있습니다.

반응형