8-4 High Level TensorFlow API에 의한 뉴럴네트워크(NN) 학습:I

in #kr5 years ago (edited)

TensorFlow에서 뉴럴네트워크(NN)를 사용하는 High Level API는 간단히 Linear Classifier를 사용하는 Low Level API 와 구별된다. 한편 High Level API 에서도 2가지가 있는바 하나는 TensorFlow 의 tf.layers 명령을 사용하는 방법과 그 이후에 출현한 Keras API (tensorflow.contrib.keras) 를 사용하는 방법이다. contrib 이라함은 contribution 의 약어로서 구글이 아닌 외부에서 수혈을 통해 기여가 이루어졌음을 뜻한다.

Keras 의 연혁을 읽어보니 구글의 TensorFlow 개발 담당 프로그래머가 구글을 나와서 개인적으로 TensorFlow에 얺어 쓸 수 있도록 API를 개발하였다고 한다. 그럼에도 불구하고 향 후 Keras는 TensorFlow 의 submodule 로서 인정받아 지속적으로 TensorFlow에 포함된다고 하니 배워 둘 필요가 있는 듯하다.

High Level NN 으로 넘어가기 전에 Low Level 코딩 영역에서 matplotlib 출력시 사용했던 파라메터 range()에 대해서 잠깐 살펴보자.

이미 게재했던 “Keras로 가는 길목에서: 8-3 Low level TensorFlow API 선형회귀 모델“ 편에서 matplotlib 모듈을 사용하여 결과를 출력했었지만 plot의 출력범위 파라메터인 range 사용법이 혼란스러워 다시 한번 정리하였다. 출력 자체가 머신 러닝은 아니지만 하도 잡다한 명령들이 많아 혼란스러워 한번 정리를 하고자 다시 따져 보았다.
학습용 X_train 과 Y_train 데이터를 준비하자. X_train 은 0에서 9까지 실수 데이터를 생성하여 10x1 로 리스트형 데이터의 shape을 설정한다. Y_train 은 임의로 10개의 실수 데이터를 대응시킨다.
X_train = np.arrange(10).reshape((10,1))
Y_train = np.array([1.0, 1.3, 3.1, 2.0, 5.0, 6.3, 6.6, 7.4, 8.0, 9.0])

다음과 같이 인스탄스 lrmodel에 대한 computational graph 즉 lrmodel.g를 사용하여 Session 을 정의하고 train_linreg 루틴을 사용하여 학습을 시킨다.

sess = tf.Session(graph=lrmodel.g)
trainning_costs = train_linreg(sess, lrmodel, X_train, y_train)

학습 완료 후 matplotlib를 사용하여 cost 함수의 수렴과정을 작도하기로 한다.

plt.plot(range(1, len(trainning_costs) + 1), trainning_costs)

len(trainning_costs)를 출력해보면 10 이다. 따라서 출력 범위가 range(1,11) 이된다.

noname01.png

테스트과정에서는 predict_linreg 루틴을 사용하여 계산하며 결과를 출력하기 위해서 range를 range(X_train.shape[0])을 사용하는데 X_train.reshape((10,1))에서 [0]은 10을 뜻하므로 X_train.shape[0]의 값은 10 이 된다. 따라서 range(10)을 출력해 보면 range(0,10) 이 되므로 0에서 9까지에 해당하는 점을 계산하여 출력한다.

noname02.png

TensorFlow tf.layers를 사용하는 MNIST 문제의 NN 해법
input_data.read_data_sets("MNIST_data/", one_hot=True)와 같은 TensorFlow 자체의 MNIST 데이터 로딩 명령이 있으나 여기서는 load.mnist 명령을 사용하기로 하자. 명령 자체는 조금 다르나 내용상으로는 동일하다고 보면 된다.
High Level API 에 의한 MNIS 문제를 다루기 위한 헤더영역에서 필요로 하는 아래의 라이브러리 모듈들을 살펴보자.

noname03.png

그 다음 진행을 위해서 함수 load.mnist 루틴을 정의할 필요가 있다. 그 내용은 머신 러닝의 본론이 아니므로 첨부된 코드를 살펴보도록 한다. 핵심은 이 명령을 사용하여 파일 경로와 로딩하려는 데이터 종류 즉 kind를 지정해 줄 필요가 있다. 해당 내용을 한 줄 한 줄 복사하여 Shell에서 실행 시켜보자.
MNIST도 인터넷 오픈 소스별로 차이가 있는 듯한데 어디서는 학습용이 55000개 라고 하는데 여기서는 60000개로 나오며 테스트용은 10000개 이다.

noname04.png

다음 편에서 계속 이어집니다.

첨부된 코드를 일괄적으로 실행해 본 후 위에서 설명하는 부분을 한줄 한줄 아나콘다 Shell에서 실행해 보자.
#High Level API MNIST NN load.mnist
#coding: utf-8

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import sys
import gzip
import shutil
import os
import struct
import tensorflow.contrib.keras as keras

#Training neural networks efficiently with high-level TensorFlow APIs
#Building multilayer neural networks using TensorFlow's Layers API
#unzips mnist

if (sys.version_info > (3, 0)):
writemode = 'wb'
else:
writemode = 'w'

zipped_mnist = [f for f in os.listdir('./') if f.endswith('ubyte.gz')]
for z in zipped_mnist:
with gzip.GzipFile(z, mode='rb') as decompressed, open(z[:-3], writemode) as outfile:
outfile.write(decompressed.read())

def load_mnist(path, kind='train'):
"""Load MNIST data from path"""
labels_path = os.path.join(path,
'%s-labels-idx1-ubyte' % kind)
images_path = os.path.join(path,
'%s-images-idx3-ubyte' % kind)

with open(labels_path, 'rb') as lbpath:
    magic, n = struct.unpack('>II', 
                             lbpath.read(8))
    labels = np.fromfile(lbpath, 
                         dtype=np.uint8)

with open(images_path, 'rb') as imgpath:
    magic, num, rows, cols = struct.unpack(">IIII", 
                                           imgpath.read(16))
    images = np.fromfile(imgpath, 
                         dtype=np.uint8).reshape(len(labels), 784)
    images = ((images / 255.) - .5) * 2

return images, labels

#loading the data
X_train, y_train = load_mnist('.', kind='train')
print('Rows: %d, Columns: %d' %(X_train.shape[0], X_train.shape[1]))

X_test, y_test = load_mnist('.', kind='t10k')
print('Rows: %d, Columns: %d' %(X_test.shape[0], X_test.shape[1]))
#mean centering and normalization:
mean_vals = np.mean(X_train, axis=0)
std_val = np.std(X_train)

X_train_centered = (X_train - mean_vals)/std_val
X_test_centered = (X_test - mean_vals)/std_val

del X_train, X_test

print(X_train_centered.shape, y_train.shape)
print(X_test_centered.shape, y_test.shape)

마나마인로고.png

Sort:  

짱짱맨 호출에 응답하였습니다.

Coin Marketplace

STEEM 0.28
TRX 0.11
JST 0.034
BTC 66137.63
ETH 3161.38
USDT 1.00
SBD 4.13