(103) TensorFlow #1 : はじめての TensorFlow

(103) TensorFlow #1 : はじめての TensorFlow

1. やりたいこと

とりあえず触れてみるだけ。
今回は以下の公式ホームページに従ってインストール&チュートリアルをやってみる。

2. 環境

TensorFlowは、現在進行形で日々改良が加えられているようだ。

ということは…
あるとき突然不具合のあるバージョンを入れたがために環境が壊れてしまうかもしれない。

ということで…
以下の仮想マシン上に実験環境を作ることにした。
・VirtualBox : 5.2.18
・Ubuntu : 18.04
環境を更新する前に VMのスナップショットを記録しておけば安心だ。

3. やってみる

(1) インストールする。

仮想マシン上に Ubuntu18をインストールし、ここに TensorFlowをインストールする。
すでに Ubuntuのインストールが終わった状態からの作業手順を記録する。

1) 必要なパッケージを入れる。

sudo apt-get update
sudo apt-get install python-virtualenv python3-pip python3-dev python-launchpadlib
pip install --upgrade pip

2) TensorFlow実験用に Python仮想環境を作る。

mkdir ~/tensorflow
cd ~/tensorflow
virtualenv --system-site-packages -p python3 venv
source ~/tensorflow/venv/bin/activate
python -V    # Pythonのバージョンを確認

3) TensorFlowをインストールする。

pip install --upgrade pip
# pip install --upgrade tensorflow  # これだと import tensorflow でコアダンプする...
pip install tensorflow==1.5

Pythonが動くか試してみる。

import tensorflow as tf
print(tf.__version__)

エラーなく TensorFlowのバージョンが表示されればOK

1.5.0

(2) チュートリアルを動かす。

こちらのページのチュートリアルを実行してみる。

TensorFlowをロードする。

import tensorflow as tf

まずは MNIST手書き文字データをロードし、0~255の画素値を 0~1に正規化する。

# MNIST手書き文字画像データをロード
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()

# 画素値を 0~1 に正規化
x_train, x_test = x_train / 255.0, x_test / 255.0

モデルを作成

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

学習を実行

model.fit(x_train, y_train, epochs=5)

実行中のログはこんな感じで出力される。
5 epochsで正解率(accuracy)が 96.3%から 98.6%まで上昇した。
1 epoch目で 96.3%とはかなり優秀なモデルだ。

テストを実行

model.evaluate(x_test, y_test)

学習に使った画像データで高正解率なのは当然なこと。
学習に使っていない画像データでテストした結果は?

なんと 97.99% と高正解率!

とっても優秀なモデルだな。

4. おまけ

(1) MNIST画像を覗いてみる。

まずは MNIST画像データをロードする。

import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()

どう格納されている?

x_train.shape
(60000, 28, 28)

x_train[60000][28][28] の三次元配列だった。

すなわち…
学習用の画像データは 28 x 28ピクセルサイズの画像が 60000枚ある。

先頭 1個(x_train[0])を画像化して見てみる。

from PIL import Image
img = Image.fromarray(x_train[0])
img.show()

たぶん 5 だろう。

y_trainの方も見てみる。

y_train.shape
(60000,)

y_train[60000] の一次元配列だった。

先頭から 3個だけ中身を見てみる。

y_train[0:3]
array([5, 0, 4], dtype=uint8)

x_trainの先頭には 5 の画像が入っていた。
y_trainの方には正解データが入っているようだ。
3個目が 4 かを確認してみる。

img = Image.fromarray(x_train[2])
img.show()

たぶん 4 だろう。

とりあえず先頭から 100個だけ PILで PNG画像ファイル化してみた。

import tensorflow as tf
from PIL import Image

mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()

for i in range(0,100):
    img = Image.fromarray(x_train[i])
    img.save("./mnist_%05d.png" % i, 'PNG')

日本人は字がキレイと言われるのが何となくわかるなぁ

5. 備忘録

1) 仮想マシン上での実行は遅い。いずれは物理サーバー上に環境を作ろう。

2) 以下の警告が出た。SIMD命令を有効にするため TensorFlowをソースからコンパイルして作った方がよい。

Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2

3) インストールした物の組み合わせによっては正しく動かない場合があるみたい。
 コアダンプする場合もあった。発展途上の物なのでこれは仕方がないか…
 今後、回避策を要検討。
 ・TensorFlowはソースから作る。
 ・その他


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*