仮想環境にPythonとTensorFlowを入れる(忘備録)

タイトル通りのことをやったので，メモとして書いた記事です.
ただの忘備録なので，記事の新規性についての突っ込みは勘弁してください．

# 本記事は以下に該当する人向けです

* AI? 機械学習? 楽しそう!
* Python? 知らねえ!
* TensorFlow? 知らねえ!
* Virtual Environment? 強そう!!!!!!!!!

このぐらいの知識量の方向けの記事です．
「なんだか知らんけど動く！なんか楽しい！」を意識した記事です．
このあたりを触った経験がある方は，本記事から得られることがないのでブラウザバック推奨です．

# この環境からスタートです

本記事はこんな環境からスタートします．

* Windowsが入っている
* インターネットにアクセスできる
* SSDもしくはHDDに100GBぐらい空きがある
* 7zipとかの大容量ファイルを展開できるソフトがある

# こんなことします

これからやることをざっくりと説明します．

* Virtual Boxのインストール
* isoファイルを入手
* 仮想Ubuntuの構築
* Pythonのインストール
* pipのインストール
* TensorFlowのインストール
* Sublime Textのインストール
* TensorFlowで遊んでみる(テスト)

Pythonは3系を入れます．
2018年11月現在で，あえてPython2系を入れる必要があるケースは稀だと思いますし...

# 仮想環境ってなに?

テキトーに説明すると，「OSの中にOSを用意する」ことです．
もともとあったOSからメモリとHDDの容量を借りてきて，その資源を使ってOSの中で別のOSを動かすことができます．

そんなことして何がいいの? と思われるかもしれませんが...
**よくわからなくなった時に容赦なくリセットできる**
という利点があります．

特に，自分で初めて行う環境構築なんかでは「やってるうちに何がなんだかわからなくなった」ということがよくあります．
仮想環境上に大事なデータを入れていない限りは，また環境構築をすればいいだけなので容赦なくデータを吹き飛ばせるというわけです.

「でもいちいち環境を作りなおすの面倒じゃないの?」とお思いの貴方．
**作って壊してを繰り返しているうち，環境構築に慣れて楽になってくるので大丈夫です**


# まずはVirtual Boxから

Virtual Boxは仮想環境を利用するために使うやつです．

[ここ](https://www.virtualbox.org/wiki/Downloads)に飛んで，「Virtual Box \<バージョン> Platform Packages」の「Windows Hosts」をクリックしてダウンロードします．

ダウンロードしたexeファイルを起動すると，セットアップが始まります．
英語がたくさん出てきて「なんのこったよ」って感じになりますが，「Next」を押し続けて大丈夫です．
(デスクトップやスタートメニューを少しでも汚されたくない人は英語を頑張って読んでくださいね)

# isoをもらってくる

OSをインストールするには，それ用のファイルが必要です．
Virtual Boxで仮想OSを作成するときも必要になるので，ダウンロードしましょう．

[このへん](https://www.ubuntulinux.jp/download/ja-remix-vhd)からisoが入ったzipファイルをもらってきます．

余計なものがたくさん入ってますが，セットアップ手順が楽なやつです．

最新のバージョンをダウンロードします．
1GBもダウンロードするのでけっこうかかります．お茶飲んで待ちましょう．

ダウンロードできたらzipを展開します．
1GB超えたあたりのファイルはWindows標準のソフトやLhaplusでは解凍できなかったりするので，
それが可能なソフトで解凍しましょう．
(そのソフトはどうやってインストールするの?っていうのは本筋から離れすぎるので割愛します，ごめんなさい)

#Ubuntuの設定

以下，重要そうなところは適宜スクショを載せていきます．

さっきインストールしたVirtual Boxを起動して，左上のほうにある「新規」を押します．

![30.png](https://qiita-image-store.s3.amazonaws.com/0/303209/173302de-86ac-3b7d-5b5e-c69bc254a3d5.png)

名前はなんでもいいです．
今回は「PythonとTensorFlowのTest」なので「py_tf_test」にしました．
タイプに「Linux」バージョンに「Ubuntu(64-bit)」を選択．

![31.png](https://qiita-image-store.s3.amazonaws.com/0/303209/e8c828e9-ca92-402e-3e43-52d6f1b8a35e.png)


次に仮想OSへ割り当てるメモリサイズの選択です．
普通のPCで遊ぶならせいぜい1~2GBかと思いますが，
(私の環境では)画面酔いするレベルで処理落ちしたので，酔いやすい方はお気をつけて．
私は数秒で酔いました，

仮想OSをインストールした後でも変更できます．

![34.png](https://qiita-image-store.s3.amazonaws.com/0/303209/125cce8f-e4d2-d937-7a5e-8011832b4f3b.png)

次にストレージの割り当てを行います．「すでにある仮想ハードディスクを使用する」のところにあるフォルダをクリックして，先ほど展開したファイルの中にある「ubuntu-ja-\<version>-desktop-amd64.vhd」を選択し，「作成」をクリックします．

これで設定が出来上がりました．Virtual Boxの左側に出てくるのでクリックして選択，
画面左上あたりにある「起動」をクリックします．

# 仮想環境を削除したい

「なんかうまくいかなくなった」「こいつに100GBも食われてるのやだ」とお思いの貴方．
Virtual Box上の仮想環境アイコンを右クリックして「除去」を選択すると削除できます．

#Ubuntuのインストール

日本語で懇切丁寧に書かれているうえ，めんどくさい設定が全部省いてありました．
**指示に従ってください!!!!!!以上!!!!!!!!!**

# 前準備
Pythonをインストールする前に，おまじないをかけておきましょう．

左上にある「コンピュータとオンラインリソースを検索」をクリックして，「terminal」と打ちます．
文字だらけの不格好なウィンドウが出てきます．この後は大体こちらで操作します．

terminalで次のように打ち込みます．
$はterminalの入力待ちを示す記号なので，打つ必要はないです．

```
$ sudo apt-get update
```

非常にざっくりと説明すると，「大抵の人が使うようなソフトをインストールできる状態にしておく」コマンドです．


# Pythonのインストール

お待たせしました．Pythonをインストールしましょう．
Pythonは可読性の高さ，扱いやすさ，拡張しやすさが特徴の言語です．
機械学習系の開発が盛んなので，今回はこれを使って楽に機械学習してみましょう．
一緒にpipも入れておきましょう．Pythonを楽に拡張するためのツールです．

terminalで次のように打ち込んでください．

```
$ sudo apt-get install python3
$ sudo apt install python3-pip
```

# TensorFlow(keras)のインストール

次にTensorFlowをインストールします．
TensorFlowは，雑に言うと機械学習でよく使うやつです．
Kerasがあると楽に機械学習ができるので，そっちも入れてしまいましょう．

terminalで次のように打ち込みます．

```
$ pip3 install tensorflow
$ pip3 install keras
```

#sublimetextのインストール

正直なところエディタはなんでもいいのですが，今回はSublimeTextをインストールします．
[ここ](https://www.sublimetext.com/3)からダウンロードできるので，適当な位置に展開します．

展開したら起動して，次へ進みましょう．

#TensorFlow(keras)で遊ぶ
MNISTという，手書き文字の判定コードを動かしてみましょう．
下のコードをSublimeTextにコピペして，ホームディレクトリにでも保存しましょう．
「コードに何が書いてあるの?」ってあたりは割愛します．

```sample.py
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

batch_size = 128
num_classes = 10
epochs = 20

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784) # 2次元配列を1次元に変換
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')   # int型をfloat32型に変換
x_test = x_test.astype('float32')
x_train /= 255                        # [0-255]の値を[0.0-1.0]に変換
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

model.summary()
model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

history = model.fit(x_train, y_train,  # 画像とラベルデータ
                    batch_size=batch_size,
                    epochs=epochs,     # エポック数の指定
                    verbose=1,         # ログ出力の指定. 0だとログが出ない
                    validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

```
保存したら，terminalで次のように打ち込み，プログラムを起動しましょう．

```
$ cd ~/
$ python3 keras.py
```

実行後，データを読み込むため出力まで多少時間がかかります。
下のような見た目になれば成功です．
(値は実行ごとに多少の差があると思います)

```terminal
Using TensorFlow backend.
60000 train samples
10000 test samples
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 512)               401920
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0
_________________________________________________________________
dense_2 (Dense)              (None, 512)               262656
_________________________________________________________________
dropout_2 (Dropout)          (None, 512)               0
_________________________________________________________________
dense_3 (Dense)              (None, 10)                5130
=================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________
Train on 60000 samples, validate on 10000 samples

Epoch 18/20
60000/60000 [==============================] - 7s 117us/step - loss: 0.0182 - acc: 0.9948 - val_loss: 0.1091 - val_acc: 0.9829
Epoch 19/20
60000/60000 [==============================] - 7s 118us/step - loss: 0.0199 - acc: 0.9951 - val_loss: 0.1045 - val_acc: 0.9834
Epoch 20/20
60000/60000 [==============================] - 7s 119us/step - loss: 0.0193 - acc: 0.9953 - val_loss: 0.1097 - val_acc: 0.9835
Test loss: 0.10974634569421897
Test accuracy: 0.9835
```

# おわりに

正直なところ，本記事と同一内容の記事は大量にあるので，
この記事では「とりあえず動いて楽しくなれる」ことを意識した記事を書きました．

今回使用したUbuntuの日本語Remixですが，libre officeをはじめとして不要なものがごろごろ転がっているうえ，
妙に重くて使いにくいと感じたので，気分がのれば本家のisoでやり直したものに更新するかもしれません．