20200710のTensorFlowに関する記事は3件です。

Tensorfrowで画像分類など学習してみる(手書き文字認識編3)

前回の記事「Tensorfrowで画像分類など学習してみる(手書き文字認識編2)」の続きになります。
前回は、データの前処理(スケール変換・1hotベクトル変換と、3層の順伝播型ニューラルネットワークをkerasを用いて構築しました。今回はその続きとしてモデルの学習を進めていきます。

前提/環境

前提となる環境とバージョンは下記となります。
・Anaconda3
・Python3.7.7
・pip 20.0
・TensorFlow 2.0.0

この記事ではJupyter Notebookでプログラムを進めていきます。コードの部分をJupyter Notebookにコピー&ペーストし実行することで同様の結果が得られると思います。前回分のコードは前回の記事を参照してもらえるとありがたいです。

モデルの学習

機械学習では大まかにモデル構築⇒モデルを用いて訓練⇒未知のデータの分類または予測 という流れで進めます。モデルの訓練は次のコードで行います。keras ではfit関数を利用します。fitは固定のエポック数でモデルを訓練するものになります。

code
model.fit(
    x_train,
    y_train,
    batch_size=32,
    epochs=20,
    validation_split=0.2
)

訓練ではデータすべてを使うわけではありません、手書き文字のデータセットの内60000枚を利用します。残りの10000枚のデータは未知のデータへの検証や予測のために利用します。

fit関数を用いるにあたり引数を指定しています。それぞれは下記の意味合いとなります。

x_train
訓練データの画像に手書き文字セットの画像の行列に対応します。
y_train
訓練データのラベルに対応する行列に対応します。
batch_size
整数またはNoneを指定します。動作としては設定したサンプル数ごとに勾配の更新を行います。指定しなければデフォルトで32で更新します。機械学習の原理として与えられた関数の傾き(勾配)を計算して、勾配の傾きが大きいほうへパラメーターをずらしていきます。この動きに対する指定となります。
epochs
整数で,モデルを訓練するエポック数を指定します。
validation_sprit
訓練データ全体を訓練にのみ利用するのではなく、一部を訓練中の検証用データとして用いる場合に設定します。kerasでは0から1までの浮動小数点数で指定します。この設定値は訓練データの中で検証データとして使う割合を示します。この記事では0.2を定していますが、訓練に使われるのは全体の8割、残りの2割は検証用データとして利用するということになります。ここで設定した検証データは訓練には利用されません。

モデルの訓練の実行

fitを実行すると下記のような結果が得られます。(一部抜粋)注:結果中のaccuracyなどの値は全く同じにならない場合があります

Train on 48000 samples, validate on 12000 samples
Epoch 1/20
48000/48000 [==============================] - 230s 5ms/sample - loss: 0.1753 - accuracy: 0.9567 - val_loss: 0.3396 - val_accuracy: 0.9468
Epoch 2/20
48000/48000 [==============================] - 246s 5ms/sample - loss: 0.1696 - accuracy: 0.9575 - val_loss: 0.3084 - val_accuracy: 0.9444



Epoch 20/20
48000/48000 [==============================] - 317s 7ms/sample - loss: 0.1477 - accuracy: 0.9636 - val_loss: 0.4187 - val_accuracy: 0.9446

得られる結果としてデータセット数、loss、accuracy、val_loss、val_accuracyというものが得られます。手書き文字セットの訓練データは60000枚でしたがその8割を利用するので48000枚を利用して訓練をしています。残りの2割データで検証を行っています。
loss、accuracy、val_loss、val_accuracyそれぞれの意味合いは下記になります。

loss
訓練データを用いた場合の損失関数の値。損失関数の値が減少することが望ましい
accuracy
訓練データに対しての分類精度(正解率)この値が高くなることが望ましい。
val_loss
訓練データの一部を検証用データとして利用した場合に得られる。検証用データ(未知のデータ)に対する損失関数の値
val_accuracy
訓練データの一部を検証用データとして利用した場合に得られる。検証用データ(未知のデータ)に対する正解率

基本的にエポックを重ねるごとにlossが減少し、accuracyが増加します。またval_loss,val_accuracyの値に比べ正解率が高く、損失値が小さくなります。訓練用データでのエポックを過剰に進めると、未知のデータに対する正解率が上がらず損失値が減少しない場合があります。これを過学習といいます。

モデルの正解率の評価

code
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print('\nTest accuracy:', test_acc)

結果
Test accuracy: 0.9414

手書き文字セットの内、10000枚のデータで評価しました。値は訓練データでの正解率に比べ現象しています。

モデルを使い予測してみる。

predict関数を用いて、手書き文字セットの評価用データを用いて予測してみます。

code
predictions = model.predict(x_test)
predictions[0]

結果
array([0.0000000e+00, 1.4220487e-26, 1.4102146e-16, 1.2095399e-13,
5.7181305e-13, 1.5182375e-28, 0.0000000e+00, 1.0000000e+00,
0.0000000e+00, 3.0219263e-18], dtype=float32)

この結果として予測した結果の値が得られます。いくつかの候補に値があります。

code
np.argmax(predictions[0])

結果
7

予測したもので最も可能性が高いと思われるものが7であるという結果が得られました。
ラベルを確認しましょう。

code
y_test[0]

結果
array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], dtype=float32)

正解を示すラベルでは7番目の要素が1となっています。この結果から正しいことがわかりました。念のため画像を見ましょう

code
x_test_image = x_test[0].reshape(28, 28) 

plt.figure()
plt.imshow(x_test_image)
plt.colorbar()
plt.grid(False)
plt.show()

ここでは一度784に画像を変更しているので、28×28に再度reshapeしなおして画像として表示しています。
そうすると7という文字の手書き画像が表示されます。

まとめ

ここまで、MNISTの手書きデータセットを用いて順伝播型ニューラルネットワークによる訓練と予測をしてみました。
tensorflowとkerasを用いると簡便にいろいろな機械学習が行えます。
初歩的な内容でしたが、次回以降はCNNによる画像分類を書いていきたいと思います。

2020年7月12日追記
CNNの実装をしてみようということで下記の記事も書き始めました。
Tensorflow・kerasでCNNを構築して画像分類してみる(概要編)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TensorFlowインストール(NVIDIA GPU対応用)

GPU対応版のTensorFlowのインストールでいろいろ躓いたので、とりあえずうまくいった方法をまとめておきます

実施環境、バージョン

OS : Ubuntu16.04
GPU : GeForce GTX 1660Ti
CUDA : 10.1(TensorFlow2.1.0が対応するCUDAに合わせた)
cuDNN : 7.6.5(CUDA10.1に合わせた)
TensorFlow : 2.1.0
(以下おまけ)
TensorRT : 6.0.1(CUDA10.1に合わせた)
NCCL : 2.7.3(CUDA10.1に合わせた)

  • python,pip等のインストールは他サイトを参考に実施ください
    なおtensorflowインストール時、pipやsetuptoolsのバージョンが古いと怒られるので以下でバージョンアップしておくとよい
    sudo pip3 install --upgrade pip -ignore-installed --user
    sudo pip3 install setuptools

インストール対象のTensorFlow確認

https://www.tensorflow.org/install/source
上記ページの「テスト済みビルド構成」のGPU欄にて、
対象バージョンに対応するCUDAの(cuDNNも)バージョンを確認
Screenshot from 2020-06-09 16-07-41.png

CUDA Toolkitのインストール

※もしすでにCUDAが入っている場合は一旦削除
sudo apt purge cuda*
sudo apt purge nvidia-cuda-*
sudo apt purge libcud* #cuDNNもここでアンインストールできるはず
sudo apt purge nccl* #NCCLインストールしてた場合

https://developer.nvidia.com/cuda-downloads
公式から対象となるバージョンのCUDAをダウンロード
(旧バージョンは「Legacy Release」からダウンロード)
対象のページを辿っていくとインストール手順が表示されるので
それに従ってインストールすればよい
(ここではTensorFlow2.1.0に対応するためCUDA10.1)
Screenshot from 2020-06-09 16-06-42.png

  • 完了後以下を.bashrcに記載
    export PATH="/usr/local/cuda-10.1/bin:$PATH"
    export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
    ・設定再読み込み
    source .bashrc

  • インストール後、以下のコマンドでNVIDIAドライバのバージョンと
    CUDAのバージョンを確認可能
    nvidia-smi
    nvcc -V

  • 軽く動作確認
    任意の場所にサンプルコードコピー
    cuda-install-samples-10.1.sh ./
    場所移動
    cd NVIDIA_CUDA-10.1_Samples
    サンプルをコンパイル
    make
    以下に移動
    cd 2_Graphics/volumeRender
    サンプル実行
    ./volumeRender
    以下が表示されればOK
    Screenshot from 2020-06-10 17-52-48.png

cuDNNのインストール

https://developer.nvidia.com/rdp/cudnn-download
公式に従ってインストールすればOK
※ダウンロードにはDEVELOPER登録が必要です
 アンケートは適当に回答すればOK
CUDAの対応バージョンのものをインストールする必要があるので注意
Screenshot from 2020-06-10 17-08-36.png

以下をそれぞれダウンロードしたら、この順にインストールする必要あり
cuDNN Runtime Library
cuDNN Developer Library
cuDNN Code Samples and User Guide #これは入れても入れなくてもどっちでもOK

  • インストール後チェック
    以下のコマンドを実行
    cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2
    以下が表示されればOK
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 0
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#include "driver_types.h"
  • 軽く動作確認(サンプルダウンロードした場合)
    任意の場所にサンプルをコピー(例はver7版の場合)
    cp -r /usr/src/cudnn_samples_v7/ ./
    以下に移動
    cd cudnn_samples_v7/mnistCUDNN
    サンプルをコンパイル
    make
    サンプル実行
    ./mnistCUDNN
    以下が表示されればOK
    Test passed!

TensorFlowのインストール

https://qiita.com/Orihasam/items/020d439d0aec2d90cd73
上記解説頂いているページに従ってコマンド入力すればOK...?
→なんかpipでscipyがuninstallできないみたいなエラーが出た

Cannot uninstall 'scipy'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

いろいろ調べたところ、結局以下のコマンドでインストールできた
TensorFlowのバージョン指定のところは自分のインストールしたいバージョンを指定
sudo pip3 install tensorflow-gpu==2.1.0 --ignore-installed --user

TensorFlowの動作確認

以下のpythonコードを実行してprint文が出るか確認
※なお以下のコードはtensorflow2.X以降で実行可能なコードです

tf_hello.py
import tensorflow as tf
testmsg = tf.constant('Hello, TensorFlow2 World!')
tf.print(testmsg)

実行後「Hello, TensorFlow2 World!」が表示されればOK

また以下のコマンドを実行して「device_type: "GPU"」があれば,tensorflowがGPUが認識できていることが確認できる.
python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"

なんとかこれで準備完了

(おまけ)

TensorFlowのバージョン確認

python3 -c 'import tensorflow as tf; print(tf.__version__)'

TensorRTのインストール

https://developer.nvidia.com/nvidia-tensorrt-download
上記から対象バージョンのものをダウンロード
※CUDAの対応バージョンのものをインストールする必要があるので注意
Screenshot from 2020-06-10 18-19-11.png

https://docs.nvidia.com/deeplearning/tensorrt/archives/
それぞれのバージョンごとのリリースノートのページで対応CUDAバージョンは確認できます
(Compatibility(互換性)の項)
Screenshot from 2020-06-10 18-19-53.png

https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-601/tensorrt-install-guide/index.html#installing
インストールは公式のインストールガイドページの記載に従えばOK
(上記リンクは6.0.1のインストールガイド(Ubuntuは4.1項参照))

NCCLのインストール(機械学習でGPUによる並列化をしたい場合)

https://developer.nvidia.com/nccl/nccl-download
上記から対象バージョンのものをダウンロード
※CUDAの対応バージョンのものをインストールする必要があるので注意
Screenshot from 2020-06-10 18-35-07.png

https://docs.nvidia.com/deeplearning/nccl/archives/
それぞれのバージョンごとのリリースノートのページで対応CUDAバージョンは確認できます
(Compatibility(互換性)の項)
Screenshot from 2020-06-10 18-42-30.png

https://docs.nvidia.com/deeplearning/nccl/archives/nccl_273/install-guide/index.html
インストールは公式のインストールガイドページの記載に従えばOK
(上記リンクは2.7.3のインストールガイド(Ubuntuは3.1項参照))


以上、おまけでした

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TensorFlow 2 メモ: TensorFlow2.0 にTensorFlow-addonsをインストールする

画像認識のタスクでデータ拡張(水増し)をするために画像の回転を行いたいが,Tensorflow coreには90度ごとの回転をする関数しか提供されていない.拡張パッケージのTensorFlow addons には tfa.image.rotate() という任意の角度回転できる関数あるので,これをインストールして使いたい.

環境

  • macOs Catalina + Anaconda
  • TensorFlow2.0

問題点

MacのAnacondaを使ってTensorFlowの環境を準備している. mac版Anacondaでは(2020/7/9)の時点でtensorflow-2.0までしか用意されていないらしい(Linuxでは最新の2.2が用意されている).

anacondaのpipを使ってtensorflow-addons(0.10)をインストールすると, インポートしたときにエラーがでる.

import tensorflow as tf
import tensorflow_addons as tfa
/(path)/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_addons/utils/ensure_tf_install.py:68: UserWarning: Tensorflow Addons supports using Python ops for all Tensorflow versions above or equal to 2.2.0 and strictly below 2.3.0 (nightly versions are not supported). 
 The versions of TensorFlow you are currently using is 2.0.0 and is not supported. 
Some things might work, some things might not.
If you were to encounter a bug, do not file an issue.
If you want to make sure you're using a tested and supported configuration, either change the TensorFlow version or the TensorFlow Addons's version. 
You can find the compatibility matrix in TensorFlow Addon's readme:
https://github.com/tensorflow/addons
  UserWarning,
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "(path)/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_addons/__init__.py", line 21, in <module>
    from tensorflow_addons import activations
  File "(path)/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_addons/activations/__init__.py", line 17, in <module>
    from tensorflow_addons.activations.gelu import gelu
  File "(path)/opt/anaconda3/envs/tf2/lib/python3.7/site-packages/tensorflow_addons/activations/gelu.py", line 27, in <module>
    @tf.keras.utils.register_keras_serializable(package="Addons")
AttributeError: module 'tensorflow_core.keras.utils' has no attribute 'register_keras_serializable'

エラーメッセージおよび tensorflow-addons のgithubによると,addonsの最新版はTensorflow2.2対応であり,2.0には対応していないらしい.
これを解消するためには,Tensorflowのバージョンを上げるか,tensorflow-addonsのバージョンを下げるかしかない.

暫定的な解決策 work around

今回はtensorflow-addonsのバージョンを下げる(古いバージョンを入れる)ことで対応した.

pip uninstall tensorflow-addons
pip install tensorflow-addons==0.6

これでエラーはでなくなる.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む