TensorFlow 環境構築 + fully_connected_feed.py 実行を３分でやってみる

#__<i class="fa fa-connectdevelop" aria-hidden="true"></i> はじめに__
機械学習およびディープラーニングの代表的なライブラリ/フレームワークの一つであるTensorFlowに関して、初めて動かす人向けのメモです。いろんなサイトを参考にさせていただきましたが、自身のマシンの環境などで違ったエラーが出たりするかもしれないので、__手順__のセクションで、うまくいかなかった場合、ヒントになるようなことが__参考__にあるかもしれないです。


この記事では __<i class="fa fa-server" aria-hidden="true"></i>`Ubuntu`__の場合と__<i class="fa fa-laptop" aria-hidden="true"></i>`OSX`__の場合を紹介します。

#__<i class="fa fa-laptop" aria-hidden="true"></i> OS X__

OSX環境で実行したい場合はこちらが圧倒的に参考になります
> http://senyoltw.hatenablog.jp/entry/2016/05/07/231041

##環境

![Screen Shot 2016-12-03 at 02.11.59.png](https://qiita-image-store.s3.amazonaws.com/0/56510/44063597-4188-eca8-3a11-004cdf556de5.png)

- OSX 10.11.4 El Capitan
- Python 2.7.10

```
$ python -V
Python 2.7.10
```

##手順

### [1]. 環境構築

`pip`とかが入っていない場合は`sudo easy_install pip`で入れてあげて、以下のようにtensorflow環境を整えます。

```bash
$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv
```

ここで、他のPython環境でいろいろ問題を起こさないように、仮想環境として`tensorflow`というディレクトリを用意します。

```bash
$ mkdir ~/tensorflow
$ virtualenv --system-site-packages ~/tensorflow
```

いよいよ、仮想環境内で`tensorflow`をインストールします。

```bash
$ source ~/tensorflow/bin/activate
(tensorflow) $ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py2-none-any.whl
```

また補足として、`$ deactivate`で抜けることができます。

### [2]. チュートリアルのコードの準備

任意のディレクトリで(今回は`workdir`にしました)修正されているブランチのチュートリアルコードを`clone`してきます

```bash
workdir$ git clone -b r0.11 https://github.com/tensorflow/tensorflow.git
workdir$ cd tensorflow/
```

### [3]. fully_connected_feed.py の実行

まず、好きなエディタで

`fully_connected_feed.py` の30,31行目を次のように修正します

```修正前.py
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.examples.tutorials.mnist import mnist
```

```修正後.py
import input_data
import mnist
```

最後に実行してみます

```bash
workdir$ cd tensorflow/
workdir/tensorflow$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py 
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/t10k-labels-idx1-ubyte.gz
Step 0: loss = 2.30 (0.016 sec)
Step 100: loss = 2.17 (0.011 sec)
Step 200: loss = 1.91 (0.011 sec)
Step 300: loss = 1.65 (0.011 sec)
Step 400: loss = 1.36 (0.013 sec)
Step 500: loss = 0.91 (0.012 sec)
Step 600: loss = 0.83 (0.012 sec)
Step 700: loss = 0.74 (0.012 sec)
Step 800: loss = 0.62 (0.013 sec)
Step 900: loss = 0.60 (0.012 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 47143  Precision @ 1: 0.8571
Validation Data Eval:
  Num examples: 5000  Num correct: 4308  Precision @ 1: 0.8616
Test Data Eval:
  Num examples: 10000  Num correct: 8595  Precision @ 1: 0.8595
Step 1000: loss = 0.39 (0.013 sec)
Step 1100: loss = 0.52 (0.100 sec)
Step 1200: loss = 0.44 (0.012 sec)
Step 1300: loss = 0.40 (0.013 sec)
Step 1400: loss = 0.52 (0.012 sec)
Step 1500: loss = 0.34 (0.012 sec)
Step 1600: loss = 0.40 (0.011 sec)
Step 1700: loss = 0.30 (0.012 sec)
Step 1800: loss = 0.37 (0.012 sec)
Step 1900: loss = 0.27 (0.012 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 49315  Precision @ 1: 0.8966
Validation Data Eval:
  Num examples: 5000  Num correct: 4509  Precision @ 1: 0.9018
Test Data Eval:
  Num examples: 10000  Num correct: 8949  Precision @ 1: 0.8949
```

こんな感じになれば成功です。


#__<i class="fa fa-server" aria-hidden="true"></i> Ubuntu__

##環境

- Ubuntu 14.04.5

```bash
$ lsb_release -a
LSB Version:	core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch:core-4.1-amd64:core-4.1-noarch:security-4.0-amd64:security-4.0-noarch:security-4.1-amd64:security-4.1-noarch
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.5 LTS
Release:	14.04
Codename:	trusty
```

- Python 2.7.6

```bash
$ python -V 
Python 2.7.6
```

##手順

### [1]. 環境構築

`pip`とかが入っていない場合は`sudo easy_install pip`で入れてあげて、以下のようにtensorflow環境を整えます。

```bash
$ sudo pip install --upgrade virtualenv
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl
$ sudo pip install --upgrade pip
```

### [2]. チュートリアルのコードの準備

OSXと同様です。一応以下にも同じことを書きます。

任意のディレクトリで(今回は`workdir`にしました)修正されているブランチのチュートリアルコードを`clone`してきます

```bash
workdir$ git clone -b r0.11 https://github.com/tensorflow/tensorflow.git
workdir$ cd tensorflow/
```

### [3]. fully_connected_feed.py の実行

OSXと同様です。一応以下にも同じことを書きます。

まず、好きなエディタで

`fully_connected_feed.py` の30,31行目を次のように修正します

```修正前.py
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.examples.tutorials.mnist import mnist
```

```修正後.py
import input_data
import mnist
```

最後に実行してみます

```bash
workdir$ cd tensorflow/
workdir/tensorflow$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py 
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/t10k-labels-idx1-ubyte.gz
Step 0: loss = 2.30 (0.016 sec)
Step 100: loss = 2.17 (0.011 sec)
Step 200: loss = 1.91 (0.011 sec)
Step 300: loss = 1.65 (0.011 sec)
Step 400: loss = 1.36 (0.013 sec)
Step 500: loss = 0.91 (0.012 sec)
Step 600: loss = 0.83 (0.012 sec)
Step 700: loss = 0.74 (0.012 sec)
Step 800: loss = 0.62 (0.013 sec)
Step 900: loss = 0.60 (0.012 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 47143  Precision @ 1: 0.8571
Validation Data Eval:
  Num examples: 5000  Num correct: 4308  Precision @ 1: 0.8616
Test Data Eval:
  Num examples: 10000  Num correct: 8595  Precision @ 1: 0.8595
Step 1000: loss = 0.39 (0.013 sec)
Step 1100: loss = 0.52 (0.100 sec)
Step 1200: loss = 0.44 (0.012 sec)
Step 1300: loss = 0.40 (0.013 sec)
Step 1400: loss = 0.52 (0.012 sec)
Step 1500: loss = 0.34 (0.012 sec)
Step 1600: loss = 0.40 (0.011 sec)
Step 1700: loss = 0.30 (0.012 sec)
Step 1800: loss = 0.37 (0.012 sec)
Step 1900: loss = 0.27 (0.012 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 49315  Precision @ 1: 0.8966
Validation Data Eval:
  Num examples: 5000  Num correct: 4509  Precision @ 1: 0.9018
Test Data Eval:
  Num examples: 10000  Num correct: 8949  Precision @ 1: 0.8949
```

こんな感じになれば成功です。



#__<i class="fa fa-book" aria-hidden="true"></i> 参考サイト__

私がUbuntuで試す際にトライアンドエラーした順番に並べています。この知見を得た上で上の手順のセクションを書きました。

ベースはこちらを参考にしました
> http://d.hatena.ne.jp/shu223/20160105/1451952796

「動作確認：Hello World を実行してみる」ってとこまではうまくできました。
途中で

```
.....(略).....
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
.....(略).....
```

みたいなのが怒られて、`.bashrc`に以下を追記みたいな感じでした。記事は以下のものを参考にしました。
> http://d.hatena.ne.jp/tkrd/20120828/1346123699

```bash
export LC_ALL=en_US.UTF-8
```

ここで、「fully_connected_feed.py を実行します。」あたりで

```
$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py 
Traceback (most recent call last):  
.....(略).....
ImportError: /home/hiroki11x/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so: invalid ELF header
```

そのため

```bash
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl
```

とすると

```
$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py 
ImportError: No module named contrib.learn.python.learn.datasets.mnist  
```

みたいなことで怒られる
同じことで困ってる人がいたので、以下のstackoverflowを参考に

```bash
$ sudo apt-get install python-pip python-dev
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl
```

> http://stackoverflow.com/questions/37002134/having-error-with-tensorflow-mnist

をするとこれについては直ったが

```bash
$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py 
.....(略).....
ImportError: No module named protobuf
```

となる、
mac環境でpython3.3以上の場合は`six`が必要らしいのと、いろいろ、違うバージョンの`protobuf`が入ってしまったようなので以下を実行

```bash
$ sudo easy_install --upgrade six
$ sudo pip install --upgrade
$ sudo pip uninstall protobuf
$ sudo pip install protobuf
```

次に、

```bash
$ python fully_connected_feed.py 10
Traceback (most recent call last):
  File "fully_connected_feed.py", line 279, in <module>
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
TypeError: run() got an unexpected keyword argument 'argv'
```

が出てくるので、その問題を解決してるブランチがあるっぽいので、そっちをcloneすることに

```bash
$ git clone -b r0.11 https://github.com/tensorflow/tensorflow.git
$ cd tensorflow/
$ python tensorflow/examples/tutorials/mnist/fully_connected_feed.py 
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/t10k-labels-idx1-ubyte.gz
Step 0: loss = 2.30 (0.016 sec)
Step 100: loss = 2.17 (0.011 sec)
Step 200: loss = 1.91 (0.011 sec)
Step 300: loss = 1.65 (0.011 sec)
Step 400: loss = 1.36 (0.013 sec)
Step 500: loss = 0.91 (0.012 sec)
Step 600: loss = 0.83 (0.012 sec)
Step 700: loss = 0.74 (0.012 sec)
Step 800: loss = 0.62 (0.013 sec)
Step 900: loss = 0.60 (0.012 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 47143  Precision @ 1: 0.8571
Validation Data Eval:
  Num examples: 5000  Num correct: 4308  Precision @ 1: 0.8616
Test Data Eval:
  Num examples: 10000  Num correct: 8595  Precision @ 1: 0.8595
Step 1000: loss = 0.39 (0.013 sec)
Step 1100: loss = 0.52 (0.100 sec)
Step 1200: loss = 0.44 (0.012 sec)
Step 1300: loss = 0.40 (0.013 sec)
Step 1400: loss = 0.52 (0.012 sec)
Step 1500: loss = 0.34 (0.012 sec)
Step 1600: loss = 0.40 (0.011 sec)
Step 1700: loss = 0.30 (0.012 sec)
Step 1800: loss = 0.37 (0.012 sec)
Step 1900: loss = 0.27 (0.012 sec)
Training Data Eval:
  Num examples: 55000  Num correct: 49315  Precision @ 1: 0.8966
Validation Data Eval:
  Num examples: 5000  Num correct: 4509  Precision @ 1: 0.9018
Test Data Eval:
  Num examples: 10000  Num correct: 8949  Precision @ 1: 0.8949
```

> http://stackoverflow.com/questions/40513466/tensorflow-retrain-py-app-run-got-unexpected-keyword-argument-argv

みたいな感じで成功です。