Ubuntu環境上でPyCharmを使った機械学習の環境を構築する（TensorFlowも導入するよ！）

昨今流行りの機械学習ですが、環境構築が難しい場面が多く感じられたので、備忘録兼一つの情報提供になればと思い記事にします。

**環境**
Windows10上のUbuntu 16.04.1 LTS(VirtualBoxを使用）
※環境構築に関しては他サイトなどを参考にしてください[ [1]](http://qiita.com/ykawakami/items/4bae371932110b2e25e3)[ [2] ](http://sicklylife.hatenablog.com/entry/2016/11/28/210512)[[3]](http://sicklylife.hatenablog.com/entry/2016/11/28/210525)

##記事の目的
この記事はインストールされたばかりのゲストOSであるUbuntuで機械学習やディープラーニングをPyCharmで行えるようにするというものです。具体的にはTensorFlowやNumPyなどを使用できるようにする。

※今回はCPUのみのTensorFlow環境をつくります。
※間違いやほかにうまいやり方がありましたら指摘していただけると嬉しいです。

##手順
1. Anaconda3のインストール(これにより基本のPython環境を整えます)
2. Python3.5環境の構築
3. PyCharmのインストール・設定
4. TensorFlowのインストール
5. 確認

※記事を通して出てくるコードはLinuxコマンドかPythonです。コードの上に特に記述がなければLinuxコマンドです。また、Linuxコマンドはすべて一般ユーザー(管理者ではない)として実行しています（$などの表記は省略してます）。

##Anaconda3のインストール
[こちら](https://www.continuum.io/downloads)から、OSのビットやPythonのバージョンなどを確認して、適切なものをインストールします。私はLinux向けPython3.6のインストーラをダウンロードしました。詳しくは[こちら[4]](http://pythondatascience.plavox.info/python%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/anaconda-ubuntu-linux/)を参照してください。
![anaconda_install.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/c65c5bb3-80e7-b7f3-1368-f4c7b5871ab7.png)



インストールが終わったら、~/Downloadsディレクトリ配下にshファイルができています。以下のコマンドを打ちます。[4]のサイトを参考にして進めます（基本yes/noと聞かれたらyesそれ以外はEnterを押してれば大丈夫です）。
```bash ~/Downloads/Anaconda3-4.3.0-Linux-x86_64.sh
echo 'export PATH=/home/user/anaconda3/bin:$PATH' >> ~/.bashrc
source ~/.bashrc```

※(Anacondaのバージョンは現時点では上記のバージョンがインストールされるようです。バージョンは確認してから、コマンドを実行してください）
これで以下のコマンドでcondaのバージョンが表示できればOKです。

```conda -V #conda 4.3.8```

ついでにPythonのバージョンも確認します。
```python --version #Python 3.6.0 :: Anaconda 4.3.0 (64-bit)```

pythonのバージョンは3.6.0のようです。
ここで注意しなければならないのは、TensorFlowは現時点では、Python3系の場合3.5までに対応しているようです。そのため、これからanacondaでTensorFlowのための環境を構築します。


##Python3.5の環境を作る
以下のコマンドを実行してください。tfという名前でPython3.5バージョンの環境を作ります。

```conda create -n tf python=3.5 anaconda```

これで、source arctivate tfでpython3.5の環境に入れるようになります。コマンドを実行しましょう。
(終了する場合はsource deactivate)

```
source arctivate tf
```
##TensorFlowのインストール
TensorFlowをインストールします。下記コマンドを実行してください。
```
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl
pip install --upgrade $TF_BINARY_URL
```

##PyCharmのインストール
[ここ](http://www.jetbrains.com/pycharm/download/#section=linux)から、PyCharmをダウンロードします。今回はcommunityエディションを用います。

ダウンロードしたファイルの置かれたディレクトリに行きます。ディレクトリが分からない場合は、Firefoxでは右上の下矢印ボタンをクリックしダウンロード一覧が見れます。ディレクトを見たいファイルの右隣にあるフォルダボタンをクリックすると、該当のファイルが置かれたディレクトリに飛びます。

ディレクトリの中で、今回は「pycharm-community-2016.3.2.tar.gz」ファイルを解凍します。コマンドでもいいですが、今回はファイルを右クリックし「Extract to」を選択し、解凍先を指定しつつ解凍します。解凍先はユーザーのホームディレクトリにしました。

下記コマンドでPyCharmが実行されます。

```
bash pycharm-community-2016.3.2/bin/pycharm.sh 
```

Create New Projectで新規プロジェクトを作成してください。
![Pycharm_newProject.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/66b88ba4-c5db-4f9d-68cc-ecc4966aae26.png)

次に、Interpreterを指定します。私の環境では、~/anaconda3/envs/tf/bin/pythonを指定しました。どれが指定すべきか分からない場合はとりあえず、デフォルトのまま先に進んでください。プロジェクトが作成されます(時間がかかる場合あり）。
![pycharm_interpreter.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/2b8eb9a1-1113-3323-4c2e-961a0548ef41.png)

Interpreterの選び方ですが、ツールバーのFile->settings->Project:プロジェクト名->Project Interpreterを選択する。
※settingsがpreferenceという場合もあるらしい

![asdf.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/e5dc4d48-0d35-115c-d580-2173fc4fae7a.png)

プルダウンでInterpreterの選択ができます。また、どのようなパッケージが入っているか見れますので、必要なものが入っているものを選んでください。今回はtensorflow、matplotlib、numpyが入っているかどうかで判断しました。

![sdf.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/a6a3f2c1-a11b-72f9-28d0-86349d6dd075.png)
※パッケージやバージョンが確認できる

##確認
それでは、実際にTensorFlowなどがちゃんと動くかチェックしてみます。
Pythonファイルを作成します。今回はmain.pyとしました。

![sa.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/cc053ec2-2e61-04aa-4a64-3890956fe321.png)

以下のPythonコードを打ち込み実行してください（実行はctrl+shift+F10でできます）。[こちら](http://dev.classmethod.jp/machine-learning/tensorflow-hello-world/)を参考にしました(ただし、Python2系で書かれていたので、Python3系に書き直しています)。

```python:main.py
import tensorflow as tf
import multiprocessing as mp

core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num)
sess = tf.Session(config=config)

hello = tf.constant('hello, tensorflow!')
print(sess.run(hello))

a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a + b))
```

以下のような結果になれば成功です
![result.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/105b111f-c37a-6946-5733-dbf2d4f905f7.png)

また、MatplotlibとNumPyについても見てます。コードを上書きしてください。[こちら](www.turbare.net/transl/scipy-lecture-notes/intro/matplotlib/matplotlib.html)を参考にしました。

```python:main.py
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)

plt.plot(X, C)
plt.plot(X, S)

plt.show()
```
以下のようになれば成功です。
![matresult.PNG](https://qiita-image-store.s3.amazonaws.com/0/120532/c77587ea-4d89-b62a-b936-161e76314f25.png)

以上となります。お疲れさまでした！
繰り返しになりますが、誤ってる点や改善すべき点がありましたらコメントをください。喜びます。
また、リンクをした記事を筆頭に有益な情報を共有してくれる方々に感謝しています。
さいごに、楽しい機械学習ライフを！