1. 데이터 가져오기

from tensorflow import keras
from sklearn.model_selection import train_test_split

#데이터 읽어오기
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
rint(train_input.shape)

 

 

 

 

2. 스케일링 및 차원 수정

# 흑백 이미지라서 차원을 1개 늘려서 255 로 나눔
train_scaled = train_input.reshape(-1, 28, 28, 1) / 255.0
print(train_scaled.shape) 

train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)
(60000, 28, 28, 1)

 

 

 

 

3. 모델 생성

#모델 만들기
model = keras.Sequential()

#입력 층을 합성곱 층을 사용
model.add(keras.layers.Conv2D(32, kernel_size=3, activation="relu",
                             padding='same', input_shape=(28, 28, 1)))
model.add(keras.layers.MaxPooling2D(2))

model.add(keras.layers.Conv2D(64, kernel_size=3, activation="relu",
                             padding='same'))
model.add(keras.layers.MaxPooling2D(2))

#데이터를 1차원으로 만들어주는 층
model.add(keras.layers.Flatten())

#Dense 는 1차원의 데이터만 사용
model.add(keras.layers.Dense(100, activation="relu"))

#드랍 아웃 적용
model.add(keras.layers.Dropout(0.4))

model.add(keras.layers.Dense(10, activation="softmax"))

 

# 모델 확인

model.summary()

 

 

 

 

 

4. 모델 컴파일 (훈련)

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy",
             metrics=["accuracy"])

#체크 포인트
checkpoint_cb = keras.callbacks.ModelCheckpoint("best-cnn-model.keras")

#2번의 epoch 동안 점수가 좋아지지 않으면 조기 종료
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
                                                 restore_best_weights=True)
history = model.fit(train_scaled, train_target, epochs=20,
                   validation_data=(val_scaled, val_target),
                   callbacks=[checkpoint_cb, early_stopping_cb])

 

 

 

 

 

4. 모델 평가

model.evaluate(val_scaled, val_target)
  • 아래 합성곱 층으로 내려갈 때 뉴런의 개수를 늘렸는데 중간에 MaxPooling2D(Dropout을 적용해도 동일) 을 적용했기 때문에 실제 파라미터의 개수가 줄어들어 사용되므로 늘린 티가 나지 않음
#클래스 이름
classes = ['티셔츠', '바지', '스웨터', '드레스', '코트',
          '샌달', '셔츠', '스니커즈', '가방', '앵클 부츠']


preds = model.predict(val_scaled[0:1])
print(preds)
print(classes[np.argmax(preds)])

plt.imshow(val_scaled[0].reshape(28, 28), cmap='gray_r')
plt.show()

 

 

# 훈련에 사용한 데이터가 스케일되어 있으므로, 예측 데이터도 스케일링

test_scaled = test_input.reshape(-1, 28, 28, 1)/255.0
model.evaluate(test_scaled, test_target)

 

 

# 모델 저장

model.save("best-cnn-models.keras")
  • 이전 API에서는 확장자를 h5를 권장했는데 최근에는 keras를 권장