After the "Hello World", you can try some more complex secure service. TEEX supports Tensorlow library in the TestNet. To show how to use it, we provide a "linear regression" demo written with Tensorflow library of Python in our container. After starting the container, it can be found by:

    $ cd ~/Demo/linear_regression

The directory looks like:

    --  client.opt.conf  
    --  deploy.opt.conf  
    --  linear_regression.py  
    --  input.txt
    --  README.md

The client.opt.conf and deploy.opt.conf are configuration files, which are used to invoke and deploy the service respectively. linear_regression.py is the service code and input.txt contains the input string. README.md briefly introduces the services.

Service Code

Let's first see the linear_regression.py:

import json
import numpy
import tensorflow as tf

from teex import *

rng = numpy.random

# Parameters
learning_rate = 0.01
training_epochs = 1000

# Training Data
train_X = numpy.asarray(json.loads(TEEX_getinput())["x"])
train_Y = numpy.asarray(json.loads(TEEX_getinput())["y"])
n_samples = train_X.shape[0]

# Construct a model
X = tf.placeholder("float")
Y = tf.placeholder("float")
W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")

pred = tf.add(tf.multiply(X, W), b)
cost = tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * n_samples)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
init = tf.global_variables_initializer()

# Start training
with tf.Session() as sess:
    # Run the initializer

    # Fit all training data
    for epoch in range(training_epochs):
        for x, y in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})

    TEEX_return("Y = %fX + %f" % (sess.run(W), sess.run(b)))

The "linear regression" service gets two arraies X and Y. Then it performs linear regression of them, to calculate the weight and bias.

We first import the Tensorflow library (version 1.5), and teex library. Then we use TEEX_getinput to receive the input string, which is a json string looks like:

    "X": [1.1, 1.5, 2.8, 4.5],
    "Y": [1.4, 5.5, 7.8, 10]

The service will get two arrays X and Y from this input string, can invoke the API of Tensorflow to construct a network which can regress a function Y = weight*X + basis according to the input arrays. After that, the service returns the "Y = weight*X + basis" to the user by invoking TEEX_return function.

Deployment and Invocation

The deployment and invocation of "linear regression" are same as "Hello World". To deploy the "linear regression" and get a service ID, you only need to type:

    $ teex-deploy -c deploy.md 

And to invoke the "linear regression", you can type:

    $ teex-client -c client.md 


Since we limit the memory usage of a service in TEEX TestNet, if your own machine learning service (w/ tensorflow) requires too much memory, it may cause Runtime Error on our TestNet.