はじめに
本書では、10章のディープラーニングの演習のためにkerasというライブラリとTheanoというバックエンドを組み合わせて用いました。
kerasと組み合わせることができるバックエンドは他にもGoogleのTensorFlowなどがあることを書籍で紹介しましたが、執筆当時TensorFlowはインストールがやや難しいため、本書では用いませんでした。
しかし 2018年8月、TensorFlowのバージョン1.9.0がRaspberry Piを正式にサポートしたことにより、Raspberry PiでTensorFlowを用いることができるようになりました。それにより、本書の10章のプログラムを TensorFlow で実行することが一時的に容易になったのです。
とは言え、この分野は進歩のスピードが速く、状況は常に変わっています。2023年現在、TensorFlow バージョン 2 の Raspberry Pi の公式なサポートはなく、有志の方がビルドしてくださった TensorFlow を利用させて頂いております。
また、ディープラーニングのライブラリのトレンドは TensorFlow から Facebook により開発された PyTorch (パイトーチ) に移り、一方 Google は TensorFlow とは別に jax/flax という数値計算およびディープラーニングのライブラリの開発を始めています。
このように、進歩の激しい分野で最新のツールを追いかけることはなかなか難しいことです。
本ページは、本書 10 章の演習を keras + TensorFlow で実行する方法を解説します。
上で述べたようにライブラリ(すなわちツール)のトレンドは移り変わるものですから、TensorFlow で実行すること自体が重要だというわけではありません。
しかし、2023年10月、Raspberry Pi OS の最新版 Bookworm では、これまで 5 年間用いてきた keras + Theano が動作しなくなってしまいました。
Bookworm で 10 章の演習を実行するには本ページの方法が唯一の方法となってしまったのです。ただし、64-bit 版 OS 限定の方法であることはご了承ください。
状況を整理すると下記の通りです。
OS | TensorFlow | keras + Theano |
Raspberry Pi OS Bookworm 32-bit | × | × |
Raspberry Pi OS Bookworm 64-bit | 〇 (ver2) | × |
Raspberry Pi OS Bullseye 32-bit | × | 〇 |
Raspberry Pi OS Bullseye 64-bit | 〇 (ver2) | 〇 |
Raspberry Pi OS Buster 32-bit | 〇 (ver1, 2) | 〇 |
何が変わるのか?
まず、TensorFlowの実行方法を解説する前に、TheanoからTensorFlowに変えることで何が変わるのかをあらかじめ紹介しておきましょう。
[性能]
- TheanoからTensorFlowに変えても、計算を担うライブラリが変わるだけですから、機械学習の性能は変化しません
[プログラム全般に関して]
- Theanoでは、プログラムの初回実行時にコンパイルという作業が行われるため、Raspberry Piで5分程度の時間がかかりました。TensorFlowではこれがなくなり、速やかに計算が始まります
[学習用プログラムに関して]
- 学習用プログラム(ml-10-01-iris-deep-learn.py、ml-10-03-digits-cnn-learn.py、ml-10-07-hand-cnn-learn.pyの3つ)をRaspberry Pi 2~4で実行すると、マルチコアのプロセッサが有効に使われるため、プログラムの実行時間が短くなります。特に、Raspberry Pi 4 ではかなり高速に学習が終了します(あくまで本書執筆時に用いた Theano による結果と比べれば、ですが)。ただし、結果確認用プログラムではその効果はありません。また、シングルコアのRaspberry Pi 1 やRaspberry Pi Zeroでもその効果はありません。
[その他の注意]
- TensorFlowをインストールすると、ベクトル計算用のライブラリNumPyがアップグレードされることで、プログラム実行時にライブラリ間のバージョンの組合せに起因する警告(FutureWarningやRuntimeWarningなどのWarning)がでることがあります。Warningはエラーではありませんから、当面は気にしなくても良いのですが、気になる方は気になるでしょう。
以下の流れ
さて、本ページでは以下の流れにそって解説していきます。自分の該当する部分をご覧ください。
Raspberry Pi OS Bullseye 64-bit 版で、TensorFlow 2 系のパッケージをインストールするには、以下の8個のコマンドを順に実行します。
PINTO0309 (Katsuya Hyodo) さんのビルドした TensorFlow 2.12 の 64-bit 版がインストールされます。
sudo apt install libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libblas-dev liblapack-dev cython3 libatlas-base-dev openmpi-bin libopenmpi-dev python3-dev python3-h5py
sudo pip3 install keras_applications==1.0.8 --no-deps --break-system-packages
sudo pip3 install keras_preprocessing==1.1.2 --no-deps --break-system-packages
sudo pip3 install numpy==1.24.4 --break-system-packages
sudo pip3 install pybind11==2.9.2 --break-system-packages
pip3 install -U --user six wheel mock --break-system-packages
wget https://github.com/PINTO0309/Tensorflow-bin/releases/download/v2.12.0rc0/tensorflow-2.12.0rc0-cp311-none-linux_aarch64.whl
sudo -H pip3 install tensorflow-2.12.0rc0-cp311-none-linux_aarch64.whl --break-system-packages
全てのコマンドが無事終了すれば インストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。
インストール終了後、カメラを用いない演習は、本書のサンプルファイルをそのまま利用できます。
カメラを用いた演習を行う場合、本書のサンプルプログラムがそのまま動作するわけではなく、対応済ファイルを別途ダウンロードして利用することになります。
「
本書の演習を picamera2 (libcamera) で実行する方法」で配布しているサンプルファイルを利用してください。なお、2023年1月に発売された Camera Module v.3 はこの手法でしか使えません。
Raspberry Pi OS Bullseye 64-bit 版で、TensorFlow 2 系のパッケージをインストールするには、以下の11個のコマンドを順に実行します。
PINTO0309 (Katsuya Hyodo) さんのビルドした TensorFlow 2.9 の 64-bit 版がインストールされます。
なお、下記のコマンドを実行すると、numpy のバージョンが新しくなる関係で theano が動作しなくなりますのでご了承ください。
sudo apt install libc-ares-dev libeigen3-dev gfortran libopenblas-dev libopenblas-base cython3 openmpi-bin
sudo pip3 install keras_applications==1.0.8 --no-deps
sudo pip3 install keras_preprocessing==1.1.2 --no-deps
sudo pip3 install numpy==1.22.3
sudo pip3 install h5py==3.6.0
sudo pip3 install pybind11==2.9.2
pip3 install -U --user six wheel mock
wget "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/main/previous_versions/download_tensorflow-2.9.0-cp39-none-linux_aarch64.sh"
chmod +x download_tensorflow-2.9.0-cp39-none-linux_aarch64.sh
./download_tensorflow-2.9.0-cp39-none-linux_aarch64.sh
sudo -H pip3 install tensorflow-2.9.0-cp39-none-linux_aarch64.whl
全てのコマンドが無事終了すれば インストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。
インストール終了後、カメラを用いない演習は、本書のサンプルファイルをそのまま利用できます。
カメラを用いた演習を行う場合、Bullseye 64-bit 版では、下記の2通りの選択肢があります。いずれの場合も、本書のサンプルプログラムがそのまま動作するわけではなく、対応済ファイルを別途ダウンロードして利用することになります。
Legacy Camera モードの有効化 / 無効化は下記のページをご覧ください。
Raspberry Pi OS Bullseye よりも古い Buster までの OS で、Python3 用の TensorFlow 2 系のパッケージをインストールするには、以下の3つのコマンドを順に実行します。
sudo pip3 install keras==2.4.3
wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.4.0/tensorflow-2.4.0-cp37-none-linux_armv7l.whl
sudo pip3 install tensorflow-2.4.0-cp37-none-linux_armv7l.whl
一つ目のコマンドは、kerasを最新の TensorFlow 用にアップグレードしています。この新しい keras は TensorFlow 専用となっており、本書で解説した Theano と合わせて使うことはできませんのでご注意下さい。そのため、Theano を用いるときは keras のバージョンを 2.3.1 に指定していたのでした。
二つ目のコマンドは、
lhelontra 氏のサイトから、氏がビルドしたパッケージをダウンロードしています。三つ目のコマンドでそれをインストールしています。
なお、Raspberry Pi 1 や Raspberry Pi Zero を用いる場合、二つ目および三つ目のコマンドの「armv7l」の部分を「armv6l」に変更する必要がありますのでご注意ください。ただし、私は Raspberry Pi 1 や Raspberry Pi Zero での動作は確認していません。
以上でインストールは終わりです。なお、TensorFlow 2.3 以降では keras は TensorFlow 専用となっていますので、.keras/keras.json による設定は必要ありません。
上記のように TensorFlow2 をインストールした場合、学習済ファイルを TensorFlow2 用に更新しないと、認識率が悪くなることがあります。また、プログラムに手を加えなければならない場合もありました。
それらのファイルは下記のコマンドを実行することでダウンロードできます。プログラムをbluebacksディレクトリに展開した方は、下記のダウンロードコマンド実行前に「cd bluebacks」を実行してください。
なお、TensorFlow 2 系では、配布した学習済のファイル(拡張子 h5)も変更が必要な場合があるようでしたので、そちらもダウンロードしています。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-09-janken-deep-tf2.py
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-10-janken-deep-shorten-tf2.py
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-digits-cnn-tf2.h5
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-hand-cnn-tf2.h5
これらの利用方法は例えば以下となります。ml-digits-cnn-tf2.h5 や ml-hand-cnn-tf2.h5 のように、「-tf2」がついた学習済ファイルが存在する場合はそちらを優先しを用いるようにしてください。ml-iris-dnn.h5 は「-tf2」がついていないファイルを用いて構いません。
python3 ml-10-04-digits-cnn-load.py ml-digits-cnn-tf2.h5
python3 ml-10-05-digits-cnn-gui.py ml-digits-cnn-tf2.h5
python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn-tf2.h5
python3 ml-10-09-janken-deep-tf2.py ml-hand-cnn-tf2.h5
python3 ml-10-10-janken-deep-shorten-tf2.py ml-hand-cnn-tf2.h5
Raspberry Pi OS Bullseye よりも古い Buster までの OS で、Python3 用の TensorFlow 1 系のパッケージをインストールするには、以下のコマンドを実行します。
sudo pip3 install keras==2.3.1 tensorflow
環境によってはpip3コマンドは下記のようにMemoryErrorで終了してしまうかもしれません。
(中略)
File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/filewrapper.py", line 50, in _close
self.__callback(self.__buf.getvalue())
File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/controller.py", line 275, in cache_response
self.serializer.dumps(request, response, body=body),
File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/serialize.py", line 87, in dumps
).encode("utf8"),
MemoryError
その場合、下記のように「--no-cache-dir」オプションをつけてインストールコマンドを実行してください。
sudo pip3 --no-cache-dir install keras==2.3.1 tensorflow
インストールは、途中でNumPyのアップグレードが実行されるため、数十分かかります。2018年8月時点で、NumPyのバージョンは1.12.1から1.15.0とアップグレードされました。
なお、下記のようなエラーが出てインストールに失敗することがあります。
Exception:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
status = self.run(options, args)
(中略)
File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'
これは、インストール時のネットワークに問題があるときに出るエラーです。
Raspberry Piがネットワークに接続していないとき、および、ファイルのダウンロード元であるサーバーに問題があるときの両方で上記エラーが出ます。
あるいは、同様のエラーで
THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.
と出る場合もあります。
まず、Raspberry Piのネットワーク接続に問題がある場合はその改善を試みてください。
一方、先方のサーバーに問題がある場合、時間をあけてからコマンドを再実行すると問題が解消される場合があります。Raspberry Pi上でpipを用いてツールをインストールする場合、サーバー側の問題なのか、何度もインストールを試みて初めてインストールに成功する、ということが多い印象があります。
NumPyがアップグレードされたことは、本書で何度か行ったように、ml-03-01-version.pyを実行すると確認できます。試してみてください。
すると、見慣れない警告(FutureWarningなど)がたくさん現れると思います。
本ページの内容を実行すると、このような警告(Warning)がたくさん出るようになります。以下ではこれらの警告を「気にしない」という方針で記述していきます。これらの警告が気になるという方は、本ページの最後で紹介するツールのアンインストールを実行することで、この警告は出なくなります。
さて、TensorFlowのインストールが終わったら、それをkerasから利用する設定を行いましょう。
本書311ページで行った手順を逆にするだけです。
まず、ターミナルを新規に立ち上げ、下記のコマンドを実行しましょう。
leafpad .keras/keras.json
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
mousepad .keras/keras.json
すると、下記の内容がテキストエディタleafpadで開きます。本書の演習を実行した方は、backendが下記のようにtheanoに編集されているでしょう。なお、この4行の順番が変わっていることがありますが、それは気にしなくても構いません。
{
"epsilon": 1e-07,
"floatx": "float32",
"image_data_format": "channels_last",
"backend": "theano"
}
バックエンドをTheanoからTensorFlowにするには、これを下記のように変更します。
{
"epsilon": 1e-07,
"floatx": "float32",
"image_data_format": "channels_last",
"backend": "tensorflow"
}
編集が終わったら上書き保存し、テキストエディタleafpadを閉じます。以上でTensorFlow 1 系のインストールと設定は終了です。
上記の方法でインストールと設定が終わったら、本書に従いプログラムを実行してみましょう。例えば、手書き数字の認識を行うml-10-06-digits-cnn-gui-mod.pyを実行してみます。
python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
警告(Warning)はいくつか出ますが、下図のように問題なくプログラムが実行されることがわかります。
おおむね、keras + Theano用のプログラムがそのまま動作しますが、「ml-10-09」および「ml-10-10」から始まるじゃんけんシステムのプログラムだけは、TensorFlow用の変更が必要です(スレッドと呼ばれるものを用いているためです)。
keras + TensorFlow 1 系用のじゃんけんシステムのプログラムは下記の2つのコマンドを実行することでダウンロードできます。プログラムをbluebacksディレクトリに展開した方は、下記のダウンロードコマンド実行前に「cd bluebacks」を実行してください。
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-09-janken-deep-tf.py
wget https://raw.githubusercontent.com/neuralassembly/raspi/master/ml-10-10-janken-deep-shorten-tf.py
これらのプログラムの実行方法は下記の通りとなります。
python3 ml-10-09-janken-deep-tf.py ml-hand-cnn.h5
python3 ml-10-10-janken-deep-shorten-tf.py ml-hand-cnn.h5
TensorFlowのアンインストール
以上、本書のディープラーニング用プログラムをkeras + TensorFlowの組合せで実行する方法を紹介しました。
これを実行すると、主にNumPyがアップグレードされることにより、ディープラーニングの演習以外でも警告(Warning)が多く出るようになります。
これはインストールしたライブラリの内部記述に起因するものであり、多くはライブラリのアップグレードで解消されることが多いものです。本ページではそれらの警告を「気にしない」という方針で記述しました。
これらの警告が気になるという方は、本ページでインストールしたTensorFlowおよびアップグレードされたNumPyをアンインストールすることをお勧めします。下記のコマンドでアンインストールされます。
sudo pip3 uninstall tensorflow numpy
途中で「Proceed ? (続行しますか?)」という質問が2回出ますので、キーボードの「y」をタイプしてEnterキーを押してください。
また、TensorFlow 2 系をインストールしていた方は、以下のように keras のバージョンを 2.3.1 に戻す必要もあります。
sudo pip3 install keras==2.3.1
以上でNumPyは1.15.0から1.12.1に戻り、警告(Warning)は出なくなります。もちろん、TensorFlowもアンインストールされましたので使えなくなります。
ですから、.keras/keras.jsonのbackendの項目を下記のようにtheanoに変更して保存しましょう。
{
"epsilon": 1e-07,
"floatx": "float32",
"image_data_format": "channels_last",
"backend": "theano"
}