2018年8月9日木曜日

本書のディープラーニングの演習をkeras + TensorFlowで実行する方法

はじめに

本書では、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 限定の方法であることはご了承ください。

状況を整理すると下記の通りです。

OSTensorFlowkeras + 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はエラーではありませんから、当面は気にしなくても良いのですが、気になる方は気になるでしょう。

以下の流れ

さて、本ページでは以下の流れにそって解説していきます。自分の該当する部分をご覧ください。

TensorFlow 2 系のインストール方法 (Bookworm 64-bit 版のみ)

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 はこの手法でしか使えません。


TensorFlow 2 系のインストール方法 (Bullseye 64-bit 版のみ)

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 モードの有効化 / 無効化は下記のページをご覧ください。


TensorFlow 2 系のインストール方法 (Busterまで)

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


TensorFlow 1 系のインストール方法 (Busterまで)

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"
}

31 件のコメント:

  1. Python3で運用しようとしています。keras,theanoのインストールが完了しません。

    また、tensorflowのインストールが失敗します。メモリ関連のオプションはつけました。

    進捗バーは、81%で止まり、以下のようなエラーが出ます。THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.


    ご所見をお願いします。

    返信削除
    返信
    1. こちらでもPython2およびPython3でのインストールを確認しました。

      結論としては、
      『「THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.」
      のエラーが出ることもありましたが、
      何度かpipによるインストールコマンドを繰り返したらインストールに成功した』
      となります。

      「THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.」
      のエラー自体は、インターネットのサーバー上にあるインストール用のファイルが
      期待するファイルと違ったことが原因で出るエラーです。

      以下、推測です。

      pipのインストールの途中にファイルがダウンロードされるのですが、
      接続先のサーバーが混んでいることなどが原因で、
      このダウンロードが途中で止まることがあるのではないでしょうか。
      途中で止まってしまった場合、ダウンロードされたファイルは
      不完全なファイルとなっているので
      「THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE.」
      というエラーが出るというわけです。

      その場合、pipコマンドをリトライしてみてください。
      ダウンロードが正常に完了すれば
      エラーが出ずにインストールが完了します。

      pipによるインストールは、接続先のサーバーの状態でエラーがでることが
      時々あります。
      その場合、上記のエラー以外にも、
      「長いエラーが表示された後、最後に
      TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'」
      と表示されてインストールに失敗する」
      というケースもあります。

      いずれの場合も、時間をおいて何度か試すことで成功するケースが多いと思います。

      なお、インストール中のダウンロードのタイムアウト時間をデフォルトの15秒から
      延ばすとエラーが出にくいかもしれません(気のせいかもしれませんが)。
      タイムアウトを2分にするには下記のようにします。
      sudo pip3 --no-cache-dir --default-timeout=120 install tensorflow

      削除
    2. 何度かトライし、ダウンロード終了までこぎつけたのですが、ディスクの空き容量がありませんと出まして、インストールには至りませんでした。もしご存知のところ有りましたら、コメントをお願いします。

      削除
    3. ディスクの空き容量が足りない場合はより大きな容量のmicroSDカードにOSを入れ直してやり直すしかないように思います。

      私の書籍の演習のみならば16GBのmicroSDカードで十分(8GBはギリギリかも)だと思いますが、
      他の書籍やサイトを参考に何かされている場合、16GBでも足りないのかもしれません。

      なお、64GB以上のmicroSDカードではフォーマットが必須でトラブルのもとなので
      32GB以下のmicroSDカードをお勧めしておきます。

      削除
    4. 以下のようなエラーです。

      ERROR: Could not install packages due to an EnvironmentError: [Errno 28] デバイスに空き領域がありません

      調べてみると、容量は十分あるのです。tmpも256MB取っています。
      手詰まりです。

      削除
    5. 「tmpも256MB取っています」という表現が気になりました。

      Raspbianを通常通りインストールすると、「/tmp」は別パーティションとして分けられず
      「/」内に作られるのではないでしょうか?
      その場合、「/tmp」の容量制限は「/」の容量制限と同じとなります。

      一時的に別ディレクトリを tmpとして用いるなら、
      pip実行前に一度

      export TMPDIR='/var/tmp'

      を実行しておく、という方法などが検索すると出てきます。
      (この場合も、/var/tmpが十分広い、という前提が必要です)

      削除
    6. お手数かけます。
      まもやたダウンロードがままならなくなっており、件のエラーメッセージにまでたどり着けません。

      /var/tmpを256MBに設定してあります。

      export TMPDIR='/var/tmp'を実行して、ダウンロード/インストールを試みることにします。

      削除
    7. 結果:この方法でも、同じエラー28が出てしまいました。

      削除
    8. やはり「/var/tmpを256MBに設定」の意味がわかりません。
      Raspbianを通常通りインストールすると、「/tmp」にも「/var/tmp」にも制限はかからないはずです。

      本ページは「カラー図解 Raspberry Piではじめる機械学習」のサポートページであり、
      本書の内容を外れた質問についてのサポートはできないことをご理解いただけますと幸いです。

      なお、「tmpも256MB取っています」や「/var/tmpを256MBに設定」は、
      ネット記事によくある「/tmpをSDカード上ではなくRAM上に配置」
      という話と関連しているように思われます。
      エラーメッセージを見る限り、その方法を用いているとTMPが足りなくなるため
      tensorflowはインストールすることはできない、ということではないでしょうか。

      削除
    9. 話を少し戻しますと、kerasとtheanoもインストールできていないようです。

      p309に記載のコマンドを実行すると以下のようです。

      pi@raspberrypi:~/bluebacks $ sudo pip install keras theano
      Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
      Requirement already satisfied: keras in /usr/local/lib/python3.5/dist-packages (2.2.4)
      Requirement already satisfied: theano in /usr/local/lib/python3.5/dist-packages (1.0.4)
      Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.5/dist-packages (from keras) (1.1.0)
      Requirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.5/dist-packages (from keras) (1.0.8)
      Requirement already satisfied: numpy>=1.9.1 in /usr/lib/python3/dist-packages (from keras) (1.12.1)
      Requirement already satisfied: pyyaml in /usr/local/lib/python3.5/dist-packages (from keras) (5.1.1)
      Requirement already satisfied: six>=1.9.0 in /usr/lib/python3/dist-packages (from keras) (1.12.0)
      Requirement already satisfied: scipy>=0.14 in /usr/lib/python3/dist-packages (from keras) (0.18.1)
      Requirement already satisfied: h5py in /usr/lib/python3/dist-packages (from keras) (2.7.0)

      ここまでで、バージョンなどは出ていません。

      その後、p310に記載の通りやってみると

      pi@raspberrypi:~/bluebacks $ python2 ml-03-01-version.py
      scikit-learnのバージョンは0.18です
      numpyのバージョンは1.12.1です
      scipyのバージョンは0.18.1です
      matplotlibのバージョンは2.0.0です
      PIL(Pillow)のバージョンは4.0.0です
      kerasがインストールされていないか、まだ設定が済んでいません
      theanoはインストールされていません

      インストールされていません。

      削除
    10. >「tmpも256MB取っています」や「/var/tmpを256MBに設定」は、
      ネット記事によくある「/tmpをSDカード上ではなくRAM上に配置」
      という話と関連しているように思われます。

      インストールの問題で煩わせてすみません。

      実は同様の件で、あるサイトに、/temp 及び /var/temp を拡張したところ、無事にインストールできました。という報告がありましたので、それをやってみた次第なのです(駄目でしたが…)。

      削除
    11. コピーされたメッセージについて言いますと、
      sudo pip install keras theano
      のコマンドで
      「Requirement already satisfied: keras in /usr/local/lib/python3.5/dist-packages」
      と出る点はおかしいです。

      なぜなら、インストール直後の状態のRaspbianでは
      「pipコマンドはpython2用のライブラリをインストールする」
      よう設定されているからです。

      上のメッセージは、pipコマンドで
      python3用のライブラリのインストールとなっていることが問題です。
      通常、python3用のライブラリのインストールはpip3コマンドで行うからです。

      恐らく、これも何かのサイトを参考にpipの設定を変更されたのでしょう。

      ちなみに、python3用のkerasとtheanoはインストールされているように見えます。

      整理すると、通常Raspbianでは
      「pipおよびpip2コマンドでpython2用のライブラリがインストールされ、
      pip3コマンドでpython3用のライブラリがインストールされる」
      状態になっています。

      実行コマンドについても同様で、通常では
      「pytonコマンドおよびpython2コマンドで、python2系が実行され、
      python3コマンドでpython3系が実行」
      されます。

      言い換えれば「pipまたはpip2でインストールしたらpythonまたはpython2で実行、
      pip3でインストールしたらpython3で実行」です。

      上で問題となった/tmpディレクトリの件も含めまして、
      本書とこの補足ページ以外の解説を参考に変更が加えられたRaspbianでの動作について
      サポートすることはできません。

      また、無理にpython3やtensorflowなどを用いようとするより、
      本書の通りの記述を確実に身に着けてから
      python3やtensorflowに挑戦する方がよいのではないでしょうか。
      本書ではpython3およびtensorflowは「上級者向けのサービス」という位置づけです。

      以後、OSを再インストールするなどして、
      インストール直後の状態のRapsbianで試されたのでない限り、
      ご質問に回答することはできません。

      ご了承ください。

      削除
    12. sudo pip2 install keras theano
      でインストールし、python2にて、手書き認識のデモを行いました。書籍の通りに上手くいったと思います。

      ご指導に感謝いたします。

      なお、python3でのtensorflow運用については、自分の今後の課題といたします。(tensorflowのインストールが相変わらず上手くいっておらず、python3におけるkerasについても、どうもインストールが出来ておらないようなのです)

      ご所見、ありがとうございました。

      削除
  2. 貴著のアイリスデータに関し、anaconda (python3)のspyder3で実習してきました。第10章の前まではすべて実行可能でした。第10章のdeep learningでつまずいています。kerasとtheanoをインストール後 .keras/keras.jsonを編集し、Theanoをバックエンドで ml-10-01-iris-deep-learn.py を実行しましたところ、下記のエラーが出てしまいます。

    Using Theano backend.
    WARNING (theano.tensor.blas): Using NumPy C-API based implementation for BLAS functions.
    使用法: python ml-10-01-iris-deep-learn.py 保存ファイル名.h5
    An exception has occurred, use %tb to see the full traceback.

    SystemExit

    C:\Users\M. Ishido\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3304: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
    warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

    %tb
    Traceback (most recent call last):

    File "", line 1, in
    runfile('C:/Users/M. Ishido/bbpy/ml-10-01-iris-deep-learn.py', wdir='C:/Users/M. Ishido/bbpy')

    File "C:\Users\M. Ishido\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

    File "C:\Users\M. Ishido\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

    File "C:/Users/M. Ishido/bbpy/ml-10-01-iris-deep-learn.py", line 13, in
    sys.exit()

    SystemExit

    もう一点理解できていないのが学習済みファイルについてです。これはプログラムにより自動的にできるファイルなのでしょうか。対処方法を教えていただければ、幸いです。

    返信削除
    返信
    1. 本書はRaspberry Pi上で機械学習を学ぶ書籍ですので、
      Windows上でのanacondaでの動作をサポートしていません。

      以下に簡単なコメントを記しますが、
      これはサポートではなく、あくまでコメントに過ぎないことにご留意ください。

      書籍p.321にありますように、 ml-10-01-iris-deep-learn.py を実行して
      irisのデータを学習させるには、

      python ml-10-01-iris-deep-learn.py result-iris.h5

      というコマンドで実行する必要があります。

      ここで、ファイル名の後ろにつけている「result-iris.h5」は
      コマンドライン引数といいます。

      コマンドライン引数とは本書p.276で解説されており、
      「プログラム(ここではml-10-01-iris-deep-learn.py)に
      補助的な情報を追加する」という役割があります。

      今回の場合は、
      「学習結果を保存するファイル名をresult-iris.h5とする」
      という意味になります。

      コピーされたメッセージに
      「使用法: python ml-10-01-iris-deep-learn.py 保存ファイル名.h5」
      という部分がありますが、これは
      「コマンドライン引数に保存したいファイルの名前を指定してください」
      という意味のエラーメッセージで、
      ml-10-01-iris-deep-learn.pyの12行目に書かれている内容です。

      ここまで解説すると、必要なのは
      「anacondaでPythonプログラムを実行するとき、
      どのようにコマンドライン引数を与えるか」
      という知識であることがわかると思います。

      冒頭で述べたようにこれはサポートではなくコメントですが、
      恐らく下記のページが参考になるでしょう。
      http://fanblogs.jp/papas56/archive/52/0


      上記ページの「コマンドラインオプション(コマンドライン引数と同じ)」の
      部分にresult-iris.h5と書いて実行すれば良いのではないでしょうか。

      なお、「もう一点理解できていないのが学習済みファイルについてです。
      これはプログラムにより自動的にできるファイルなのでしょうか」
      については恐らくml-10-01-iris-deep-learn.pyを実行すればわかると思います。

      ml-10-01-iris-deep-learn.pyの実行には時間がかかるので、
      それが面倒だという方のために、私があらかじめ作成したファイルをサンプルに含めているのです。

      なお、本書では学習済ファイルの作成は8章で初めて体験することになっています。
      具体的にはp.271です。

      そこを経ずにいきなり10章から学んでいるのだとすれば、
      つまづくポイントが多いだろうということもコメントしておきます。

      削除
  3. サポート範囲を超える本質的なご回答をありがとうございます。Spyder3にはデバッグ機能があり第7、8章も実施してみました。

    debugfile('C:/Users/M. Ishido/bbpy/ml-08-03-learn.py', wdir='C:/Users/M. Ishido/bbpy')
    > c:\users\m. ishido\bbpy\ml-08-03-learn.py(2)()
    1 # -*- coding: utf-8 -*-
    ----> 2 import cv2
    3 import sys
    4 import numpy as np
    5 from sklearn.neural_network import MLPClassifier


    ipdb> > c:\users\m. ishido\bbpy\ml-08-03-learn.py(15)()
    13 # 学習結果を保存するファイルの決定
    14 if len(sys.argv)!=2:
    2--> 15 print('使用法: python ml-08-03-learn.py result.pkl')
    16 sys.exit()
    17 savefile = sys.argv[1]


    ipdb>
    ipdb>

    デバッグ後のml-08-03-learn.py が展開せず、再度検討しております。

    返信削除
    返信
    1. デバッグメッセージの読み方が良く分からないのですが、
      これは2行目「import cv2」と15行目「print('使用法: python ml-08-03-learn.py result.pkl')」
      に問題があるということでしょうか?

      そうだとして、
      15行目の方は前回と同じく「result.pklというコマンドライン引数をつけなければならない」
      という意味を表しています。学習結果を保存するファイル名です。

      2行目に問題があるとすれば、
      anaconda用のOpenCVがインストールされていないということではないでしょうか。

      Python 3用のAnacondaをお使いだと仮定すると、下記操作が必要になります。

      ・Anaconda Navigatorを起動し、Environmentsを選択する
      ・右の領域でInstalledをNot Installedに変更
      ・右の領域での右端の入力領域でopencvで検索
      ・出てくる選択肢のうちpy-opencvにチェックを入れてApplyボタンを押す
      ・確認ウインドウでOKする
      以上で、anaconda用にPython用のOpenCVがインストールされます。

      以上のもと、result.pklという保存用ファイル名をコマンドライン引数として
      指定した上でml-08-03-learn.py実行すれば良いのではないでしょうか。

      なお、本書のサンプルファイルmlbb-sample.zipは
      6/25に最新のPython環境に対応するために更新されています。

      最新のmlbb-sample.zipをダウンロードして展開して得たファイルでないと
      エラーが出る可能性がありますのでご注意下さい。

      さて、ここまでが出来たとしても、カメラを用いたプログラムについては
      Raspberry Pi専用カメラを前提とした記述となっています。

      このあたりでWindows用anacondaに関するご質問はお控え頂けると幸いです。

      よろしくお願いします。

      削除
  4. サポートベクターマシンや多層ニューラルネットワークで紹介があった分類結果をグラフの背景の色分けによる可視化を、deep learningの分類結果にも応用可能でしょうか。可能な場合プログラムはどのようになるのでしょうか。2特徴量、2クラスでの分類を試みているのですが、reshapeのところで数値エラーが出てしまいます。ValueError: cannot reshape array of size 320000 into shape (600,600)よろしくお願いいたします。

    返信削除
    返信
    1. 独自データの解析に関する質問はサポート対象外ですので、
      本書プログラムml-10-01-iris-deep-learn.pyをベースに解説します。

      さらに、2特徴量2クラスのプログラムのグラフ化に関しても
      サポート外の内容ですので手短に解説します。

      ここで解説するのは、
      4特徴量3クラスのプログラムml-10-01-iris-deep-learn.py
      を2特徴量2クラスのプログラムに改造し、
      それをml-04-02-2feat2class01.pyを参考にグラフ表示する、という内容です。

      まず、ml-10-01-iris-deep-learn.pyにおいてml-04-02-2feat2class01.pyを参考に
      X = iris.data
      y = iris.target
      の後に、下記の3行を追加します。それにより、2特徴量2クラスのプログラムになります。
      X = X[:,:2]
      X = X[y!=2]
      y = y[y!=2]

      この時点でml-10-01-iris-deep-learn.pyを実行してエラーが出ないことを確認してください。

      次に、グラフ描画部分をml-04-02-2feat2class01.pyからml-10-01-iris-deep-learn.pyに移植します。
      history = model.fit(X, y_keras, epochs=4000, validation_split=0.1, batch_size=n_samples, verbose=2)
      の次の行にまず以下の6行を追加します(コメントは全て省略しています)

      x_min = min(X[:,0]) - 1
      x_max = max(X[:,0]) + 1
      y_min = min(X[:,1]) - 1
      y_max = max(X[:,1]) + 1
      XX, YY = np.mgrid[x_min:x_max:500j, y_min:y_max:500j]
      Xg = np.c_[XX.ravel(), YY.ravel()]

      さらにそのまま続けて、モデルの予測に関する以下の2行を追加します。

      Z = model.predict_classes(Xg, verbose=0)
      Z = Z.reshape(XX.shape)

      最後に、そのまま続けてグラフ描画部を追加します。

      cmap01 = ListedColormap([(0.5, 1, 1, 1), (1, 0.93, 0.5, 1)])
      plt.pcolormesh(XX, YY, Z==0, cmap=cmap01)
      plt.xlabel('sepal length')
      plt.ylabel('sepal width')
      Xc0 = X[y==0]
      Xc1 = X[y==1]
      plt.scatter(Xc0[:,0], Xc0[:,1], c='#E69F00', linewidths=0.5, edgecolors='black')
      plt.scatter(Xc1[:,0], Xc1[:,1], c='#56B4E9', linewidths=0.5, edgecolors='black')
      plt.show()

      なお、ml-10-01-iris-deep-learn.pyの冒頭に
      from matplotlib.colors import ListedColormap
      を追加する必要があります。

      以上です。

      なお、追加した内容はほぼml-04-02-2feat2class01.pyの内容からコピーしてきたものです。

      削除
    2. 早々にありがとうございます。うまくいきました。貴著携えヘルシンキに来ております。

      削除
  5. 104ページですが「「ml-04-02-2feat2class01.py」を実行すれば図4-7のようなグラフが現れます。」とありますが、現れません。現在トラブルシューティング中です。なにか有力な情報があればご教示いただきたくお願いいたします。

    返信削除
    返信
    1. もう少し実行環境やエラーメッセージなどについて説明があれば
      解決の糸口がつかめるかもしれません。

      基本的にml-04-02-2feat2class01.pyでしたら、
      scikit-learnがインストールされていれば実行可能です。

      ケース(1)
      sudo apt install python-sklearn
      でscikit-learnをインストールしたのなら、Python2で利用可能になります。
      コマンド
      python ml-04-02-2feat2class01.py
      で実行します。

      ケース(2)
      sudo apt install python3-sklearn
      でscikit-learnをインストールしたのなら、Python3で利用可能になります。
      コマンド
      python3 ml-04-02-2feat2class01.py
      で実行します。

      なお、ケース(2)でインストールした場合ならば
      GUIをもつ開発環境である Thonny Python IDE でも実行可能です。

      なお、上で記した内容は、全てラズベリーパイのデスクトップ上で
      実行する方法です。上級者が行うように
      「WindowsやmacOSなどからターミナルでログインしている」
      場合はグラフの表示に失敗しますのでご注意ください。

      削除
  6. 金丸様の書かれた当該参考図書で機械学習のイメージがかなりわかりました。実際にじゃんけんゲームもカメラモジュールを接続して作成して完成できました。ありがとうございます。
    本日は質問があり、コメントを書かせていただきました。お時間のある時にお教え頂ければ幸いでございます。
    (質問)
    /bluebacks $ python ml-10-04-digits-cnn-load.py ml-digits-cnn.h5
    を実行すると下記の様なエラーになります。

    pi@raspberrypi:~/bluebacks $ python ml-10-04-digits-cnn-load.py ml-digits-cnn.h5
    Using Theano backend.
    Traceback (most recent call last):
    File "ml-10-04-digits-cnn-load.py", line 18, in
    model = keras.models.load_model(savefile)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 458, in load_wrapper
    return load_function(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 550, in load_model
    model = _deserialize_model(h5dict, custom_objects, compile)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 243, in _deserialize_model
    model = model_from_config(model_config, custom_objects=custom_objects)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/saving.py", line 593, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
    File "/usr/local/lib/python2.7/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
    File "/usr/local/lib/python2.7/dist-packages/keras/utils/generic_utils.py", line 147, in deserialize_keras_object
    list(custom_objects.items())))
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/sequential.py", line 302, in from_config
    model.add(layer)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/sequential.py", line 166, in add
    layer(x)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/base_layer.py", line 425, in __call__
    self.build(unpack_singleton(input_shapes))
    File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 141, in build
    constraint=self.kernel_constraint)
    File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/keras/engine/base_layer.py", line 243, in add_weight
    weight = K.variable(initializer(shape, dtype=dtype),
    File "/usr/local/lib/python2.7/dist-packages/keras/initializers.py", line 218, in __call__
    dtype=dtype, seed=self.seed)
    File "/usr/local/lib/python2.7/dist-packages/keras/backend/theano_backend.py", line 2668, in random_uniform
    return rng.uniform(shape, low=minval, high=maxval, dtype=dtype)
    File "/usr/local/lib/python2.7/dist-packages/theano/sandbox/rng_mrg.py", line 872, in uniform
    rstates = self.get_substream_rstates(nstreams, dtype)
    File "/usr/local/lib/python2.7/dist-packages/theano/configparser.py", line 117, in res
    return f(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/theano/sandbox/rng_mrg.py", line 771, in get_substream_rstates
    assert isinstance(dtype, str)
    AssertionError

    返信削除
    返信
    1. 下記ページに記しましたとおり、2019年8月頃より、kerasとtheanoをpython2で用いることができなくなっているようです。

      https://mlbb1.blogspot.com/2018/03/blog-post.html
      「p.327 ml-10-02-iris-deep-load.pyの実行コマンド(配布された学習済ファイルを用いる場合」

      そこで、上記ページの内容を下記の順でたどり、
      python2ではなくpython3で実行してみて頂けないでしょうか?
      (その方法は上記ページの下記項目に書いてあります)

      「p.308 kerasとtheanoの利用の前に」
      「p.308 kerasとtheanoの利用に必要なツールをインストールするためのコマンド」
      「p.309 kerasとtheanoをインストールするためのコマンド」

      お手数ですがよろしくお願いします。

      削除
  7. 手順に沿って、tensorflowを用いた手書き認識をやってみました。

    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    手書き数字の認識を行うml-10-06-digits-cnn-gui-mod.pyを実行してみます。
    python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5

    pi@raspberrypi3B:~/bluebacks $ python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
    結果は、以下の通りでした。うまく行っていないようですが、どこが行けないのか分かりません。
    コメントをお願いします。

    2021-01-15 13:50:24.551226: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory
    Traceback (most recent call last):
    File "/home/pi/.local/lib/python3.7/site-packages/keras/__init__.py", line 3, in
    from tensorflow.keras.layers.experimental.preprocessing import RandomRotation
    ModuleNotFoundError: No module named 'tensorflow.keras.layers.experimental.preprocessing'

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "ml-10-06-digits-cnn-gui-mod.py", line 2, in
    import keras
    File "/home/pi/.local/lib/python3.7/site-packages/keras/__init__.py", line 6, in
    'Keras requires TensorFlow 2.2 or higher. '
    ImportError: Keras requires TensorFlow 2.2 or higher. Install TensorFlow via `pip install tensorflow`

    お手数をかけますが、よろしくお願いいたします。

    返信削除
    返信
    1. 恐らくtensorflow 1.14 と kerasの組み合わせで実行しようとしているのだと思われますが、
      keras をそのままインストールすると、tensorflow 2.2 以上が求められるバージョンがインストールされ、実行時にエラーが出ます。

      そのため、ページの指示の通り、

      sudo pip3 install keras==2.3.1

      のようにバージョンを指定してkeras をインストールする必要があります。

      上記インストールコマンドを実行すればkerasがダウングレードされ、
      プログラムを実行できるようになります。

      削除
    2. sudo pip3 install keras==2.3.1 としてインストールしてありますが、再インストールしておきました。

      やはり結果は、
      'Keras requires TensorFlow 2.2 or higher. '
      ImportError: Keras requires TensorFlow 2.2 or higher. Install TensorFlow via `pip install tensorflow`

      と出てしまいます。

      削除
    3. エラーメッセージを見ることで、状況がわかりました。

      まず、jazzwalkerさんの Raspberry Piには以下の二つのバージョンの
      keras がインストールされています。

      keras 2.3.1: 正常動作するkeras
      keras 2.4.3: エラーが出るkeras

      そして、プログラム実行時にはエラーの出る keras 2.4.3 が
      優先して使われている、というわけです。

      なぜこうなっているのか、以下で整理して解説します。

      1. keras 2.3.1
      システム領域 /usr/local/lib/python3.7/dist-packages に存在
      管理者権限のコマンド sudo pip3 install keras==2.3.1 でインストールされた


      2. keras 2.4.3
      ユーザーpiの領域 /home/pi/.local/lib/python3.7/site-packages に存在
      ユーザー権限のコマンド pip3 install keras でインストールされた


      すなわち、正しい管理者権限のコマンド
      sudo pip3 install keras==2.3.1
      を実行する前に、どこかのタイミングでユーザー権限のコマンド
      pip3 install keras
      を実行したことで2つのバージョンのkerasが共存したと思われます。

      なお、私の書籍およびホームページでは pip3 コマンドは
      全て管理者権限(sudo つき)で実行する方針で記しております。

      さて、ユーザーpiの領域にある keras 2.4.3 を削除するには、
      ユーザー権限で(sudo なしで)下記のコマンドを実行してください。

      pip3 uninstall keras

      途中で

      Proceed (y/n)?

      と聞かれたら、キーボードで y をタイプして Enter です。

      以上で、keras 2.3.1 が使われるようになり、プログラムが実行できるはずです。

      なお、jazzwalkerさんのこれまでの Raspberruy Pi の利用状況はわかりませんが、
      このようにシステム領域のツールとユーザーpiの領域のツールが混在している可能性があります。

      今後のこのようなトラブルが続く場合、一度OSを再インストールしてツールを整理した方が
      良いかもしれません。

      以上です。

      削除
    4. お手数をおかけしております。

      ご指導のように、pip3 uninstall keras を実行し、該当のバージョンをアンインストールしました。

      その上で、
      python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5 を実行したところ、エラーが残りました。

      pi@raspberrypi3B:~/bluebacks $ python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
      Using TensorFlow backend.
      2021-01-16 12:14:15.084348: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory
      Traceback (most recent call last):
      File "ml-10-06-digits-cnn-gui-mod.py", line 22, in
      model = keras.models.load_model(savefile)
      File "/usr/local/lib/python3.7/dist-packages/keras/engine/saving.py", line 492, in load_wrapper
      return load_function(*args, **kwargs)
      File "/usr/local/lib/python3.7/dist-packages/keras/engine/saving.py", line 584, in load_model
      model = _deserialize_model(h5dict, custom_objects, compile)
      File "/usr/local/lib/python3.7/dist-packages/keras/engine/saving.py", line 273, in _deserialize_model
      model_config = json.loads(model_config.decode('utf-8'))
      AttributeError: 'str' object has no attribute 'decode'

      コメントを頂ければありがたいです。

      削除
    5. エラー内容で検索すると下記のページが引っ掛かります。

      【Keras】エラー 'str' object has no attribute 'decode'について
      https://qiita.com/Hiroki-Fujimoto/items/b078bfb680fb710c38c1

      上記ページが当てはまるとするならば、

      sudo pip3 uninstall h5py

      および

      pip3 uninstall h5py

      にて、pip3 でインストールされた h5py をアンインストールする必要があるででしょう。

      なお、私の書籍およびホームページでは h5py は
      apt コマンドで python3-h5p パッケージをインストールしていますので、
      pip3 によるインストールの必要はありません。


      さて、原則的に私の書籍およびホームページでは、
      インストール直後の Rasberry Pi OS で動作検証しております。

      他の書籍やサイトで作業をした後のRaspberry Pi OSでは、
      ツールの不整合などの理由で動作しないことがありますので、
      サポートができない場合がありますのでご了承下さい。

      そのため、先ほどのコメントにも記しましたように、
      トラブルが続くようでしたら OS の再インストールをお勧めします。

      削除
    6. コメントありがとうございました。

      sudo pip3 uninstall h5py の後、
      sudo pip3 install h5py==2.10.0

      これで
      python3 ml-10-06-digits-cnn-gui-mod.py ml-digits-cnn.h5
      が実行されました。

      ご指導ありがとうございました。

      削除