응용과정 시험 - 실습

·2021년 12월 13일
0

NIPA AI 교육

목록 보기
29/31

Fashion-MNIST 데이터 분류하기
Fashion-MNIST 데이터란 의류, 가방, 신발 등의 패션 이미지들의 데이터셋으로 60,000개의 학습용 데이터 셋과 10,000개의 테스트 데이터 셋으로 이루어져 있습니다.

각 이미지들은 28x28 크기의 흑백 이미지로, 총 10개의 클래스로 분류되어 있습니다.

이번 실습에서 사용하는 데이터는 모델 학습을 위해 28x28 크기의 다차원 데이터를 1차원 배열로 전처리한 데이터로, 60,000개의 학습 데이터 중 4,000개의 학습 데이터와 10,000개의 테스트 데이터 중 1,000개의 데이터를 랜덤으로 추출하였습니다.

이번 실습에서는 이러한 Fashion-MNIST 데이터를 각 이미지의 레이블에 맞게 분류하는 다층 퍼셉트론 모델을 생성해보고, Test 데이터에 대한 정확도, 즉 모델의 성능을 85% 이상으로 높여보도록 하겠습니다.

실습
Fashion-MNIST 데이터 분류를 위한 다층 퍼셉트론 모델을 생성하고, 학습 방법을 설정해 학습시킨 모델을 반환하는 Model 함수를 구현하세요.

1-1. 다층 퍼셉트론 분류 모델의 구조 예시입니다.

첫 번째 레이어 (Input layer)
이번 실습에서 사용하는 데이터는 이미 전처리 되어 있기 때문에 input_dim 인자를 통해 데이터의 크기를 맞춰주지 않아도 됩니다.

tf.keras.layers.Dense(64, activation='relu')
마지막 레이어 (Output layer)
10개 클래스에 대한 확률을 출력합니다.

tf.keras.layers.Dense(10, activation='softmax')
1-2. 모델을 학습시킬 손실 함수(loss function)와 최적화(optimize) 방법, 평가 방법(metrics)을 다음과 같이 설정합니다.

손실 함수(loss)
: sparse_categorical_crossentropy
최적화 방법(optimizer) : ‘adam’
평가 방법(metrics): [‘accuracy’]
1-3. 모델을 학습시킵니다. 우리의 목표를 위해 epochs도 자유롭게 설정해봅니다.

실행 버튼을 눌러 테스트 데이터에 대한 모델의 성능 즉, 테스트 정확도를 확인하고 85% 이상으로 높여 제출해보세요.

from __future__ import absolute_import, division, print_function, unicode_literals

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import random
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import elice_utils
elice_utils = elice_utils.EliceUtils()

np.random.seed(100)
tf.random.set_seed(100)

'''
1. 신경망 분류 모델을 만들고, 학습 방법을 설정해 
   학습시킨 모델을 반환하는 Model 함수를 구현하세요.
   
   Step01. 신경망 분류 모델을 생성합니다. 
           여러 층의 레이어를 쌓아 모델을 구성해보세요.(CNN, MLP 모두 가능합니다.)
           
   Step02. 모델의 손실 함수, 최적화 방법, 평가 방법을 설정합니다.
   
   Step03. 모델을 학습시킵니다. epochs를 자유롭게 설정해보세요.
'''

def Model(x_train, y_train):
    
    model = tf.keras.models.Sequential([None])
    
    model.compile(optimizer=None,
                  loss=None,
                  metrics=None)
    
    model.fit(x_train, y_train, epochs=None)
    
    return model


    
x_train = np.loadtxt('./data/train_images.csv', delimiter =',', dtype = np.float32)
y_train = np.loadtxt('./data/train_labels.csv', delimiter =',', dtype = np.float32)
x_test = np.loadtxt('./data/test_images.csv', delimiter =',', dtype = np.float32)
y_test = np.loadtxt('./data/test_labels.csv', delimiter =',', dtype = np.float32)

# 이미지 데이터를 0~1범위의 값으로 바꾸어 줍니다.
x_train, x_test = x_train / 255.0, x_test / 255.0

# CNN 모델의 입력으로 사용한다면 아래 코드의 주석을 풀어줍니다. (샘플개수, 가로픽셀, 세로픽셀, 1) 형태로 변환합니다.
#x_train = x_train.reshape(len(x_train),28,28,1)
#x_test = x_test.reshape(len(x_test),28,28,1)

model = Model(x_train, y_train)

# 학습한 모델을 test 데이터를 활용하여 평가합니다.
loss, test_acc = model.evaluate(x_test, y_test, verbose=0)

print('\nTEST 정확도 :', test_acc)

# 임의의 3가지 test data의 이미지와 레이블값을 출력하고 예측된 레이블값 출력
predictions = model.predict(x_test)
rand_n = np.random.randint(100, size=3)

for i in rand_n:
    img = x_test[i].reshape(28,28)
    plt.imshow(img,cmap="gray")
    plt.show()
    plt.savefig("test.png")
    elice_utils.send_image("test.png")

    print("Label: ", y_test[i])
    print("Prediction: ", np.argmax(predictions[i]))

profile
백엔드 개발자. 공동의 목표를 함께 이해한 상태에서 솔직하게 소통하며 일하는 게 가장 즐겁고 효율적이라고 믿는 사람.

0개의 댓글