- 投稿日:2020-07-10T21:58:20+09:00
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は固定のエポック数でモデルを訓練するものになります。
codemodel.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の値に比べ正解率が高く、損失値が小さくなります。訓練用データでのエポックを過剰に進めると、未知のデータに対する正解率が上がらず損失値が減少しない場合があります。これを過学習といいます。
モデルの正解率の評価
codetest_loss, test_acc = model.evaluate(x_test, y_test, verbose=0) print('\nTest accuracy:', test_acc)結果
Test accuracy: 0.9414手書き文字セットの内、10000枚のデータで評価しました。値は訓練データでの正解率に比べ現象しています。
モデルを使い予測してみる。
predict関数を用いて、手書き文字セットの評価用データを用いて予測してみます。
codepredictions = 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)この結果として予測した結果の値が得られます。いくつかの候補に値があります。
codenp.argmax(predictions[0])結果
7予測したもので最も可能性が高いと思われるものが7であるという結果が得られました。
ラベルを確認しましょう。codey_test[0]結果
array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], dtype=float32)正解を示すラベルでは7番目の要素が1となっています。この結果から正しいことがわかりました。念のため画像を見ましょう
codex_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を構築して画像分類してみる(概要編)
- 投稿日:2020-07-10T18:17:04+09:00
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も)バージョンを確認
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)
完了後以下を.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
cuDNNのインストール
https://developer.nvidia.com/rdp/cudnn-download
公式に従ってインストールすればOK
※ダウンロードにはDEVELOPER登録が必要です
アンケートは適当に回答すればOK
CUDAの対応バージョンのものをインストールする必要があるので注意
以下をそれぞれダウンロードしたら、この順にインストールする必要あり
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.pyimport 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の対応バージョンのものをインストールする必要があるので注意
https://docs.nvidia.com/deeplearning/tensorrt/archives/
それぞれのバージョンごとのリリースノートのページで対応CUDAバージョンは確認できます
(Compatibility(互換性)の項)
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の対応バージョンのものをインストールする必要があるので注意
https://docs.nvidia.com/deeplearning/nccl/archives/
それぞれのバージョンごとのリリースノートのページで対応CUDAバージョンは確認できます
(Compatibility(互換性)の項)
https://docs.nvidia.com/deeplearning/nccl/archives/nccl_273/install-guide/index.html
インストールは公式のインストールガイドページの記載に従えばOK
(上記リンクは2.7.3のインストールガイド(Ubuntuは3.1項参照))
以上、おまけでした
- 投稿日:2020-07-10T16:35:11+09:00
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これでエラーはでなくなる.