fashion_mnist 데이터셋으로 사진을 분류하는 CNN을 만들자.
fashion_mnist 데이터셋을 불러온다.
fashion_mnist = tf.keras.datasets.fashion_mnist
(X_train,y_train),(X_test,y_test) = fashion_mnist.load_data()
그 후 피처 스케일링한다.
X_train = X_train / 255.0
X_test = X_test / 255.0
학습용과 검증용 X데이터는 3차원으로 이루어져있는데 convolution 작업을 하기위해서는 reshape으로 4차원을 만들어야 한다.
X_train = X_train.reshape(60000,28,28,1)
X_test = X_test.reshape(10000,28,28,1)
# 추가된 하나의 차원은 색을 나타내며 RGB면 3, 흑백이면 1로 설정한다.
모델링을 시작한다.
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.layers import Conv2D, MaxPooling2D
model = Sequential()
# Base
model.add(Conv2D(filters= 64, kernel_size= (3,3),activation='relu',input_shape= (28,28,1)))
model.add(MaxPooling2D(pool_size= (2,2),strides= 2 ))
model.add(Conv2D(filters=32,kernel_size=(2,2),activation='relu'))
model.add(MaxPooling2D(2,2 ))
# Head
model.add(Flatten())
model.add(Dense(units=128,activation='relu'))
model.add(Dense(units=10,activation= 'softmax'))
# 각 각 두개의 컨볼루션과 풀링을 사용했다.
# 컨볼루션은 엑티베이션으로 렐루를 사용한다.
# input_shape은 항상 들어갈 데이터 하나의 형태를 입력한다.
# MaxPooling2D의 pool_size 파라미터에 튜플이 아닌 정수를 입력하면 자동으로 인식한다.
# CNN은 컨볼루션과 ANN을 조합한것이라고 볼수있다.
# CNN 모델은 베이스와 헤드로 나뉜다는것을 기억하자.
summary함수를 사용하여 모델을 살펴보자.
in:
model.summary()
out:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 26, 26, 64) 640
max_pooling2d (MaxPooling2D (None, 13, 13, 64) 0
)
conv2d_1 (Conv2D) (None, 12, 12, 32) 8224
max_pooling2d_1 (MaxPooling (None, 6, 6, 32) 0
2D)
flatten (Flatten) (None, 1152) 0
dense (Dense) (None, 128) 147584
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 157,738
Trainable params: 157,738
Non-trainable params: 0
_________________________________________________________________
# 157,738개의 파라미터가 있다는것을 알수있다.
# 컨볼루션의 파라미터의 개수는 커널의 개수다.
모델을 컴파일한다.
model.compile('adam','sparse_categorical_crossentropy',['accuracy'])
# y값이 3개 이상의 레이블 인코딩된 데이터이니 로스함수로 sparse_categorical_crossentropy를 사용한다.
모델을 학습시킨다.
model.fit(X_train,y_train, epochs=5, validation_split=0.2)
검증해보자.
in:
model.evaluate(X_test,y_test)
out:
313/313 [==============================] - 1s 3ms/step - loss: 0.2748 - accuracy: 0.9112
[0.27479302883148193, 0.9111999869346619]
# 오차값이 0.27, 정확도가 0.91이 나온다.
'딥러닝' 카테고리의 다른 글
[딥러닝] 디렉토리를 따로 만들어서 학습데이터 저장: mkdir, listdir (0) | 2022.06.15 |
---|---|
[딥러닝] horse-or-human CNN 실습, 압축, 이미지 처리: extractall, ImageDataGenerator, flow_from_directory (0) | 2022.06.15 |
[딥러닝] CNN (Convolutional Neural Network) 이해 (0) | 2022.06.14 |
[딥러닝] MNIST 손글씨 숫자 실습, 원핫인코딩: to_categorical, categorical_crossentropy (0) | 2022.06.14 |
[딥러닝] 딥러닝 모델 저장하고 불러오기 (0) | 2022.06.14 |
댓글