Deep Learning day 6 CIFAR10 dataset

CIFAR10 Dataset 신경망으로 훈련

imports

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

from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Flatten, Dense
from tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout

데이터 적재

(train_images, train_labels), (test_images, test_labels) = cifar10.load_data()
print(train_images.shape, train_labels.shape)
print(test_images.shape, test_labels.shape)
print(train_images[0].shape)
(50000, 32, 32, 3) (50000, 1)
(10000, 32, 32, 3) (10000, 1)
(32, 32, 3)
class_names = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"]
train_labels[:10]
array([[6],
       [9],
       [9],
       [4],
       [1],
       [1],
       [2],
       [7],
       [8],
       [3]], dtype=uint8)

데이터 시각화

train_labels = np.int32(train_labels.flatten())
figure, axes = plt.subplots(figsize=(22, 10), nrows=3, ncols=8)

for i in range(3):
    for j in range(8):
        axes[i][j].imshow(train_images[(i*8)+j])
        axes[i][j].set_title(class_names[train_labels[(i*8)+j]])

데이터 전처리

train_images = np.array(train_images/255.0, dtype=np.float32)
train_labels = np.array(train_labels, dtype=np.float32)
test_images = np.array(test_images/255.0, dtype=np.float32)
test_labels = np.array(test_labels, dtype=np.float32)

train_oh_labels = to_categorical(train_labels)
test_oh_labels = to_categorical(test_labels)
test_oh_labels
array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 1., 0.],
       [0., 0., 0., ..., 0., 1., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 1., 0., 0.]], dtype=float32)

모델 생성

tf.keras.backend.clear_session()

input_tensor = Input(shape=(32, 32, 3))
x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same", activation="relu")(input_tensor)
x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same", activation="relu")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)

x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same", activation="relu")(x)
x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same", activation="relu")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
                 
x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same", activation="relu")(x)
x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same", activation="relu")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)                 
                 
x = Flatten()(x)
x = Dropout(rate=0.5)(x)                 
x = Dense(200, activation="relu")(x)
x = Dropout(rate=0.3)(x)
x = Dense(50, activation="relu")(x)
x = Dropout(rate=0.2)(x)
output = Dense(10, activation="softmax")(x)

model = Model(inputs=input_tensor, outputs=output)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 32, 32, 3)]       0         
_________________________________________________________________
conv2d (Conv2D)              (None, 32, 32, 32)        896       
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 32, 32, 32)        9248      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 16, 16, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 16, 16, 64)        18496     
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 16, 16, 64)        36928     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 8, 8, 64)          0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 8, 8, 128)         73856     
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 8, 8, 128)         147584    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 128)         0         
_________________________________________________________________
flatten (Flatten)            (None, 2048)              0         
_________________________________________________________________
dropout (Dropout)            (None, 2048)              0         
_________________________________________________________________
dense (Dense)                (None, 200)               409800    
_________________________________________________________________
dropout_1 (Dropout)          (None, 200)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 50)                10050     
_________________________________________________________________
dropout_2 (Dropout)          (None, 50)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                510       
=================================================================
Total params: 707,368
Trainable params: 707,368
Non-trainable params: 0
_________________________________________________________________

모델 컴파일

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

모델 학습


history = model.fit(x=train_images, y=train_oh_labels, batch_size=128, epochs=30, validation_split=0.2)
Epoch 1/30
313/313 [==============================] - 11s 32ms/step - loss: 1.9087 - accuracy: 0.2770 - val_loss: 1.4983 - val_accuracy: 0.4432
Epoch 2/30
313/313 [==============================] - 9s 30ms/step - loss: 1.4160 - accuracy: 0.4798 - val_loss: 1.2022 - val_accuracy: 0.5632
Epoch 3/30
313/313 [==============================] - 9s 30ms/step - loss: 1.2014 - accuracy: 0.5719 - val_loss: 1.0549 - val_accuracy: 0.6254
Epoch 4/30
313/313 [==============================] - 9s 30ms/step - loss: 1.0577 - accuracy: 0.6290 - val_loss: 0.9573 - val_accuracy: 0.6629
Epoch 5/30
313/313 [==============================] - 10s 31ms/step - loss: 0.9568 - accuracy: 0.6651 - val_loss: 0.8541 - val_accuracy: 0.6987
Epoch 6/30
313/313 [==============================] - 9s 30ms/step - loss: 0.8784 - accuracy: 0.6950 - val_loss: 0.8072 - val_accuracy: 0.7194
Epoch 7/30
313/313 [==============================] - 9s 30ms/step - loss: 0.8141 - accuracy: 0.7188 - val_loss: 0.7802 - val_accuracy: 0.7307
Epoch 8/30
313/313 [==============================] - 9s 30ms/step - loss: 0.7461 - accuracy: 0.7421 - val_loss: 0.7149 - val_accuracy: 0.7513
Epoch 9/30
313/313 [==============================] - 9s 30ms/step - loss: 0.6958 - accuracy: 0.7590 - val_loss: 0.7201 - val_accuracy: 0.7513
Epoch 10/30
313/313 [==============================] - 9s 30ms/step - loss: 0.6614 - accuracy: 0.7723 - val_loss: 0.7339 - val_accuracy: 0.7481
Epoch 11/30
313/313 [==============================] - 9s 30ms/step - loss: 0.6139 - accuracy: 0.7875 - val_loss: 0.6798 - val_accuracy: 0.7676
Epoch 12/30
313/313 [==============================] - 9s 30ms/step - loss: 0.5765 - accuracy: 0.8024 - val_loss: 0.6607 - val_accuracy: 0.7783
Epoch 13/30
313/313 [==============================] - 9s 30ms/step - loss: 0.5489 - accuracy: 0.8124 - val_loss: 0.6993 - val_accuracy: 0.7672
Epoch 14/30
313/313 [==============================] - 10s 32ms/step - loss: 0.5113 - accuracy: 0.8245 - val_loss: 0.6425 - val_accuracy: 0.7851
Epoch 15/30
313/313 [==============================] - 10s 30ms/step - loss: 0.4910 - accuracy: 0.8322 - val_loss: 0.7364 - val_accuracy: 0.7622
Epoch 16/30
313/313 [==============================] - 9s 30ms/step - loss: 0.4602 - accuracy: 0.8428 - val_loss: 0.6380 - val_accuracy: 0.7954
Epoch 17/30
313/313 [==============================] - 9s 30ms/step - loss: 0.4276 - accuracy: 0.8528 - val_loss: 0.6542 - val_accuracy: 0.7889
Epoch 18/30
313/313 [==============================] - 9s 30ms/step - loss: 0.4184 - accuracy: 0.8555 - val_loss: 0.6261 - val_accuracy: 0.7980
Epoch 19/30
313/313 [==============================] - 9s 30ms/step - loss: 0.4035 - accuracy: 0.8616 - val_loss: 0.6297 - val_accuracy: 0.7985
Epoch 20/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3766 - accuracy: 0.8693 - val_loss: 0.6393 - val_accuracy: 0.7939
Epoch 21/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3590 - accuracy: 0.8759 - val_loss: 0.6450 - val_accuracy: 0.7964
Epoch 22/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3507 - accuracy: 0.8795 - val_loss: 0.6745 - val_accuracy: 0.7956
Epoch 23/30
313/313 [==============================] - 10s 31ms/step - loss: 0.3327 - accuracy: 0.8847 - val_loss: 0.6545 - val_accuracy: 0.7930
Epoch 24/30
313/313 [==============================] - 10s 30ms/step - loss: 0.3212 - accuracy: 0.8893 - val_loss: 0.6279 - val_accuracy: 0.8035
Epoch 25/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3073 - accuracy: 0.8939 - val_loss: 0.6719 - val_accuracy: 0.8000
Epoch 26/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3010 - accuracy: 0.8949 - val_loss: 0.6946 - val_accuracy: 0.7978
Epoch 27/30
313/313 [==============================] - 10s 30ms/step - loss: 0.2804 - accuracy: 0.9034 - val_loss: 0.6781 - val_accuracy: 0.8019
Epoch 28/30
313/313 [==============================] - 10s 31ms/step - loss: 0.2773 - accuracy: 0.9046 - val_loss: 0.7195 - val_accuracy: 0.8019
Epoch 29/30
313/313 [==============================] - 9s 30ms/step - loss: 0.2677 - accuracy: 0.9075 - val_loss: 0.6884 - val_accuracy: 0.8010
Epoch 30/30
313/313 [==============================] - 10s 31ms/step - loss: 0.2591 - accuracy: 0.9115 - val_loss: 0.6862 - val_accuracy: 0.8023
plt.plot(history.history["accuracy"], label="train")
plt.plot(history.history["val_accuracy"], label="valid")
plt.legend()
<matplotlib.legend.Legend at 0x7f9ae0df8e50>

테스트 데이터에서 검증

predict_proba = model.predict(np.reshape(test_images[0], (-1, 32, 32, 3)))
predict = np.argmax(predict_proba, axis=1)
predict
array([3])
plt.imshow(test_images[0])
<matplotlib.image.AxesImage at 0x7f9ae0dac210>

test_labels[0]
array([3.], dtype=float32)
model.evaluate(test_images, test_oh_labels, batch_size=128, verbose=1)
79/79 [==============================] - 1s 11ms/step - loss: 0.7197 - accuracy: 0.7978





[0.7196638584136963, 0.7978000044822693]

가중치 초기값 변경

tf.keras.backend.clear_session()

input_tensor = Input(shape=(32, 32, 3))
x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same", activation="relu", kernel_initializer="he_normal")(input_tensor)
x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same", activation="relu", kernel_initializer="he_normal")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)

x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same", activation="relu", kernel_initializer="he_normal")(x)
x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same", activation="relu", kernel_initializer="he_normal")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
                 
x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same", activation="relu", kernel_initializer="he_normal")(x)
x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same", activation="relu", kernel_initializer="he_normal")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)                 
                 
x = Flatten()(x)
x = Dropout(rate=0.5)(x)                 
x = Dense(200, activation="relu")(x)
x = Dropout(rate=0.3)(x)
x = Dense(50, activation="relu")(x)
x = Dropout(rate=0.2)(x)
output = Dense(10, activation="softmax")(x)

model = Model(inputs=input_tensor, outputs=output)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 32, 32, 3)]       0         
_________________________________________________________________
conv2d (Conv2D)              (None, 32, 32, 32)        896       
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 32, 32, 32)        9248      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 16, 16, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 16, 16, 64)        18496     
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 16, 16, 64)        36928     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 8, 8, 64)          0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 8, 8, 128)         73856     
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 8, 8, 128)         147584    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 128)         0         
_________________________________________________________________
flatten (Flatten)            (None, 2048)              0         
_________________________________________________________________
dropout (Dropout)            (None, 2048)              0         
_________________________________________________________________
dense (Dense)                (None, 200)               409800    
_________________________________________________________________
dropout_1 (Dropout)          (None, 200)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 50)                10050     
_________________________________________________________________
dropout_2 (Dropout)          (None, 50)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                510       
=================================================================
Total params: 707,368
Trainable params: 707,368
Non-trainable params: 0
_________________________________________________________________
model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x=train_images, y=train_oh_labels, batch_size=128, epochs=30, validation_split=0.2)
Epoch 1/30
313/313 [==============================] - 11s 32ms/step - loss: 1.8403 - accuracy: 0.3065 - val_loss: 1.4132 - val_accuracy: 0.4829
Epoch 2/30
313/313 [==============================] - 9s 30ms/step - loss: 1.4063 - accuracy: 0.4919 - val_loss: 1.2038 - val_accuracy: 0.5701
Epoch 3/30
313/313 [==============================] - 9s 30ms/step - loss: 1.1785 - accuracy: 0.5845 - val_loss: 1.0589 - val_accuracy: 0.6268
Epoch 4/30
313/313 [==============================] - 9s 30ms/step - loss: 1.0295 - accuracy: 0.6410 - val_loss: 0.9414 - val_accuracy: 0.6683
Epoch 5/30
313/313 [==============================] - 9s 30ms/step - loss: 0.9117 - accuracy: 0.6829 - val_loss: 0.8448 - val_accuracy: 0.7107
Epoch 6/30
313/313 [==============================] - 9s 30ms/step - loss: 0.8433 - accuracy: 0.7109 - val_loss: 0.8792 - val_accuracy: 0.6973
Epoch 7/30
313/313 [==============================] - 10s 31ms/step - loss: 0.7670 - accuracy: 0.7380 - val_loss: 0.7493 - val_accuracy: 0.7430
Epoch 8/30
313/313 [==============================] - 9s 30ms/step - loss: 0.6979 - accuracy: 0.7567 - val_loss: 0.7109 - val_accuracy: 0.7550
Epoch 9/30
313/313 [==============================] - 10s 31ms/step - loss: 0.6540 - accuracy: 0.7764 - val_loss: 0.6864 - val_accuracy: 0.7641
Epoch 10/30
313/313 [==============================] - 10s 30ms/step - loss: 0.5990 - accuracy: 0.7952 - val_loss: 0.6750 - val_accuracy: 0.7657
Epoch 11/30
313/313 [==============================] - 10s 30ms/step - loss: 0.5577 - accuracy: 0.8099 - val_loss: 0.6849 - val_accuracy: 0.7630
Epoch 12/30
313/313 [==============================] - 10s 30ms/step - loss: 0.5288 - accuracy: 0.8218 - val_loss: 0.6718 - val_accuracy: 0.7804
Epoch 13/30
313/313 [==============================] - 9s 30ms/step - loss: 0.4942 - accuracy: 0.8309 - val_loss: 0.6726 - val_accuracy: 0.7745
Epoch 14/30
313/313 [==============================] - 10s 30ms/step - loss: 0.4693 - accuracy: 0.8414 - val_loss: 0.6752 - val_accuracy: 0.7749
Epoch 15/30
313/313 [==============================] - 10s 30ms/step - loss: 0.4365 - accuracy: 0.8507 - val_loss: 0.6695 - val_accuracy: 0.7788
Epoch 16/30
313/313 [==============================] - 9s 30ms/step - loss: 0.4181 - accuracy: 0.8569 - val_loss: 0.6792 - val_accuracy: 0.7781
Epoch 17/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3955 - accuracy: 0.8632 - val_loss: 0.7364 - val_accuracy: 0.7673
Epoch 18/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3903 - accuracy: 0.8689 - val_loss: 0.6672 - val_accuracy: 0.7802
Epoch 19/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3647 - accuracy: 0.8745 - val_loss: 0.6990 - val_accuracy: 0.7800
Epoch 20/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3488 - accuracy: 0.8806 - val_loss: 0.7502 - val_accuracy: 0.7757
Epoch 21/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3362 - accuracy: 0.8840 - val_loss: 0.6876 - val_accuracy: 0.7888
Epoch 22/30
313/313 [==============================] - 10s 30ms/step - loss: 0.3133 - accuracy: 0.8920 - val_loss: 0.7081 - val_accuracy: 0.7875
Epoch 23/30
313/313 [==============================] - 9s 30ms/step - loss: 0.3051 - accuracy: 0.8943 - val_loss: 0.7303 - val_accuracy: 0.7876
Epoch 24/30
313/313 [==============================] - 10s 32ms/step - loss: 0.2936 - accuracy: 0.8997 - val_loss: 0.7193 - val_accuracy: 0.7934
Epoch 25/30
313/313 [==============================] - 10s 30ms/step - loss: 0.2889 - accuracy: 0.9007 - val_loss: 0.7848 - val_accuracy: 0.7791
Epoch 26/30
313/313 [==============================] - 9s 30ms/step - loss: 0.2695 - accuracy: 0.9067 - val_loss: 0.7226 - val_accuracy: 0.7931
Epoch 27/30
313/313 [==============================] - 10s 30ms/step - loss: 0.2662 - accuracy: 0.9097 - val_loss: 0.7159 - val_accuracy: 0.7929
Epoch 28/30
313/313 [==============================] - 10s 32ms/step - loss: 0.2661 - accuracy: 0.9086 - val_loss: 0.7222 - val_accuracy: 0.7909
Epoch 29/30
313/313 [==============================] - 9s 30ms/step - loss: 0.2449 - accuracy: 0.9157 - val_loss: 0.7850 - val_accuracy: 0.7898
Epoch 30/30
313/313 [==============================] - 9s 30ms/step - loss: 0.2379 - accuracy: 0.9197 - val_loss: 0.7689 - val_accuracy: 0.7903
model.evaluate(test_images, test_oh_labels, batch_size=128, verbose=1)
79/79 [==============================] - 1s 11ms/step - loss: 0.8091 - accuracy: 0.7825





[0.8090916872024536, 0.7825000286102295]

배치 정규화

from tensorflow.keras.layers import BatchNormalization, Activation
tf.keras.backend.clear_session()

input_tensor = Input(shape=(32, 32, 3))
x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same")(input_tensor)
x = BatchNormalization()(x)
x = Activation("relu")(x)
x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same")(x)
x = BatchNormalization()(x)
x = Activation("relu")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)

x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same")(x)
x = BatchNormalization()(x)
x = Activation("relu")(x)
x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same")(x)
x = BatchNormalization()(x)
x = Activation("relu")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
                 
x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same")(x)
x = BatchNormalization()(x)
x = Activation("relu")(x)
x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same")(x)
x = BatchNormalization()(x)
x = Activation("relu")(x)
x = MaxPooling2D(pool_size=(2, 2))(x)                 
                 
x = Flatten()(x)
x = Dropout(rate=0.5)(x)                 
x = Dense(300, activation="relu")(x)
x = Dropout(rate=0.3)(x)
output = Dense(10, activation="softmax")(x)

model = Model(inputs=input_tensor, outputs=output)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 32, 32, 3)]       0         
_________________________________________________________________
conv2d (Conv2D)              (None, 32, 32, 32)        896       
_________________________________________________________________
batch_normalization (BatchNo (None, 32, 32, 32)        128       
_________________________________________________________________
activation (Activation)      (None, 32, 32, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 32, 32, 32)        9248      
_________________________________________________________________
batch_normalization_1 (Batch (None, 32, 32, 32)        128       
_________________________________________________________________
activation_1 (Activation)    (None, 32, 32, 32)        0         
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 16, 16, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 16, 16, 64)        18496     
_________________________________________________________________
batch_normalization_2 (Batch (None, 16, 16, 64)        256       
_________________________________________________________________
activation_2 (Activation)    (None, 16, 16, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 16, 16, 64)        36928     
_________________________________________________________________
batch_normalization_3 (Batch (None, 16, 16, 64)        256       
_________________________________________________________________
activation_3 (Activation)    (None, 16, 16, 64)        0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 8, 8, 64)          0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 8, 8, 128)         73856     
_________________________________________________________________
batch_normalization_4 (Batch (None, 8, 8, 128)         512       
_________________________________________________________________
activation_4 (Activation)    (None, 8, 8, 128)         0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 8, 8, 128)         147584    
_________________________________________________________________
batch_normalization_5 (Batch (None, 8, 8, 128)         512       
_________________________________________________________________
activation_5 (Activation)    (None, 8, 8, 128)         0         
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 128)         0         
_________________________________________________________________
flatten (Flatten)            (None, 2048)              0         
_________________________________________________________________
dropout (Dropout)            (None, 2048)              0         
_________________________________________________________________
dense (Dense)                (None, 300)               614700    
_________________________________________________________________
dropout_1 (Dropout)          (None, 300)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                3010      
=================================================================
Total params: 906,510
Trainable params: 905,614
Non-trainable params: 896
_________________________________________________________________
model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x=train_images, y=train_oh_labels, batch_size=128, epochs=30, validation_split=0.2)
Epoch 1/30
313/313 [==============================] - 14s 39ms/step - loss: 1.6105 - accuracy: 0.4159 - val_loss: 2.9750 - val_accuracy: 0.1465
Epoch 2/30
313/313 [==============================] - 12s 37ms/step - loss: 1.1642 - accuracy: 0.5789 - val_loss: 1.0970 - val_accuracy: 0.5765
Epoch 3/30
313/313 [==============================] - 12s 37ms/step - loss: 0.9592 - accuracy: 0.6574 - val_loss: 1.2005 - val_accuracy: 0.5742
Epoch 4/30
313/313 [==============================] - 12s 37ms/step - loss: 0.8449 - accuracy: 0.7022 - val_loss: 1.0042 - val_accuracy: 0.6422
Epoch 5/30
313/313 [==============================] - 12s 37ms/step - loss: 0.7575 - accuracy: 0.7351 - val_loss: 1.0693 - val_accuracy: 0.6431
Epoch 6/30
313/313 [==============================] - 12s 37ms/step - loss: 0.6895 - accuracy: 0.7605 - val_loss: 0.8978 - val_accuracy: 0.6875
Epoch 7/30
313/313 [==============================] - 12s 38ms/step - loss: 0.6378 - accuracy: 0.7757 - val_loss: 1.2824 - val_accuracy: 0.6142
Epoch 8/30
313/313 [==============================] - 12s 38ms/step - loss: 0.5819 - accuracy: 0.7974 - val_loss: 0.8324 - val_accuracy: 0.7240
Epoch 9/30
313/313 [==============================] - 12s 37ms/step - loss: 0.5442 - accuracy: 0.8098 - val_loss: 0.8925 - val_accuracy: 0.7176
Epoch 10/30
313/313 [==============================] - 12s 37ms/step - loss: 0.5006 - accuracy: 0.8249 - val_loss: 0.7420 - val_accuracy: 0.7654
Epoch 11/30
313/313 [==============================] - 12s 37ms/step - loss: 0.4604 - accuracy: 0.8396 - val_loss: 0.6349 - val_accuracy: 0.7918
Epoch 12/30
313/313 [==============================] - 12s 37ms/step - loss: 0.4252 - accuracy: 0.8509 - val_loss: 0.7158 - val_accuracy: 0.7739
Epoch 13/30
313/313 [==============================] - 12s 37ms/step - loss: 0.4076 - accuracy: 0.8584 - val_loss: 0.8330 - val_accuracy: 0.7333
Epoch 14/30
313/313 [==============================] - 12s 37ms/step - loss: 0.3686 - accuracy: 0.8722 - val_loss: 0.7000 - val_accuracy: 0.7772
Epoch 15/30
313/313 [==============================] - 12s 37ms/step - loss: 0.3436 - accuracy: 0.8792 - val_loss: 0.7324 - val_accuracy: 0.7727
Epoch 16/30
313/313 [==============================] - 12s 37ms/step - loss: 0.3206 - accuracy: 0.8875 - val_loss: 1.2061 - val_accuracy: 0.6999
Epoch 17/30
313/313 [==============================] - 12s 37ms/step - loss: 0.2930 - accuracy: 0.8958 - val_loss: 0.6910 - val_accuracy: 0.7955
Epoch 18/30
313/313 [==============================] - 12s 37ms/step - loss: 0.2788 - accuracy: 0.9032 - val_loss: 0.7061 - val_accuracy: 0.7832
Epoch 19/30
313/313 [==============================] - 12s 37ms/step - loss: 0.2564 - accuracy: 0.9090 - val_loss: 1.1572 - val_accuracy: 0.7175
Epoch 20/30
313/313 [==============================] - 12s 37ms/step - loss: 0.2392 - accuracy: 0.9158 - val_loss: 0.9247 - val_accuracy: 0.7535
Epoch 21/30
313/313 [==============================] - 12s 37ms/step - loss: 0.2249 - accuracy: 0.9207 - val_loss: 0.8108 - val_accuracy: 0.7743
Epoch 22/30
313/313 [==============================] - 12s 37ms/step - loss: 0.2063 - accuracy: 0.9278 - val_loss: 0.9563 - val_accuracy: 0.7654
Epoch 23/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1975 - accuracy: 0.9311 - val_loss: 0.8656 - val_accuracy: 0.7689
Epoch 24/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1940 - accuracy: 0.9319 - val_loss: 0.7286 - val_accuracy: 0.8028
Epoch 25/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1781 - accuracy: 0.9383 - val_loss: 0.7599 - val_accuracy: 0.7898
Epoch 26/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1704 - accuracy: 0.9406 - val_loss: 0.6863 - val_accuracy: 0.8129
Epoch 27/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1561 - accuracy: 0.9452 - val_loss: 0.7988 - val_accuracy: 0.8024
Epoch 28/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1520 - accuracy: 0.9467 - val_loss: 0.6781 - val_accuracy: 0.8214
Epoch 29/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1457 - accuracy: 0.9481 - val_loss: 0.7715 - val_accuracy: 0.8109
Epoch 30/30
313/313 [==============================] - 12s 37ms/step - loss: 0.1368 - accuracy: 0.9533 - val_loss: 0.7608 - val_accuracy: 0.8065
model.evaluate(test_images, test_oh_labels, batch_size=128, verbose=1)
79/79 [==============================] - 1s 14ms/step - loss: 0.7914 - accuracy: 0.7936





[0.7913919687271118, 0.7936000227928162]

Batch 사이즈 조정

def build_model():
  tf.keras.backend.clear_session()

  input_tensor = Input(shape=(32, 32, 3))
  x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same")(input_tensor)
  x = BatchNormalization()(x)
  x = Activation("relu")(x)
  x = Conv2D(filters=32, kernel_size=(3, 3), strides=1, padding="same")(x)
  x = BatchNormalization()(x)
  x = Activation("relu")(x)
  x = MaxPooling2D(pool_size=(2, 2))(x)

  x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same")(x)
  x = BatchNormalization()(x)
  x = Activation("relu")(x)
  x = Conv2D(filters=64, kernel_size=(3, 3), strides=1, padding="same")(x)
  x = BatchNormalization()(x)
  x = Activation("relu")(x)
  x = MaxPooling2D(pool_size=(2, 2))(x)
                  
  x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same")(x)
  x = BatchNormalization()(x)
  x = Activation("relu")(x)
  x = Conv2D(filters=128, kernel_size=(3, 3), strides=1, padding="same")(x)
  x = BatchNormalization()(x)
  x = Activation("relu")(x)
  x = MaxPooling2D(pool_size=(2, 2))(x)                 
                  
  x = Flatten()(x)
  x = Dropout(rate=0.5)(x)                 
  x = Dense(300, activation="relu")(x)
  x = Dropout(rate=0.3)(x)
  x = Dense(100, activation="relu")(x)
  x = Dropout(rate=0.3)(x)
  output = Dense(10, activation="softmax")(x)

  model = Model(inputs=input_tensor, outputs=output)
  return model
batch_sizes = [32, 64, 256]
for batch_size in batch_sizes:
  model = build_model()
  model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])
  history = model.fit(x=train_images, y=train_oh_labels, batch_size=batch_size, epochs=30, validation_split=0.2)
  evaluate_accuracy = model.evaluate(test_images, test_oh_labels, batch_size=batch_size, verbose=1)
  print("Result : ", batch_size, evaluate_accuracy)
Epoch 1/30
1250/1250 [==============================] - 30s 23ms/step - loss: 1.6864 - accuracy: 0.3785 - val_loss: 1.5436 - val_accuracy: 0.4659
Epoch 2/30
1250/1250 [==============================] - 27s 22ms/step - loss: 1.2102 - accuracy: 0.5764 - val_loss: 1.1430 - val_accuracy: 0.6124
Epoch 3/30
1250/1250 [==============================] - 27s 22ms/step - loss: 0.9976 - accuracy: 0.6607 - val_loss: 0.9220 - val_accuracy: 0.6806
Epoch 4/30
1250/1250 [==============================] - 28s 22ms/step - loss: 0.8792 - accuracy: 0.7012 - val_loss: 1.2399 - val_accuracy: 0.5738
Epoch 5/30
1250/1250 [==============================] - 27s 22ms/step - loss: 0.7927 - accuracy: 0.7325 - val_loss: 1.6327 - val_accuracy: 0.5535
Epoch 6/30
1250/1250 [==============================] - 27s 21ms/step - loss: 0.7212 - accuracy: 0.7582 - val_loss: 0.7357 - val_accuracy: 0.7530
Epoch 7/30
1250/1250 [==============================] - 27s 22ms/step - loss: 0.6593 - accuracy: 0.7785 - val_loss: 0.7298 - val_accuracy: 0.7539
Epoch 8/30
1250/1250 [==============================] - 27s 21ms/step - loss: 0.6143 - accuracy: 0.7952 - val_loss: 0.6861 - val_accuracy: 0.7689
Epoch 9/30
1250/1250 [==============================] - 27s 21ms/step - loss: 0.5611 - accuracy: 0.8133 - val_loss: 0.6285 - val_accuracy: 0.7904
Epoch 10/30
1250/1250 [==============================] - 26s 21ms/step - loss: 0.5289 - accuracy: 0.8229 - val_loss: 0.6703 - val_accuracy: 0.7769
Epoch 11/30
1219/1250 [============================>.] - ETA: 0s - loss: 0.4961 - accuracy: 0.8354

좋은 웹페이지 즐겨찾기