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) )