クラウド統合開発環境Cloud9でTensorFlowを使う～GetStarted～

# はじめに
クラウド統合開発環境Cloud9で開発作業をしています。機械学習を勉強しているので、TensorFlowをCloud9上で勉強したく環境構築しました。そのメモを残します。

# 環境
[Cloud9](https://c9.io)
Python 2.7.6
Sample Codes : [GitHub](https://github.com/takus69/learn_tf)

# 手順
Cloud9上で、TensorFlowの[Get Started](https://www.tensorflow.org/versions/r0.11/get_started/index.html#introduction)までを実行できるようにするまでの手順です。

1. [Cloud9](https://c9.io)で新しいワークスペースを作成する。テンプレートはpythonを選ぶ。
2. Terminalで以下を実行する。<br>
export export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0rc0-cp27-none-linux_x86_64.whl<br>
sudo pip install --upgrade $TF_BINARY_URL
3. Get Startedのサンプルプログラムを保存して実行する。[TensorFlowのGET STARTED](https://www.tensorflow.org/versions/r0.11/get_started/index.html)に掲載されていものと同じです。

``` getstarted.py
import tensorflow as tf
import numpy as np

# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3

# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but TensorFlow will
# figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# Before starting, initialize the variables.  We will 'run' this first.
init = tf.initialize_all_variables()

# Launch the graph.
sess = tf.Session()
sess.run(init)

# Fit the line.
for step in range(201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))

# Learns best fit is W: [0.1], b: [0.3]
```

実行結果が、0.1と0.3に近ければ学習によって、直線の係数を予測できているということでしょう。
私が実行した結果は以下で、0.1と0.3に近い値が見えています。

``` result
(0, array([ 0.45364389], dtype=float32), array([ 0.13226086], dtype=float32))
(20, array([ 0.18247673], dtype=float32), array([ 0.25206894], dtype=float32))
(40, array([ 0.12017135], dtype=float32), array([ 0.28827751], dtype=float32))
(60, array([ 0.10493329], dtype=float32), array([ 0.29713303], dtype=float32))
(80, array([ 0.10120656], dtype=float32), array([ 0.29929882], dtype=float32))
(100, array([ 0.10029508], dtype=float32), array([ 0.29982853], dtype=float32))
(120, array([ 0.10007217], dtype=float32), array([ 0.29995808], dtype=float32))
(140, array([ 0.10001764], dtype=float32), array([ 0.29998976], dtype=float32))
(160, array([ 0.10000434], dtype=float32), array([ 0.29999751], dtype=float32))
(180, array([ 0.10000106], dtype=float32), array([ 0.29999939], dtype=float32))
(200, array([ 0.10000025], dtype=float32), array([ 0.29999986], dtype=float32))
```

# MNISTの実行
手書きの数字の画像データから数字を認識するプログラムも無事実行できました。
[GitHub](https://github.com/takus69/learn_tf)のconvolutional.pyをダウンロードして実行するだけです。（公式サイトのソースと同じものです。）
Cloud9で実行すると100 Step 2分ほどで、全部で2時間ほどかかったと思います。スペック足りないですね。Cloud9のスペックは1CPU, 512MB RAMでした。
実行結果は以下です。（長いので途中省略しています。）

```
python convolutional.py 

Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
Initialized!
Step 0 (epoch 0.00), 7.7 ms
Minibatch loss: 12.054, learning rate: 0.010000
Minibatch error: 90.6%
Validation error: 84.6%
Step 100 (epoch 0.12), 706.3 ms
Minibatch loss: 3.287, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.0%
Step 200 (epoch 0.23), 713.8 ms
...
...
Step 5300 (epoch 6.17), 1937.9 ms
Minibatch loss: 1.980, learning rate: 0.007351
Minibatch error: 0.0%
Validation error: 0.9%
Step 5400 (epoch 6.28), 2089.9 ms
```

見方は微妙に分かりませんが、Minibatch errorやValidation errorのパーセントが小さくなっているので識別できるようになっているということでしょうか。
今回はとりあえず実行しただけですが、今後中身を理解していきたいです。

# おわりに
Cloud9上で、TensorFlowをインストールできたので、今後中身を理解していきたいと思います。
ちなみにTensorFlowは、CPUを使うものとGPUを使うものがあるようですが、GPUを使うものは使えないようです。インストールしてみましたが、実行時にエラーが発生してしまいました。Cloud9上では、CPUを使うものを利用しましょう。

## 更新履歴
### 2016/10/19
- MNISTのサンプルコード実行結果追記
- 環境の記載
- GitHubに合わせてサンプルコード名を変更