Winsows10でゼロから機械学習環境を作ってみる

# はじめに

皆さん、やってますか？

**機械学習**

ここ数年、第3次AIブームなんて言われて、もてはやされているアイツです。
人工知能、機械学習、ニューラルネットワーク、ディープラーニング
最近、黙々と勉強してはいますが、 ん～…なんだか難しいですね…。

今回は、その辺はいったん置いておいて、機械学習の環境をサクッと作っちゃいましょうというお話です。
意外と簡単に作れちゃいます。
(参考記事はたくさんあると思いますが、自分用メモも兼ねてます）

`Google Colaboratory`でいいじゃん～って方は
[こちら](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

# PC環境
・**OS**:Windows10 Pro
・**GPU**:GeForce 940MX
・**CPU**:Core i5-7200U
・**メモリ**:16GB

# nVIDIA CUDA ToolkitとcuDNNのインストール
まずは [こちらの記事](https://dev.infohub.cc/install-cuda-toolkit-10/#nVIDIA_CUDA_Toolkit_10) を参考に`CUDA Toolkit`と`cuDNN`をインストールしちゃいましょう。
`TensorFlow(GPU版)`を使う場合に必要になるためです。

注意点としては、記事中のリンクでCUDAをダウンロードしてしまうと、最新の10.1になってしまい、TensorFlowで使う場合シンボリックリンクを設定しなければならないため、[こちら](https://developer.nvidia.com/cuda-10.0-download-archive) から10.0のアーカイブをダンロードしてインストールした方が楽です。

# Anacondaのインストール
Pythonの環境は`Anaconda`を使います。

実のところ一度、素の`Python3.7`環境でも機械学習の環境を作りました。
そして`「Windows10でAnacondaなしで機械学習環境を作る」`みたいな記事を書こうと思いました。

ですが、調べているうちに`condaでインストールした環境の方が速度が速い`という記事をいくつか見つけたため、
「え～？じゃあAnaconndaで環境作り直す～？」
という気持ちで改めて、AnacondaでPython環境を構築しました。

ということでまずは[Anacondaの公式](https://www.anaconda.com/distribution/)からインストーラをダウンロードしてインストールします。

途中の
`Add Anaconda to my PATH environment variavle`
はチェックを入れておけば、環境変数にAnaconda系のパスが勝手に入ると思います。

インストール後は、コマンドプロンプトやPowerShell等で

`conda` `python` `pip`
の3つを実行しパスが通っているか確認しましょう。

# 仮想環境作成
AnacondaはPythonの環境をお手軽に作れてしまします。
どういう利点があるのかとか、詳しく知りたい人は今回はGoogle先生にお任せします。

仮想環境を作成するコマンドは以下

```console
> conda create --name myenv python=3.7
```
myenvの部分は仮想環境の名前なのでお好きな名前にしちゃってください。
これだけで環境がバンバン作れちゃいます。

環境の切り替えは

```console
> conda activate myenv
```

で切り替えられます。

※ 注意として、よく見かけるのが、condaがついていない

```console
> activate myenv
```
ですが、古いバージョンの書き方のようで、
一見何もエラーがなく切り替わったように見えますが、
後述の`info`で調べても環境が切り替わっていません。

自分が今どの環境をアクティブにしているか確認するには

```console
> conda info -e
```
で以下のように確認できます。

```console
# conda environments:
#
base                     C:\Users\<ユーザー名>\Anaconda3
myenv                 *  C:\Users\<ユーザー名>\Anaconda3\envs\myenv
```
「*」がついているのが現在の環境です。

# 必要そうなパッケージのインストール
`必要そうな`と書いているように、もしかしたらいらないかもしれません。
いろんな機械学習を試してみたい！って場合は必要かも。

```console
conda install pandas
conda install scikit-learn
conda install scikit-image
```

# OpenAI Gym環境インストール
```console
pip install gym
conda install -c conda-forge jsanimation
conda install pyglet
conda install -c conda-forge ffmpeg
pip install --no-index -f https://github.com/Kojoley/atari-py/releases atari_py
```
`conda install`と`pip install`を混在させると環境が壊れるという話もあるので、
できれば`pip install`は使わないようにしたいのですが、Anacondaにパッケージがない場合はやむなし…。

# KerasとTensorFlow環境インストール
`TensorFlow`あれば`Keras`内包されてるし、いらないんじゃない？
という意見もあるかと思いますが、サンプルとかで混在している場合もあったりするので、念の為。

```console
conda install -c conda-forge keras
conda install pydotplus
conda install tensorflow
conda install tensorflow-gpu
```

# 完成！
以上で、ある程度の機械学習の環境が整いました。

<details><summary>最終的な`conda list`</summary><div>

```console
# Name                    Version                   Build  Channel
_tflow_select             2.1.0                       gpu
absl-py                   0.8.1                    py37_0
astor                     0.8.0                    py37_0
astroid                   2.3.2                    py37_0
atari-py                  1.2.1                    pypi_0    pypi
blas                      1.0                         mkl
ca-certificates           2019.10.16                    0
certifi                   2019.9.11                py37_0
cloudpickle               1.2.2                      py_0
colorama                  0.4.1                    py37_0
cudatoolkit               10.0.130                      0
cudnn                     7.6.4                cuda10.0_0
cycler                    0.10.0                   py37_0
cytoolz                   0.10.0           py37he774522_0
dask-core                 2.6.0                      py_0
decorator                 4.4.1                      py_0
ffmpeg                    4.2                  h6538335_0    conda-forge
freetype                  2.9.1                ha9979f8_1
future                    0.18.2                   pypi_0    pypi
gast                      0.2.2                    py37_0
google-pasta              0.1.7                      py_0
grpcio                    1.16.1           py37h351948d_1
gym                       0.15.4                   pypi_0    pypi
h5py                      2.9.0            py37h5e291fa_0
hdf5                      1.10.4               h7ebc959_0
icc_rt                    2019.0.0             h0cc432a_1
icu                       58.2                 ha66f8fd_1
imageio                   2.6.1                    py37_0
intel-openmp              2019.4                      245
isort                     4.3.21                   py37_0
joblib                    0.14.0                     py_0
jpeg                      9b                   hb83a4c4_2
jsanimation               0.1                        py_1    conda-forge
keras                     2.3.1            py37h21ff451_0    conda-forge
keras-applications        1.0.8                      py_0
keras-preprocessing       1.1.0                      py_1
kiwisolver                1.1.0            py37ha925a31_0
lazy-object-proxy         1.4.3            py37he774522_0
libgpuarray               0.7.6             hfa6e2cd_1003    conda-forge
libpng                    1.6.37               h2a8f88b_0
libprotobuf               3.9.2                h7bd577a_0
libtiff                   4.1.0                h56a325e_0
mako                      1.1.0                      py_0    conda-forge
markdown                  3.1.1                    py37_0
markupsafe                1.1.1            py37hfa6e2cd_0    conda-forge
matplotlib                3.1.1            py37hc8f65d3_0
mccabe                    0.6.1                    py37_1
mkl                       2019.4                      245
mkl-service               2.3.0            py37hb782905_0
mkl_fft                   1.0.15           py37h14836fe_0
mkl_random                1.1.0            py37h675688f_0
networkx                  2.4                        py_0
numpy                     1.17.3           py37h4ceb530_0
numpy-base                1.17.3           py37hc3f5095_0
olefile                   0.46                     py37_0
opencv-python             4.1.1.26                 pypi_0    pypi
openssl                   1.1.1d               he774522_3
opt_einsum                3.1.0                      py_0
pandas                    0.25.2           py37ha925a31_0
pillow                    6.2.1            py37hdc69c19_0
pip                       19.3.1                   py37_0
protobuf                  3.9.2            py37h33f27b4_0
pydotplus                 2.0.2                    py37_1
pyglet                    1.3.2                    pypi_0    pypi
pygpu                     0.7.6           py37hc8d92b1_1000    conda-forge
pylint                    2.4.3                    py37_0
pyparsing                 2.4.2                      py_0
pyqt                      5.9.2            py37h6538335_2
pyreadline                2.1                      py37_1
python                    3.7.5                h8c8aaf0_0
python-dateutil           2.8.1                      py_0
pytz                      2019.3                     py_0
pywavelets                1.1.1            py37he774522_0
pyyaml                    5.1.2            py37hfa6e2cd_0    conda-forge
qt                        5.9.7            vc14h73c81de_0
scikit-image              0.15.0           py37ha925a31_0
scikit-learn              0.21.3           py37h6288b17_0
scipy                     1.3.1            py37h29ff71c_0
setuptools                41.6.0                   py37_0
sip                       4.19.8           py37h6538335_0
six                       1.12.0                   py37_0
sqlite                    3.30.1               he774522_0
tensorboard               2.0.0              pyhb230dea_0
tensorflow                2.0.0           gpu_py37h57d29ca_0
tensorflow-base           2.0.0           gpu_py37h390e234_0
tensorflow-estimator      2.0.0              pyh2649769_0
tensorflow-gpu            2.0.0                h0d30ee6_0
termcolor                 1.1.0                    py37_1
theano                    1.0.4           py37h6538335_1000    conda-forge
tk                        8.6.8                hfa6e2cd_0
toolz                     0.10.0                     py_0
tornado                   6.0.3            py37he774522_0
tqdm                      4.36.1                     py_0
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.16.27012          hf0eaf9b_0
vs2015_win-64             14.0.25420          h55c1224_11
webencodings              0.5.1                    py37_1
werkzeug                  0.16.0                     py_0
wheel                     0.33.6                   py37_0
wincertstore              0.2                      py37_0
wrapt                     1.11.2           py37he774522_0
xz                        5.2.4                h2fa13f4_4
yaml                      0.1.7             hfa6e2cd_1001    conda-forge
zlib                      1.2.11               h62dcd97_3
zstd                      1.3.7                h508b16e_0
```
</div></details>

# まとめ
つらつらとインストールして、今は1つの仮想環境にいろいろまとめて入っていますが。
`用途`によって`別途仮想環境を作って分けて`もいいと思います。

あとは、サンプルを探して動かしてみるなり、
自分で試行錯誤してみたり、いろいろ試せるようになると思います！

・
・
・
と言いたいところですが、`TensorFlow2.0.0`のサンプルがまだまだ転がってない状況なんですよね…。
過去バージョンのサンプルはたくさんあるのですが、`2.0.0`で変わった箇所が多く、そのままでは動かないこと多数です。

[TensorFlowの公式](https://www.tensorflow.org/tutorials)も`GoogleColaboratory`でチュートリアルを体験できるようになっています。
（Googleが開発したライブラリなので当然っちゃ当然ですが）

なので、旧バージョンのサンプルを自分なりに理解して、改変できるくらいの知識はやはり必要そうですね…\_(┐「ε:)_

まだまだ機械学習についてはで勉強中ですが、今後何かおもしろいことができるようになってきたら、
自分の脳のメモリが追いつく限り、発信していければなーと思っています！
~~（既にパンパン）~~