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를 권장
'Python > Python 실전편' 카테고리의 다른 글
[딥러닝] CNN _ 도로 교통 표지판 인식 (0) | 2024.03.22 |
---|---|
[전처리] 인구 소멸 지역 Cartogram (3) | 2024.03.20 |
[전처리] 서울시 범죄 현황 시각화 (0) | 2024.03.20 |
[전처리] 지도 출력 Choropleth (0) | 2024.03.20 |
[전처리] 서울시 구별 CCTV와 인구 관계 분석 (0) | 2024.03.20 |