KT AIVLE School/시각지능 딥러닝
notMNIST 분류
Rabet
2024. 10. 21. 17:20
1. 데이터 불러오기 및 라이브러리
!pip install keras-nightly
!wget http://yaroslavvb.com/upload/notMNIST/notMNIST_small.mat
import numpy as np
import matplotlib.pyplot as plt
from scipy import io
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from sklearn.metrics import classification_report
from keras.callbacks import EarlyStopping
2. 데이터 전처리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2024)
## scaling
n_max, n_min = x_train.max(), x_train.min()
x_train_mm = (x_train - n_min) / (n_max - n_min)
x_test_mm = (x_test - n_min) / (n_max - n_min)
# x_train_mm = x_train/255.0
# x_test_mm = x_test/255.0
## one-hot encoding
classes_n = len(np.unique(y_train)) # 10
y_train_cat = to_categorical(y_train, classes_n)
y_test_cat = to_categorical(y_test, classes_n)
3. 모델링 실행
- Sequential API
## Sequential API
## 1. 세션 클리어
keras.utils.clear_session()
## 2. 모델 블록 쌓을 발판 선언 : Sequential()
model = keras.models.Sequential()
## 3. 모델 블록 쌓기 : .add()
model.add( keras.layers.Input(shape=(28,28,1)) )
model.add( keras.layers.Flatten() )
model.add( keras.layers.Dense(128, activation='relu') )
model.add( keras.layers.BatchNormalization() )
model.add( keras.layers.Dropout(0.2) )
model.add( keras.layers.Dense(64, activation='relu') )
model.add( keras.layers.BatchNormalization() )
model.add( keras.layers.Dropout(0.2) )
model.add( keras.layers.Dense(32, activation='relu') )
model.add( keras.layers.BatchNormalization() )
model.add( keras.layers.Dropout(0.2) )
model.add( keras.layers.Dense(10, activation='softmax') )
## 4. 모델 구조 확인 : .summary()
model.summary()
- Functional API
## Functional API
## 1. 세션 클리어
keras.utils.clear_session()
## 2. 레이어 사슬처럼 엮기
il = keras.layers.Input(shape=(28,28,1))
hl = keras.layers.Flatten()(il)
hl = keras.layers.Dense(128, activation='relu')(hl)
hl = keras.layers.BatchNormalization()(hl)
hl = keras.layers.Dropout(0.2)(hl)
hl = keras.layers.Dense(64, activation='relu')(hl)
hl = keras.layers.BatchNormalization()(hl)
hl = keras.layers.Dropout(0.2)(hl)
hl = keras.layers.Dense(32, activation='relu')(hl)
hl = keras.layers.BatchNormalization()(hl)
hl = keras.layers.Dropout(0.2)(hl)
ol = keras.layers.Dense(10, activation='softmax')(hl)
## 3. 모델의 시작과 끝 레이어 지정
model = keras.models.Model(il,ol)
## 4. 요약
model.summary()
## compile
model.compile(optimizer= 'adam', loss='categorical_crossentropy', metrics=['accuracy'])
## Early stopping
es = EarlyStopping(monitor='val_loss', # 얼리스토핑을 적용할 관측 지표
min_delta=0, # threshold. 이 값보다 더 크게 지표가 변화해야 성능 개선으로 간주
patience=3, # 성능 개선이 발생하지 않았을 때, 몇 epochs 더 지켜볼 것인지
verbose=1, # 얼리스토핑이 적용된 epoch 알려줌
restore_best_weights=True, # 최적의 가중치를 모델에 다시 전달
)
## fit
hist = model.fit(x_train_mm, y_train_cat, epochs=10000, verbose=1, validation_split=0.2, callbacks=[es])
## evaluate()
model.evaluate(x_test_mm, y_test_cat)
## .predcict()
y_pred = model.predict(x_test_mm)
# 원핫 인코딩 한 것을 다시 묶어주는 코드
# 평가 지표 및 실제 데이터 확인을 위해 필요
y_pred_arg = np.argmax(y_pred, axis=1)
test_y_arg = np.argmax(y_test_cat, axis=1)
# 결과 확인
class_names = ['A', 'B', 'C', 'D', 'E', 'F',' G', 'H', 'I', 'J']
print( classification_report(test_y_arg, y_pred_arg, target_names=class_names) )