[인공지능수학] 3단원 실습코드

_1. (9쪽) 패키지 임포트

import numpy as np

_2. (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)

_3. (11쪽) 훈련용 데이터셋의 첫번째 데이터를 이미지행렬로 나타내기

for i, x in enumerate(x_train[0]) : 
  ### ---- x를 3자리 정수로 표현하고 공백 삽입
  print(f'{x:3}', end=' ') 
  ### ---- 28번째 숫자마다 줄바꿈. 
  if (i+1)%28 == 0 : 
    print()

_4. (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)

_5. (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'])

_6. (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} %')

_7. (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() # 화면에 나타내기


코멘트

댓글 남기기

Cha's Record에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기