수학적 접근

[머신러닝] MNIST 사용 기초 - 학습시킨 데이터로 테스트하기 본문

개발/AI

[머신러닝] MNIST 사용 기초 - 학습시킨 데이터로 테스트하기

평등수렴 2020. 1. 22. 14:30
반응형

앞의 글에서 MNIST Dataset을 가져와서 조회해보았다.

 

 

[머신러닝] MNIST 사용 기초 - Dataset 가져와서 조회하기

MNIST Database란 손글씨 숫자 이미지 집합으로, 머신러닝 분야의 트레이닝 및 테스트에 널리 사용되는 데이터셋이다. MNIST Dataset 다운로드 https://drive.google.com/open?id=1IQXvFigDTVKlcZAP2oTgTMOXqdhFOs..

dkfk2747.tistory.com

 

이번에는 이 데이터를 학습시켜서, 이 데이터들과는 다른 테스트 데이터들을 이용하여

 

학습의 정확도를 측정해볼 것이다.

 

 

은닉층은 2개, activation function으로는 sigmoid 함수를 사용하며,

 

최종 출력값의 정규화를 위해 softmax 함수를 활용한다.

 

또한 weight 정보가 필요하므로, 아래 파일을 압축 해제하여 나오는 pkl 파일을

 

dataset 폴더 내에 넣는다.

 

 

sample_weight.zip

 

drive.google.com

그리고 아래와 같이 코드를 작성한다.

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

def softmax(matrix) : # softmax 함수
    maximum_of_matrix = np.max(matrix)
    difference_from_maximum = matrix - maximum_of_matrix
    exponential_of_difference = np.exp(difference_from_maximum)
    sum_of_exponential = np.sum(exponential_of_difference)
    y = exponential_of_difference / sum_of_exponential
    return y

def get_data(): # mnist 데이터를 불러옴. 여기서는 이 중에 test 변수만을 사용할 것이다.
    (image_train, label_train), (image_test, label_test) = load_mnist(flatten=True, normalize=False)
    return image_test, label_test

def init_network() : # sample_weight 를 불러와서 신경망 구성
    with open('./dataset/sample_weight.pkl', 'rb') as f:
        network = pickle.load(f)
    return network

def predict(network, x) : # 테스트 케이스들을 테스트
    # hidden data 2개
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = softmax(a3)
    
    return y
images, labels = get_data()
network = init_network()

accuracy_cnt = 0
for i in range(len(images)) : # 각 테스트 케이스들에 대해
    y = predict(network, images[i]) #실행 결과 output 10개가 나온다
 					#각 0~9 별로 비슷 정도에 대한 수치이다
    p = np.argmax(y) # 가장 가능성이 높은(값이 큰) 것을 선택
    if p == labels[i] : # 실제 값과 비교하여, 예측과 실제가 맞으면 카운트
        accuracy_cnt += 1
    
print("Accuracy: " + str(float(accuracy_cnt) / len(images)))
[출력]
Accuracy: 0.9207

 

위의 코드는 하나의 테스트 케이스에 대한 처리이며,

 

여러 개의 테스트 케이스를 한 번에 처리하는 배치 처리를 구성할 수도 있다.

#배치처리
images, labels = get_data()
network = init_network()

batch_size = 100
accuracy_cnt = 0

for i in range(0, len(images), batch_size) :
    x_batch = images[i:i + batch_size]	#배치 크기만큼씩 이미지를 불러온다
    y_batch = predict(network, x_batch)
    p = np.argmax(y_batch, axis=1)
    accuracy_cnt += np.sum(p == labels[i:i+batch_size])
    
print("Accuracy: " + str(float(accuracy_cnt) / len(images)) )
[출력]
Accuracy: 0.9207

 

 

+++++

 

내가 마시고 있는 생수는 안전한 생수일까?

15년도부터 생수 수질기준 부적합 판정을 받은 이력을 확인할 수 있는 앱, <바른생수>를 출시하였습니다.

 

관심 한번씩만 부탁드립니다 ^^

 

바로가기!

 

 

반응형

'개발 > AI' 카테고리의 다른 글

[머신러닝] MNIST 사용 기초 - Dataset 가져와서 조회하기  (1) 2020.01.22
Comments