TensorFlow超入門
目次
1 概要
1.1 TensorFlowの概要
- Pythonが人気になった一番の理由かもしれない、超有名AIライブラリ
- 最新バージョンのバイナリ配布物はCPUの拡張命令であるAVXをサポートされている必用あり(AVX無しタイプのバイナリを生成すれば、AVX拡張命令の無いCPUでも実行可能)
1.2 この文書の概要
- TensorFlow関係の入門者用文書
- Dockerイメージを利用して行う
- 実際の作業部分を真似しやすいように作成
- 学習手順として、実際やってみてから、修正したり調べた方が効率良いケースが多い為
- ベースはTensorflowの本家の文書なので、この文書のライセンスもTensorflowの本家と同じとします。
2 リンク
2.1 本家
- TensorFlow 本家
- https://www.tensorflow.org/
- TensorFlow tutorial
- https://www.tensorflow.org/tutorials
- TensorFlow API
- https://www.tensorflow.org/api_docs/python/tf
3 インストール(今後動画では直接環境にインストールするのではなく、Docker経由で作業を行います。次の章で使うDocker イメージを作成します。)
- 最新バイナリはCPUの拡張命令AVXを利用するバイナリになっています。AVX命令をサポートしていないCPUの場合は、1.5以前のバージョンのtensorflowを使えば、コンパイル無しに利用可能(コンパイルルすれば、新しいバージョンでも使えますが、マシン性能にもよりますが、コンパイルに24時間程度必用)
- 環境差を軽減するため、Dockerを利用して作業していきます。
- WindowsやMacの場合、Ubuntu等Linuxの仮想環境や模擬環境であれば、ほぼ同じ操作で可能だと思います。
- 直接インストールしてもほぼ同じような手順で作業可能
3.1 以下の操作を行っている動画
3.2 Dockerによるローカルへのインストール手順
- まずDockerをインストールしてください。「利用OS Docker インストール」でネット検索あるいは、Docker本家の文書にインストール手順https://docs.docker.com/install/が確認出来ます。
- Linux系なら、docker.io パッケージをインストール(Debian,Ubuntuなら sudo apt install docker.io )で簡単にインストール出来ます。
3.2.1 Dockerで提供されているtensorflow/tensorflowのイメージpull
- Docker HubのURLはhttps://hub.docker.com/r/tensorflow/tensorflow/
- cat /etc/issue して確認したところ、ベースは Ubuntu 18.04.3 LTS になっていた(2020/01/23時点)
docker pull tensorflow/tensorflow docker pull tensorflow/tensorflow:latest-py3-jupyter
3.2.2 動作確認
- 以下の起動コマンドはhttps://hub.docker.com/r/tensorflow/tensorflow/で確認可能、一番下のRunning Containersに説明あり(ここでは説明していない起動方法もあり)
- 以下のコマンドを実行し、表示されるlocalhost:8888のURLをブラウザで開く
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter
- ブラウザじゃなくて、コマンドラインで動かしたい場合は以下
docker run -it --rm tensorflow/tensorflow bash
4 最初の実行
- Beginner quickstart https://www.tensorflow.org/tutorials/quickstart/beginnerをベースにやってみます
4.1 関係する部分のリファレンス
- Module: tf.keras.datasets https://www.tensorflow.org/api_docs/python/tf/keras/datasets
- Module: tf.keras.models https://www.tensorflow.org/api_docs/python/tf/keras/models
- tf.keras.Sequential https://www.tensorflow.org/api_docs/python/tf/keras/Sequential
- Module: tf.keras.optimizers https://www.tensorflow.org/api_docs/python/tf/keras/optimizers
- tf.keras.optimizers.Adam https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Adam
- Module: tf.keras.losses https://www.tensorflow.org/api_docs/python/tf/keras/losses
- tf.keras.losses.sparse_categorical_crossentropy https://www.tensorflow.org/api_docs/python/tf/keras/losses/sparse_categorical_crossentropy
- Module: tf.keras.layers https://www.tensorflow.org/api_docs/python/tf/keras/layers
- tf.keras.layers.Flatten https://www.tensorflow.org/api_docs/python/tf/keras/layers/Flatten
- tf.keras.layers.Dense https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense
- tf.keras.layers.Dropout https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dropout
- Module: tf.keras.metrics https://www.tensorflow.org/api_docs/python/tf/keras/metrics
- tf.keras.metrics.Accuracy https://www.tensorflow.org/api_docs/python/tf/keras/metrics/Accuracy
- Module: tf.nn https://www.tensorflow.org/api_docs/python/tf/nn
- matplotlib https://matplotlib.org/contents.html
- matplotlib.pyplot https://matplotlib.org/api/pyplot_summary.html
- 活性化関数 https://ja.wikipedia.org/wiki/%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95%B0
- ランプ関数 https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%97%E9%96%A2%E6%95%B0
- 交差エントロピー https://ja.wikipedia.org/wiki/%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC
- softmax関数 https://en.wikipedia.org/wiki/Softmax_function
4.2 本家のBeginner quickstart部分
#!/usr/bin/env python # coding: utf-8 # In[1]: # tutorial # https://www.tensorflow.org/tutorials # https://www.tensorflow.org/tutorials/quickstart/beginner import tensorflow as tf import numpy as np tf.__version__ # In[2]: mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # データ読み込み x_train, x_test = x_train / 255.0, x_test / 255.0 # 正規化 # In[3]: # モデルの構築 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), # 入力の形式指定 tf.keras.layers.Dense(128, activation='relu'), # 活性化関数としてrelu(ランプ関数)を使って、ノード128のlayer作成 tf.keras.layers.Dropout(0.2), # 過学習を軽減する為らしい tf.keras.layers.Dense(10, activation='softmax') # 関数softmax ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # In[4]: model.fit(x_train, y_train, epochs=5) model.evaluate(x_test, y_test, verbose=2) # In[5]: x_train.shape # In[6]: y_train.shape # In[7]: x_train[0][0] # In[8]: len(np.array(x_train)[0]) # In[9]: y_train[2] # In[10]: x_train[0] # In[11]: import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.imshow(x_train[2], cmap="gray") print(y_train[2]) # In[12]: model.predict(x_train) # In[13]: type(x_train) # In[14]: type(x_train[0]) # In[15]: model.predict_classes(np.stack([x_train[0],x_train[1]])) # In[16]: (y_train[0],y_train[1]) # In[17]: ps=model.predict_classes(x_test) # In[18]: ps # In[19]: fx=x_test[ps!=y_test] fy=y_test[ps!=y_test] fps=ps[ps!=y_test] fps2=y_test[ps!=y_test] # In[20]: [fx.shape,fy.shape] # In[21]: fps # In[22]: fps2 # In[23]: fig2, ax2 = plt.subplots() ax2.imshow(fx[0], cmap="gray") # In[24]: fig3, ax3 = plt.subplots() ax3.imshow(fx[1], cmap="gray") # In[25]: print(y_test.shape) # In[26]: 100.0*len(fx)/len(y_test) # In[27]: model.evaluate(x_test, y_test, verbose=2) # In[ ]:
- 上を実行したら
In [1]:
# tutorial
# https://www.tensorflow.org/tutorials
# https://www.tensorflow.org/tutorials/quickstart/beginner
import tensorflow as tf
import numpy as np
tf.__version__
Out[1]:
In [2]:
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
In [3]:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
In [4]:
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Out[4]:
In [5]:
x_train.shape
Out[5]:
In [6]:
y_train.shape
Out[6]:
In [7]:
x_train[0][0]
Out[7]:
In [8]:
len(np.array(x_train)[0])
Out[8]:
In [9]:
y_train[2]
Out[9]:
In [10]:
x_train[0]
Out[10]:
In [11]:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.imshow(x_train[2], cmap="gray")
print(y_train[2])
In [12]:
model.predict(x_train)
Out[12]:
In [13]:
type(x_train)
Out[13]:
In [14]:
type(x_train[0])
Out[14]:
In [15]:
model.predict_classes(np.stack([x_train[0],x_train[1]]))
Out[15]:
In [16]:
(y_train[0],y_train[1])
Out[16]:
In [17]:
ps=model.predict_classes(x_test)
In [18]:
ps
Out[18]:
In [19]:
fx=x_test[ps!=y_test]
fy=y_test[ps!=y_test]
fps=ps[ps!=y_test]
fps2=y_test[ps!=y_test]
In [20]:
[fx.shape,fy.shape]
Out[20]:
In [21]:
fps
Out[21]:
In [22]:
fps2
Out[22]:
In [23]:
fig2, ax2 = plt.subplots()
ax2.imshow(fx[0], cmap="gray")
Out[23]:
In [24]:
fig3, ax3 = plt.subplots()
ax3.imshow(fx[1], cmap="gray")
Out[24]:
In [25]:
print(y_test.shape)
In [26]:
100.0*len(fx)/len(y_test)
Out[26]:
In [27]:
model.evaluate(x_test, y_test, verbose=2)
Out[27]:
In [ ]:
4.3 この章のまとめ
- 実際に学習させ、学習させたものを評価してみた
- データがどのようになっているのか確認した
5 サンプル classification.ipynb (Fashion MNIST dataset)
- Docker image tensorflow/tensorflow に含まれているサンプル
- 中身は前章のサンプルとほぼ同じで、違うのは、データの指定
fashion_mnist = keras.datasets.fashion_mnist
- なので前章でやったものを以下に修正
# mnist = tf.keras.datasets.mnist mnist = tf.keras.datasets.fashion_mnist
- なので前章のデータを keras.datasets.fashion_mnist にしてやればほぼ同じ
- あと学習のepochの数値が5->10になっている
- ここでは、前章のファイルのデータ読み込み部分だけ変更して実行してみる
- 後でサンプルを実行して内容確認してみてください。
- サンプルファイルを開いて、Shift+Enter連打で動きます。
- イメージの起動は以下のコマンド
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter
5.1 以下の操作を行っている動画
6 サンプル regression.ipynb (車の燃費関係のデータ)
- Docker image tensorflow/tensorflow に含まれているサンプル
- gitをインストールしないと動かないので、シェルを起動して、gitをインストール
apt install git
- 後はサンプルファイルを開いて、Shift+Enter連打で動きます。
- イメージの起動は以下のコマンド
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter
6.1 以下の操作を行っている動画
7 サンプル object_detection.ipynbを動かしてみる
- FasterRCNN Openimages v4 https://tfhub.dev/google/faster_rcnn/openimages_v4/inception_resnet_v2/1
- ソース https://github.com/tensorflow/hub/blob/master/examples/colab/object_detection.ipynb
- A smaller and faster object detection module is available at
=
SSD Openimages v4 https://tfhub.dev/google/openimages_v4/ssd/mobilenet_v2/1 今回は使ってないけど似た使い方出来そう - Image object detection 関係のパッケージ https://tfhub.dev/s?q=Image%20object%20detection
- Tensorflow Object Detection API https://github.com/tensorflow/models/tree/master/research/object_detection
- Quantization-aware training https://github.com/tensorflow/tensorflow/tree/r1.13/tensorflow/contrib/quantize
7.1 以下の操作を行っている動画
7.2 事前準備
- 以下のコマンドを実行し、表示されるlocalhost:8888のURLをブラウザで開く
docker run -it --rm -v $(realpath ~/notebooks):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter
- 必用なフォントと、必用なパッケージを追加でインストール(シェルを立ち上げて)
pip3 install tensorflow_hub pip3 install pillow apt install fonts-liberation
- 元のノートをダウンロード、コマンドラインで行うなら以下、ブラウザでダウンロードして、ホームディレクトリのnotebooksフォルダに入れてもOK
cd ~/notebooks/
wget https://github.com/tensorflow/hub/raw/master/examples/colab/object_detection.ipynb
7.3 ソースの修正
def draw_boxes(image, boxes, class_names, scores, max_boxes=10, min_score=0.1): ...省略 display_str = "{}: {}%".format(class_names[i].numpy().decode("ascii"), int(100 * scores[i]))
- 上の部分を以下に修正(numpy()を除く)
def draw_boxes(image, boxes, class_names, scores, max_boxes=10, min_score=0.1): ...省略 display_str = "{}: {}%".format(class_names[i].decode("ascii"), int(100 * scores[i]))
7.4 実行
- Shift + Enter を押しまくり、実行
- 最後にシートを保存
7.5 この章について
- object detectionのサンプルソースを動かしてみた
- すでに訓練してくれてるデータが配布されていた
- 一部ソースを修正しないと動かなかった
- Dockerのtensorflow/tensorflowのイメージで動かすには追加のパッケージをインストールする必用があった
8 モデルの保存と読み込み
- tensorflow/tensflowに含まれているサンプル(save_and_load.ipynb)
- Writing custom layers and models with Keras https://www.tensorflow.org/guide/keras/custom_layers_and_models
- Using the SavedModel format https://www.tensorflow.org/guide/saved_model
- Installing ModelServer https://www.tensorflow.org/tfx/serving/setup#installing_using_apt 上の文書のサンプルソースを動かすために必用
8.1 以下の操作を行っている動画
8.2 保存する命令
- 色々保存する種類があるが、ディレクトリに保存する場合
- tensorflow/tensflowに含まれているサンプル(save_and_load.ipynb) の例
- saved_modelディレクトリにmy_modelで保存する場合
.... ここまでにモデルを作成し、学習した後に
!mkdir -p saved_model
model.save('saved_model/my_model')
8.3 読み込む命令
- tensorflow/tensflowに含まれているサンプル(save_and_load.ipynb) の例
- saved_modelディレクトリにmy_modelを保存してある場合
- new_modelに読み込み
new_model = tf.keras.models.load_model('saved_model/my_model')
9 続きを追記してきます。
10 この文書のチェンジログ
- 2020/01/23 初版
- 2020/01/24 3,4章追加
- 2020/01/24 5章 サンプル object_detection.ipynbを動かしてみる を追加
Created: 2020-01-27 月 21:44