- 드랍아웃은 보통 정확도에서 어느정도의 상승을 가져올수 있기 때문에, 요즘에는 필수적으로 구현하게 됩니다. 드랍아웃은 일부러 신경망을 끊기 때문에 오버피팅을 막을수 있지만, 때에 따라서는 정확도에 큰 상승이 없기도 합니다.
CIFAR10 이미지로 인식하는 딥러닝¶
- 이번에는 드롭아웃을 적용해서 정확도가 얼마나 상승하는지 살펴보겠습니다.
- 데이터는 기본적인 벤치마크셋인 CIFAR10 입니다.
- 보통 일반적인 방법으로 90%정도를 도달할수 있고, 현존하는 벤치마크 99%까지 가능합니다.
In [56]:
from keras import backend
from keras.datasets import cifar10
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.optimizers import SGD, Adam, RMSprop
import numpy as np
import matplotlib.pyplot as plt
In [32]:
backend.set_image_dim_ordering("tf")
데이터셋 로드¶
In [33]:
(train_x, train_y), (test_x, test_y) = cifar10.load_data()
In [57]:
fig = plt.figure(figsize=(20,5))
for i in range(36):
ax = fig.add_subplot(3, 12, i + 1, xticks=[], yticks=[])
ax.imshow(np.squeeze(train_x[i]))
In [34]:
train_x = train_x.astype('float32') / 255
test_x = test_x.astype('float32') / 255
train_y = np_utils.to_categorical(train_y, 10)
test_y = np_utils.to_categorical(test_y, 10)
In [35]:
train_x.shape
Out[35]:
간단한 네트워크를 일단 하나 생성합니다.¶
In [36]:
def build(input_shape):
model = Sequential()
model.add(Conv2D(32, (3,3), padding = 'same', input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
return model
In [37]:
model = build(input_shape=(32,32,3))
In [38]:
model.summary()
In [39]:
model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
In [40]:
history = model.fit(train_x, train_y, batch_size=256, epochs=10, validation_split=0.2, verbose=1)
In [41]:
score = model.evaluate(test_x, test_y, batch_size = 256, verbose = 1)
정확도 확인¶
- 정확도가 상승하는 그래프를 보면 여지가 분명 많은것을 확인할 수 있습니다.
In [42]:
print("최종 정확도 : " + str( score[1] * 100 ) + " %" )
In [52]:
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
Out[52]:
드랍아웃 적용 및 계층 쌓기¶
In [47]:
def build(input_shape):
model = Sequential()
model.add(Conv2D(32, (3,3), padding = 'same', input_shape=input_shape))
model.add(Activation('relu'))
model.add(Dropout(0.25)) # Dropout
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64, (3,3), padding = 'same'))
model.add(Activation('relu'))
model.add(Dropout(0.25)) # Dropout
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5)) # Dropout
model.add(Dense(10))
model.add(Activation('softmax'))
return model
model_dr = build(input_shape=(32,32,3))
model_dr.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
history_dr = model_dr.fit(train_x, train_y, batch_size=256, epochs=10, validation_split=0.2, verbose=1)
score_dr = model_dr.evaluate(test_x, test_y, batch_size = 256, verbose = 1)
print("최종 정확도 : " + str( score_dr[1] * 100 ) + " %" )
정확도 상승 확인¶
- 앞으로도 꾸준히 정확도가 상승할수 있는 여지도 계속 보입니다.
- epoch를 조금 더 높이고, 레이어를 추가한다면 계속 정확도가 높아질수 있습니다.
In [51]:
plt.plot(history_dr.history['acc'])
plt.plot(history_dr.history['val_acc'])
Out[51]: