Assignment 2: Simple Neural Network 구현

 
 MNIST Dataset을 응용한 간단한 Neural Network 구현
   개요:
     1. 교재 100페이지에 있는 ch03/neuralnet_mnist.py를 이용하여 다음의 간단한 three layer SimpleNeuralNetYourID.py를 완성하라.
     2. 샘플데이터 SimpleNetData.csv는 5000*13 배열로 임의의 값이 채워져 있는 파일이다. 이 파일의 마지막 열(13열)은 12열에 대한 0-9 사이의 정답 숫자로 되어 있다. 이 파일을 읽어서  x_train, y_train으로 불러들인다. x_train은 (5000, 12) 형태의 배열로 y_train은 (5000,)의 정답으로 된 배열이다.
     3. 이 simple forward network은 손실함수도 구현되지 않은 기본 단계라 성능이 낮을 것임. 앞으로 계속 발전시켜 성능을 향상 시키는 것이 목표. 우선 제시된 함수를 완성하여 그 정확도를 출력하는 프로그램을 완성하라

import sys, os
sys.path.append(os.pardir)
from csv import reader
import numpy as np


# Load a CSV file
def load_csv(filename):
    x_train = list()
    y_train = list()
    with open(filename, 'r') as file:
        csv_reader = reader(file)
   
(여기에 코드 작성)
    읽어 온 자료를 numpy 배열로 바꾸고 이 때 x_train과 y_train은 각각 float형과 int형으로 한다.
    참고: 강의 자료 중

How to Implement Simple Linear Regression From Scratch with Python 참조

    return x_train, y_train

def one_hot_encoding(x):
 
     
y_train 정답 값을 one-hot encoding으로 변형. sklearn, pandas, keras 등에서 제공하는 모듈을 쓰지말고 numpy로 구현해 볼 것 

def init_network(input_size, hidden_size, output_size):

    network = {}
    weight_int_std = 0.01
    network['W1'] = weight_int_std * np.random.randn(input_size, hidden_size)
    network['b1'] = np.zeros(hidden_size)
    network['W2'] = weight_int_std * np.random.randn(hidden_size, hidden_size)
    network['b2'] = np.zeros(hidden_size)
    network['W3'] = weight_int_std * np.random.randn(hidden_size, output_size)
    network['b3'] = np.zeros(output_size)

    return network

def predict(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

   
Weight와 bias를 내적한 후 sigmoid로 활성화, 마지막에는 softmax로 확률을 구함

    return y

def accuracy(x, t):      #x는 자료에서 예측된 값 t는 정답으로 주어진 값
      y = predict(network,x)
   
    
예측된 값과 one_hot_encoding으로 된 y_train값을 비교하여 정확도를 출력

    return accuracy


def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def softmax(x):
    if x.ndim == 2:
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T

    x = x - np.max(x) # 오버플로 대책
    return np.exp(x) / np.sum(np.exp(x))


filename = 'SimpleNetData.csv'
x_train, y_train = load_csv(filename)
y_train = one_hot_encoding(y_train)

network = init_network(len(x_train[1]), 100, 10)

accuracy = accuracy(x_train, y_train)

print (accuracy)