#Fashion-MNIST 데이터셋 불러오기
from tensorflow.keras.datasets.fashion_mnist import load_data
# Fashion-MNIST 데이터 불러오기
(x_train, y_train), (x_test, y_test) = load_data()
# 훈련 데이터에 대한 검정을 위해 validation 데이터를 만든다.
from sklearn.model_selection import train_test_split
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.3, random_state=777)
# 신경망에 넣기전에 데이터 정규화(값의 범위를0~1 로 만들어 준다.)
import numpy as np
mx=max(list(map(lambda x:np.max(x), x_train)))
x_train = x_train/mx
x_val = x_val/mx
x_test = x_test/mx
# 3차원을 4차원으로 변경
x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],x_train.shape[2],-1)
x_val=x_val.reshape(x_val.shape[0],x_val.shape[1],x_val.shape[2],-1)
x_test=x_test.reshape(x_test.shape[0],x_test.shape[1],x_test.shape[2],-1)
# 라벨을 one hot encoding 해준다.
from tensorflow.keras.utils import to_categorical #mnist의 라벨 숫자를 one hot encoding 해주는 함수
y_train=to_categorical(y_train)
y_val=to_categorical(y_val)
y_test=to_categorical(y_test)
# 모델을 구성한다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Dropout, BatchNormalization, Conv2D, MaxPooling2D, Activation
from tensorflow.keras.utils import to_categorical
model=Sequential()
model.add(Conv2D(64, (3, 3), padding='same', input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu')) # 64개의 뉴런을 가진 은닉1층
model.add(Dense(128, activation='relu')) # 32개의 뉴런을 가진 은닉2층
model.add(Dense(32, activation='relu')) # 10개의 뉴런을 가진 출력층
model.add(Dense(10, activation='softmax')) # 10개의 뉴런을 가진 출력층
# 모델과정 설정하기
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
# 기본 학습률이 0.001로 설정 되어있다.
# 모델 학습하기
history=model.fit(x_train, y_train, epochs=10, batch_size=128, validation_data=(x_val, y_val))
# 모델 성능 평가
print('\n모델평가','-'*100)
print(model.evaluate(x_test,y_test))
# 혼동행렬 시각화
print('\n 혼동행렬 시각화','-'*100)
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import classification_report, confusion_matrix
results=model.predict(x_test)
plt.figure( figsize = ( 7, 7 ) )
cm = confusion_matrix( np.argmax( y_test, axis= 1), np.argmax( results, axis=1) )
sns.heatmap( cm, annot = True, fmt='d', cmap='Blues')
plt.xlabel('predicted label')
plt.ylabel('true label')
plt.show()
# 정확도외에 다른 성능 척도 보기
print('\n정확도 외에 다른 성능 척도','-'*100)
print(classification_report(np.argmax(y_test, axis=1), np.argmax(results, axis=1)))
# 시각화 하기
print('\n 손실 & 정확도 시각화','-'*100)
his_dict = history.history
loss = his_dict['loss']
val_loss = his_dict['val_loss'] # 검증 데이터가 있는 경우 ‘val_’ 수식어가 붙습니다.
epochs = range(1, len(loss) + 1)
fig = plt.figure(figsize = (10, 5))
# 훈련 및 검증 손실 그리기
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(epochs, loss, color = 'blue', label = 'train_loss')
ax1.plot(epochs, val_loss, color = 'orange', label = 'val_loss')
ax1.set_title('train and val loss')
ax1.set_xlabel('epochs')
ax1.set_ylabel('loss')
ax1.legend()
acc = his_dict['acc']
val_acc = his_dict['val_acc']
# 훈련 및 검증 정확도 그리기
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(epochs, acc, color = 'blue', label = 'train_acc')
ax2.plot(epochs, val_acc, color = 'orange', label = 'val_acc')
ax2.set_title('train and val accuracy')
ax2.set_xlabel('epochs')
ax2.set_ylabel('acc')
ax2.legend()
plt.show()