########## (9쪽) 패키지 임포트 ########## import numpy as np ########## (10쪽) 평탄화, 정규화 ########## ### ------ mnist 데이터 다운로드 함수 load_mnist()정의 def load_mnist(flatten=True, normalize = False) : ### ------ mnist 모듈 임포트 from tensorflow.keras.datasets import mnist ### ------ 내려받은 데이터를 훈련용, 테스트용으로 분리 (x_train, t_train), (x_test, t_test) = mnist.load_data() ### ------ 정규화 과정 if normalize : ### ------ 각 값을 255로 나누어 0과 1 사이 값으로 만듦. x_train, x_test = x_train / 255.0, x_test / 255.0 ### ----- 각 숫자를 부동소수점으로 표기 x_train = x_train.astype(np.float32) x_test = x_test.astype(np.float32) ### ------ 평탄화 과정 if flatten : ### ------ 평탄화 이전 x_train, x_test의 형태 출력 print("<평탄화 이전 데이터 개수와 형태>") print('평탄화 이전 x_train 형태 ::', '개수:', x_train.shape[0], '사이즈:', x_train.shape[1:]) print("평탄화 이전 x_test 형태::", '개수:', x_test.shape[0], '사이즈:', x_test.shape[1:]) ### ------ 평탄화(이미지개수는 그대로 두고 한 줄로 바꿈.) x_train = x_train.reshape(x_train.shape[0], -1) x_test = x_test.reshape(x_test.shape[0], -1) ### ------ 평탄화 이후 x_train, x_test 형태 출력 print('') print('<평탄화 이후 데이터 개수와 형태>') print('평탄화 이후 x_train 형태::', '개수:', x_train.shape[0], '사이즈:', x_train.shape[1:]) print("평탄화 이후 x_test 형태::", '개수:', x_test.shape[0], '사이즈:', x_test.shape[1:]) return (x_train, t_train), (x_test, t_test) ### ------ load 함수를 호출하고 변수에 할 (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize = False) ########## (11쪽) 훈련용 데이터셋의 첫번째 데이터를 이미지행렬로 나타내기 ########## for i, x in enumerate(x_train[0]) : ### ---- x를 3자리 정수로 표현하고 공백 삽입 print(f'{x:3}', end=' ') ### ---- 28번째 숫자마다 줄바꿈. if (i+1)%28 == 0 : print() ########## (12쪽) 인공지능 모델 생성 ########## ### ------ 패키지 임포트 import tensorflow as tf from tensorflow.keras import layers, models from tensorflow.keras.datasets import mnist import matplotlib.pyplot as plt ### 시각화 도구 ### --- load_mnist() 함수로 데이터를 내려받아 훈련용, 테스트용 변수에 할당(정규화, 평탄화 모두 시행) (train_images,train_labels),(test_images,test_labels) = load_mnist(flatten=True, normalize=True) ########## (13쪽) 모델 생성 : 다층 퍼셉트론(MLP) 생성 ########## model = models.Sequential([ ### --- 은닉층1 구성 (뉴런개수 : 128, 활성화함수 : relu) layers.Dense(128, activation = 'relu'), ### --- 은닉층2 구성 (몰라도 됨.) layers.Dropout(0.2), ### --- 출력층 구성 (뉴런개수: 10개 (숫자0~9), 활성화함수 : softmax) ### --- 은닉층을 거쳐 계산된 (이미지와 정수 k간 유사 정도)를 출력층의 각 퍼셉트론 0~9로 출력 layers.Dense(10, activation='softmax') ]) ### --- 모델 컴파일(손실함수, 옵티마이저, 평가지표 설정 - 아직 몰라도 됨) model.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy']) ########## (14쪽) 모델 훈련(가중치설정) : 훈련용 데이터를 사용하여 모델 학습시키기 ########## model.fit(train_images, train_labels, epochs=5) ### ------ 모델 평가 : 테스트 데이터로 모델 성능 평 test_loss, test_acc = model.evaluate(test_images, test_labels, verbose = 2) print(f'\nTest Accuracy : {test_acc * 100:.2f} %') ########## (15쪽) 예측 및 시각화 ########## ### ------ 테스트 이미지에서 예측값 얻기 predictions = model.predict(test_images) predicted_labels = [tf.argmax(p) for p in predictions] ### ------ 예측 및 시각화 plt.figure(figsize=(9,9)) # 새로운 그림 생성 및 사이즈를 9*9로 설정 for i in range(25) : # test_images의 첫 25개 그림에 대해 시행 plt.subplot(5,5,i+1) plt.xticks([]) # x축 눈금 비활성화 plt.yticks([]) # y축 눈금 비활성화 plt.grid(False) # 그리드 비활성화 plt.imshow(test_images[i].reshape(28,28), cmap = plt.cm.binary) # 이미지 리스트를 이진색상 그림으로 표시 plt.xlabel(f"real : {test_labels[i]} - predict : {predicted_labels[i]}") # 실제값, 예측값 표시 plt.show() # 화면에 나타내기