CNN - 1

CYSSSSSSSSS·2023년 9월 14일
0

CNN

목록 보기
1/8

딥러닝 복습

notmnist

!wget http://yaroslavvb.com/upload/notMNIST/notMNIST_small.mat

import matplotlib.pyplot as plt
from scipy import io
import numpy as np

data = io.loadmat('notMNIST_small.mat')

data

# tensorflow 형태에 맞게 변환
resolution = 28
classes = 10

# transepose 와 reshape 을 통해 형태를 변환 
x = np.transpose(x, (2, 0, 1))
print(x.shape)
x = x.reshape( (-1, resolution, resolution, 1) )

# train_test_split
from sklearn.model_selection import train_test_split

train_x , test_x , train_y , test_y = train_test_split(x,y,random_state = 2023 ,test_size=0.2)
train_x.shape , train_y.shape , test_x.shape , test_y.shape

#scaling
# tabular 데이터가 아니면 skleran preprocessing 에 minmaxscaler 를 사용하면 안된다.
max_n , min_n = train_x.max() , train_x.min()

train_x = (train_x - min_n) /( max_n - min_n) 
test_x = (test_x - min_n) / (max_n - min_n)

from tensorflow.keras.utils import to_categorical

class_n=len(np.unique(train_y)) # 0 ~ 9 까지 10개의 형태를 보유하고있다

train_y = to_categorical(train_y , class_n) # class_n 개의 숫자 만큼  label 생성 
test_y = to_categorical(test_y , class_n) # class_n 개의 숫자만큼 label 생성

import tensorflow as tf
from tensorflow import keras

from keras.src.engine.training import optimizer
# 1.Functional API
# 1.세션 클리어 : 메모리에 기존 구조가 남아있으면 정리해줘 
keras.backend.clear_session()
# 2.레이어 사슬처럼 역끼
il = keras.layers.Input(shape = [28,28,1]) # train_x.shpae 의 모양
hl = keras.layers.Flatten()(il)
hl = keras.layers.Dense(256,activation = 'relu')(hl)
hl = keras.layers.Dense(256,activation = 'relu')(hl)
hl = keras.layers.BatchNormalization()(hl)
hl = keras.layers.Dropout(0.2)(hl) 

hl = keras.layers.Dense(128,activation = 'relu')(hl)
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.Dense(64,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.compile(optimizer = 'adam' , loss = keras.losses.categorical_crossentropy,metrics = ['accuracy'])

# 5. 모델 구조 보기
model.summary()

from tensorflow.keras.callbacks import EarlyStopping

es = EarlyStopping(monitor = 'val_loss',
              patience=10 ,
              min_delta= 0  ,# min_delta 값만큼 성능이 개선됐다고 간주를 한다
              verbose=1, # verbose 어느 epoch 에서 적용되는지 보여줌
              restore_best_weights=True # 가장 베스트 가중치 를 보여줌
              )  
              
model.fit(train_x , train_y , 
          epochs = 100000 , 
          verbose = 1 , 
          validation_split = 0.2,# 매 epoch 마다 validation split 을 사용 
          callbacks = [es]
          )
model.evaluate(test_x , test_y)
y_pred = model.predict(test_x)

# 원핫 인코딩 한 것을 다시 묶어주는 코드
# 평가 지표 및 실제 데이터 확인을 위해 필요

y_pred_arg = np.argmax(y_pred , axis = 1)
test_y_arg = np.argmax(test_y , axis = 1)


from sklearn.metrics import accuracy_score , classification_report

accuracy_score(test_y_arg , y_pred_arg)

print(classification_report(test_y_arg , y_pred_arg))

letters_str = "ABCDEFGHIJ"

rand_idx = np.random.randint(0, len(y_pred_arg))
test_idx = test_y_arg[rand_idx]
pred_idx = y_pred_arg[rand_idx]
class_prob = np.floor( y_pred[rand_idx]*100 )

print(f'idx = {rand_idx}')
print(f'해당 인덱스의 이미지는 {letters_str[test_idx]}')
print(f'모델의 예측 : {letters_str[pred_idx]}')
print(f'모델의 클래스별 확률 : ')
print('-------------------')

for idx, val in enumerate(letters_str) :
    print(val, class_prob[idx])
print('=================================================')

if test_y_arg[rand_idx] == y_pred_arg[rand_idx] :
    print('정답')
else :
    print('땡')

plt.imshow(test_x[rand_idx], cmap='Greys')
plt.show()

temp = (test_y_arg == y_pred_arg)
false_idx = np.where(temp==False)[0]
false_len = len(false_idx)
false_len

letters_str = "ABCDEFGHIJ"

rand_idx = false_idx[np.random.randint(0, false_len)]
test_idx = test_y_arg[rand_idx]
pred_idx = y_pred_arg[rand_idx]
class_prob = np.floor( y_pred[rand_idx]*100 )

print(f'idx = {rand_idx}')
print(f'해당 인덱스의 이미지는 {letters_str[test_idx]}')
print(f'모델의 예측 : {letters_str[pred_idx]}')
print(f'모델의 클래스별 확률 : ')
print('-------------------')
for idx, val in enumerate(letters_str) :
    print(val, class_prob[idx])
print('=================================================')

if test_y_arg[rand_idx] == y_pred_arg[rand_idx] :
    print('정답')
else :
    print('땡')

plt.imshow(test_x[rand_idx], cmap='Greys')
plt.show()
profile
개발자 되고 싶어요

0개의 댓글