SoftmaxCrossEntropyWidthLogits - Batch Size 10개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 87.72%




SoftmaxCrossEntropyWidthLogits - Batch Size 100개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 87.73%



Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 100개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 83.25%



Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 1000개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 89.04%




Weight 3차원 결과값  (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 1000개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 88.03%




Weight 3차원 결과값  (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 10000개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 90.63%




Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 10000개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 90.69%




Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 55000개, Train 20회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.001 

정확도 : 80.57%




Weight 3차원 결과값 (Range -1 ~ 1)




SoftmaxCrossEntropyWidthLogits - Batch Size 55000개, Train 100회 결과 (DataSet : 55000,개 TestSet : 10000개)  learning rate = 0.001 

정확도 : 84.06%




Weight 3차원 결과값 (Range -1 ~ 1)



SoftmaxCrossEntropyWidthLogits - Batch Size 55000개, Train 1000회 결과 (DataSet : 55000,개 TestSet : 10000개) learning rate = 0.000001 

정확도 : 90.20%



cost value : 0.75




Weight 3차원 결과값 (Range -1 ~ 1)



Weight 3차원 결과값 (Range -0.2 ~ 0.2)



SoftmaxCrossEntropyWidthLogits - Batch Size 10000개, Train 500회 결과 (DataSet : 50000,개 TestSet : 10000개) learning rate = 0.0001 

정확도 : 91.60%




Weight 3차원 결과값 (Range -1 ~ 1)






MNIST linear regression


MNIST dataset을 이용하여 linear regression 알고리즘을 enuSpace-Tensorflow를 이용한 사용 방법을 설명합니다.



Python를 이용한 구현

참고 : http://www.xiaoliangbai.com/2017/02/01/tensorflow-applying-linear-regression-on-mnist-dataset

import sys
import time
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
%matplotlib inline

%load_ext autoreload
%autoreload 2

MNIST = input_data.read_data_sets("MNIST_data", one_hot=True)

# Define parameters for linear model
learning_rate = 0.01
batch_size = 128
n_epochs = 25

# Create placeholders
X = tf.placeholder(tf.float32, [batch_size, 784], name="image")
Y = tf.placeholder(tf.float32, [batch_size, 10], name="label")

# Create weights and bias
w = tf.Variable(tf.random_normal(shape=[784, 10], stddev=0.01), name="weights")
b = tf.Variable(tf.zeros([1,10]), name='bias')

# calculate scores
logits = tf.matmul(X, w) + b

# Entropy cost function and loss
entropy = tf.nn.softmax_cross_entropy_with_logits(logits, Y)
loss = tf.reduce_mean(entropy)

# Define optimizer
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)

# Run optimization and test
loss_history = []
acc_history = []
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    n_batches = int(MNIST.train.num_examples/batch_size)
    for i in range(n_epochs):
        for _ in range(n_batches):
            X_batch, Y_batch = MNIST.train.next_batch(batch_size)
            _, loss_value = sess.run([optimizer, loss], feed_dict={X: X_batch, Y:Y_batch})
        loss_history.append(loss_value)

        # Check validation accuracy    
        n_v_batches = int(MNIST.validation.num_examples/batch_size)
        total_correct_preds = 0
        for j in range(n_v_batches):
            X_batch, Y_batch = MNIST.validation.next_batch(batch_size)
            _, loss_batch, logits_batch = sess.run([optimizer, loss, logits], feed_dict={X: X_batch, Y:Y_batch})
            preds = tf.nn.softmax(logits_batch)
            correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1))
            accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))
            total_correct_preds += sess.run(accuracy)
        validation_accuracy = total_correct_preds/MNIST.validation.num_examples
        acc_history.append(validation_accuracy)


    # Test the model
    n_batches = int(MNIST.test.num_examples/batch_size)
    total_correct_preds = 0
    for i in range(n_batches):
        X_batch, Y_batch = MNIST.test.next_batch(batch_size)
        logits_batch = sess.run(logits, feed_dict={X: X_batch, Y:Y_batch})
        preds = tf.nn.softmax(logits_batch)
        correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1))
        accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))
        total_correct_preds += sess.run(accuracy)

    print "Test accuracy is {0}".format(total_correct_preds/MNIST.test.num_examples)

enuSpace-Tensorflow를 이용한 구현

Training model 1 (SoftmaxCrossEntropyWidthLogits)

아래 그리픽 모델은 SoftmaxCrossEntropyWidthLogits 객체를 이용하여 그래픽 블럭을 이용하여 각 객체의 핀정보에 대하여 연결선을 수행한 화면이다.

Training model (Subtract)

아래 그래픽 모델은 Subtract객체를 이용하여 그래픽 블럭을 이용하여 각 객체의 핀정보에 대하여 연결선을 수행한 화면이다.

각 블럭별 기능 설명

데이터 셋 불러오기

각 블럭중 데이터셋을 불러와 전달을 수행하기 위한 FIFOQueue , FIFOEnqueue를 활용한다. 한번에 불러올 이미지의 배치 사이즈를 설정한다. 본 모델은 100개를 적용하였다.

Cost값 Gradient

불러온 이미지 데이터 셋을 이용하여 Weight변수와 Bias변수를 생성하여 Training 수행


Traing 결과 저장

Training을 특정 개수에 도달하면, Weight와 Bias의 텐서값을 저장하기 위하여 아래그림과 같이 구성하였다.

Evaluation Model

앞에서 저장된 Weight, Bias의 값을 이용하여 평가를 수행하는 모델이다.

평가용 dataset 가져오기

평가를 수행하기 위해서 평가용 데이터셋의 파일 위치를 지정하여 매 실행마다 불러오기를 수행한다.

Train 결과값 불러오기

앞 Training Model에서 저장한 Weight, Bias 텐서값을 불러오는 불럭이다.

평가하기

평가용 데이터셋과 Weight, bias값을 불러왔다면 평가를 수행한다.

평가 결과 출력하기

평가 결과를 출력하기 위하여 Counter와 판정결과값을 확인하기 블럭을 구성하였다.

3차원 Weight값 실시간 디스플레이

Training 과정을 확인하기 위해서 Weight값을 3차원으로 확인하기 위한 픽쳐를 생성하여 실시간 변화정보에 대하여 확인한다.

SoftmaxCrossEntropyWidthLogits 이용한 모델 결과

Subtract 이용한 모델 결과.




Gradient Descent


Gradient Descent 알고리즘을 enuSpace-Tensorflow를 이용하여 실행 결과입니다.


enuSpace-Tensorflow는 C++ 기반의 API를 이용하여 그래픽 블럭으로 구성되었습니다. Tensorflow의 C++ API를 이용하여 구현하시는 분은 아래링크를 참고하세요.

API 가이드 : https://expnuni.gitbooks.io/enuspacetensorflow/content/


참고 : https://hunkim.github.io/ml/ (모두를 위한 머신러닝/딥러닝 강의)

참고 : https://medium.com/@peteryun/ml-%EB%AA%A8%EB%91%90%EB%A5%BC-%EC%9C%84%ED%95%9C-tensorflow-3-gradient-descent-algorithm-%EA%B8%B0%EB%B3%B8-c0688208fc59

Python를 이용한 구현

import tensorflow as tf

x_data = [1., 2., 3.]
y_data = [1., 2., 3.]

W = tf.Variable(tf.random_uniform([1],-10.0, 10.0))

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

hyphothesis = W * X

cost = tf.reduce_mean(tf.square(hyphothesis - Y))

descent = W - tf.mul( 0.1, tf.reduce_mean(tf.mul( (tf.mul(W,X)-Y), X ) ))

init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)

for step in range(20):
    sess.run(W.assign(descent), feed_dict={X:x_data, Y:y_data})
    print( step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W))

enuSpace-Tensorflow를 이용한 구현

Tensorflow의 그래픽 컴포넌트를 이용하여 위와 동일한 코드를 그래픽 컴포넌트를 이용하여 로직을 구성하여 실행한 결과는 아래 그림과 같다. 

X의 초기값에 {1.0f, 2.0f, 3.0f} 입력시 출력 Y {1.0f, 2.0f, 3.0f}에 해당하는 W값을 구현하는 로직이다.

자세한 알고리즘에 대한 설명은 https://hunkim.github.io/ml/ (모두를 위한 머신러닝/딥러닝 강의)를 참고하시기 바랍니다.

ApplyGradientDescent 블럭을 이용한 구현 예시

ApplyGradientDescent Equation (var = var - alpha*delta)


Multi Variable Linear regression 구현 예시

아래의 테이블의 값을 이용하여 W, b의 찾기 위한 그래픽 블럭을 구성하여 예상된 가중치와 바이어스값을 확인.

X1X2X3Y
152179
151222110
351323135
44524171
51553199
6447120
121727132
62028135

미리계산된 W, Bias 값 (W1 = 1, W2 = 2, W3= 3, Bias = 5)

Hypothesis Using matrix

H(x1, x2, x3) = x1w1 + x2w2 + x3w3

Multi variable Python 코드 구현예시

x_data = [[1., 5., 21.], [15., 12., 22.],
         [35., 13., 23.], [4., 45., 24.], [5., 15., 53.],
         [6., 44., 7.], [12., 17., 27.], [6., 20., 28.]]
y_data = [[79.], [110.], [135.], [171.], [199.], [120.], [132.], [135.]]


# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])

W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

# Hypothesis
hypothesis = tf.matmul(X, W) + b

그랙픽 블럭 구성 및 실행 결과


W1, W2, W3의 값이 1, 2, 3의 값으로 수렴, Bias 값 5로 수렴

초기값 설정

X = {{1,5,21},{15,12,22},{35,13,23},{4,45,24},{5,15,53},{6,44,7},{12,17,27},{6,20,28}}

Y = {{79 },{110},{135},{171},{199},{120},{132},{135}}

W 초기값 = {{1.5,3.5,0.5}}

b 초기값 = {{0.5}}

ApplyGradientDescent alpha 값 = 0.001



enuSpace for jupiter 개발 이야기

  • enuSpace for jupiter deep learning(tensorflow) plugin project 오픈소스 생성


tensorflow 버젼 : r1.2

enuSpace for jupiter 버젼에서는 외부 모듈과 연동하기 위한 plugin 기능이 추가됩니다.

Deep learning 오픈 플랫폼 tensorflow와 연동하기 위한 공개 소프트웨어 저장소를 생성하였습니다.

Project 주소(github) : https://github.com/EXPNUNI/enuSpaceTensorflow


Tensorflow C++ API Guide

#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

int main() 
{
  using namespace tensorflow;
  using namespace tensorflow::ops;
  Scope root = Scope::NewRootScope();

  // Matrix A = [3 2; -1 0]
  auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f}});
  
  // Vector b = [3 5]
  auto b = Const(root, { {3.f, 5.f}});
  
  // v = Ab^T
  auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
  std::vector outputs;
  ClientSession session(root);
  
  // Run and fetch v
  TF_CHECK_OK(session.Run({v}, &outputs));
  
  // Expect outputs[0] == [19; -3]
  LOG(INFO) << outputs[0].matrix();
  return 0;
}

위와 같이 C++를 이용하여 Tensorflow 코드를 짜야 했던 내용을 enuSpace에서 아래 그림과 같이 로직 블럭을 drag & drop으로 구성하고 연결선을 이용하여 코드를 제작합니다. 

위 프로그램은 실제 Const 입력값에 따라서 MatMul 블럭의 Operation을 수행하여 연산 결과를 출력하는 동작 화면입니다. 

현재단계는 Tensorflow와 메모리 연동에 대한 소프트웨어 설계 및 기초 구현이 되었습니다. 

enuSpace for jupiter 버젼의 진화과정을 github에서 확인하실 수 있습니다. 많은 관심 부탁드립니다.

https://github.com/EXPNUNI/enuSpaceTensorflow


-이엔유 주식회사 developer team - 


Tensorflow r1.1 윈도우10에서 C++ 컴파일 수행기 (x64)

enuSpace for jupiter - work note


Tensorflow r1.1을 이용한 Third party 프로그램 개발에 있어 소스 빌드과정에 대한 수행 내용이다.



준비사항


Known-good configurations (가장 좋은 조합)


컴파일 환경 : Microsoft Windows 10


- Microsoft Visual Studio 2015 with Visual C++ 2015


- Anaconda 4.1.1 (Python 3.5 64-bit) : https://www.continuum.io/downloads


- Git for Windows version 2.9.2.windows.1


- swigwin-3.0.10 : http://www.swig.org/download.html


- [NVidia CUDA Toolkit 8.0] (https://developer.nvidia.com/cuda-downloads)

- [NVidia CUDNN 5.1] (https://developer.nvidia.com/cudnn)


- CMake 3.6 : https://cmake.org/download/


* 가장 좋은 조합을 따라서 컴파일을 수행하여야 한번에 적용이 용이함.


Step by Step (절차)


Run cmd (컴파일 환경 설정)


- D:\Workspace>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"


CMake and git Path 추가 (Cmd 창에서 명령  수행이 가능하도록 패스추가)


- D:\Workspace>set PATH=%PATH%;C:\Program Files\Git\bin\


Tensorflow r1.1 clone (텐서플로우 1.1 다운로드)


- D:\Workspace>git clone -b r1.1 https://github.com/tensorflow/tensorflow.git


- D:\Workspace>cd tensorflow\tensorflow\contrib\cmake
- D:\Workspace\tensorflow\tensorflow\contrib\cmake> mkdir build
- D:\Workspace\tensorflow\tensorflow\contrib\cmake> cd build
- D:\Workspace
\tensorflow\tensorflow\contrib\cmake\build>
D:\...\build> cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release ^
More? -DSWIG_EXECUTABLE=D:/Workspace/swigwin-3.0.10/swigwin-3.0.10/swig.exe ^
More? -DPYTHON_EXECUTABLE=C:/Anaconda3/python.exe ^
More? -DPYTHON_LIBRARIES=C:/Anaconda3/libs/python35.lib 


튜터리얼 샘플 빌드 수행


MSBuild


- D:\...\build>MSBuild /p:Configuration=Release tf_tutorials_example_trainer.vcxproj


위 절차에서 따라서 새성된 옵션은 release 버젼용으로 컴파일이 된다. 정상적으로 동작을 수행하는지 샘플프로그램을 실행한다.


정상적으로 컴파일 완료후, 샘플 프로그램 테스트.


- D:\...\build>Release\tf_tutorials_example_trainer.exe


debug 버젼의 빌드는 동일한 구성으로 시도하였을 경우 빌드가 용이치 않다. 

makefiles를 수정하며 옵션 변경이 필요하다.


Tensorflow r1.1에 대한 64bit용 release에 대해서만 빌드가 정상적으로 수행되었으며, 32bit 컴파일 과정에 일부 라이브러리의 64bit 컴파일 환경에 따라서 정상적으로 빌드가 되지 않음을 확인하였다. 



참고 사이트 : 

https://github.com/tensorflow/tensorflow/blob/r1.1/tensorflow/contrib/cmake/README.md

https://www.facebook.com/notes/hyeon-gab-shin/windows-10-기반-tensorflow-빌드-및-실행하기/1264305280280854/

    

+ Recent posts