Tensorflowをバージョン2.8から2.16へ乗り換えました

しょくぶつ(^ ^)です。
本ブログの「第2回 : キャプチャー画像を機械学習で判別、声でお知らせ」にて、
「次回以降は、どうやって予測モデルを作ったか、その方法を少しずつ、書いていきます。」
と書いて、もう少しで1年。
執筆中でしたが、予測モデルで使うPythonライブラリの1つ、
Tesorflow
のバージョンを、いままで使っていた 2.8 から 2.16 に変えて、書き直すことにしました。

理由は、下記のような機能アップ (^ ^) とか、古い書式切り捨て感 (;;) とか、あるからです。
たとえば・・・

  • Tesorflow  2.16からKeras3が使われています。
    Tesorflow 2.15まで使われていたKeras2ではバックエンドはTensorflowだけでした。keras3ではフレームワーク(深層学習ライブラリ)をバックエンドとして切り替え、つまり、TensorflowとPyTorchとJAXを簡単に切り替えられます。
    Keras3のページ(英語)

  • 学習時のOptimizer(※)の書式が古いとすごく叱られる。
    (※ニューラルネットワーク学習時の最適化アルゴリズム)
    learning_rateとかDecayとかの書式が古いと、TF2.16では「Argument decay is no longer supported and will be ignored.」と冷たく突き放すWarningが出ます。
    学習することはするのですが、古いTF(たとえばTF2.8)では読みこめない学習結果となります。
    回避方法はあって、例えばoptimizers.SGD は optimizers.legacy.SGDと書き換えると古いTFで読み込みOKとなりますが、legacyというのが潮時感あり。

  • 書式を新しくすると学習結果ファイルサイズが小さくなることがあります。
    たとえば38Mbyteだったものが19 Mbyteになりました。

というわけで、いつまでもTensorflowのバージョンを2.8のままという訳にはいかず、
そろそろ2.16に乗り換えなければいけないですよね。

1024x538

のんきなしょくぶつ(^ ^) ですが、この変化についていけば今後書いたブログは2~3年はお役に立つものになるかなと思い、頑張っています。

さて、GPUを使うと学習データ作成が劇的に速くなるのはご存じの通りですが、
TF2.16だとGPU活用が問題となります。
それは、
「Windows 上のソースからビルドする,Windows 上のソースからビルドする | TensorFlow
によると、

「 TF 2.11 以降、CUDA ビルドは Windows ではサポートされません。 Windows で TensorFlow GPU を使用するには、WSL2 で TensorFlow をビルド/インストールするか、TensorFlow-DirectML-Plugin で tensorflow-cpu を使用する必要があります。」」

ということです。
なにかというと、

  • Tensorflow 2.16だと、”WSL2(Windows Subsystem for Linux )” を使わないとWindowsではGPUを使えないよ

ということです。
なお、『いやいや、TensorFlow-DirectML-Pluginを使えばいいんでしょ』と、いそいそとTensorFlow-DirectML-Pluginの使用をトライしたのですが、これはTF2.10までしか対応していませんでした。(上記リンクの記載はまちがいということですよね ?!)

これは悲しい。

ひとことで言うと、GPU活用の間口がすごく狭まってしまいました。

しかし賞味期限が近いライブラリのテクニックをご紹介しても、むしろ皆さんへの迷惑。
↓ そ
↓ こ
↓ で
Tensorflowのバージョン2.8から2.16への乗り換えにあたり、

  • Nvidia GPU未使用の学習までは
    『方針1 Windows環境下(Powershell環境下)(のまま)』
    とします。

    •  メリット
       WSL2環境構築が不要。WSL2では問題となるUSBカメラ使用設定も不要
    • デメリット
       TF2.16ではGPUは使用できません。
  • Nvidia GPU使用の学習のみ、
    『方針2 Powershellではなく、WSL2 で TensorFlow を使用』
    とします。

    • メリット
      Nvidia GPUの性能活かせる ※ただし要件有り。GeForce 740以下だとダメかも。
    • デメリット
      環境構築(WSL2のインストール)が必要。
      あと、Spyderを使うならば日本語化作業が必要です。
      またopencvからWebカメラを使うのも工夫が必要みたいです。

なお、Nvidia GPU以外でのGPU学習はあきらめます。
(AMD GPUならばROCmとかPlaidMLとか使えば可能? Intel GPUはダメそうです。)

というわけで、まずは過去記事をTensorflow 2.16用にアップデートしています。

その後、
「『キャプチャー画像を機械学習で判別、声でお知らせ』の予測モデルをどうやって作ったか」
をアップしますね。

↓も
↓し
↓か
↓し
↓て
この記事、Tensorflow 2.8から2.16へ対応するためのコード修正方法を期待してお読みになっていましたか !?
失礼しました。
そのつもりはなかったのですが、一例を書きますね (^ ^; 。

ライブラリのimport時

“ keras” は “tensorflow.keras”に修正します。
例えば、

from keras.preprocessing.image import ImageDataGenerator

from tensorflow.keras.preprocessing.image import ImageDataGenerator

ただし全てがそれではうまくいかず、下記のように修正する場合もあります。

from tensorflow.python.keras.models import load_model
・・・
loaded_model =load_model('buki-classification.h5')

修正

from tensorflow import keras
・・・
loaded_model=keras.models.load_model(' buki-classification.keras')

※ モデルの読み込みはh5形式ではなくkeras形式にしている点に注意(後述)

Optimizerの書き方

元 (Tensorflow >=2.3の古い書き方です。)

sgd = optimizers.legacy.SGD(lr=0.005, decay=1e-6, momentum=0.9, nesterov=True)

修正

lr_schedule = optimizers.schedules.ExponentialDecay(
    initial_learning_rate=1e-2,
    decay_steps=10000,
    decay_rate=0.9)
sgd = optimizers.SGD(learning_rate=lr_schedule)

モデルの保存

h5形式でも保存できるのですが、古いっていうワーニングが出るのと、TF2.16未満だと読めないデータで保存されて紛らわしいので、
できればkeras形式で保存することとします。

model.save('buki-classification.h5')

修正

model.save('buki-classification.keras')
プロフィール
この記事を書いた人
しょくぶつ (^ ^)

機械系の技術者です。学会発表13、論文掲載6(和・英)。プログラミング歴40年(つまり8bit世代ですね)。ゲーム歴40年(ファミコン世代ですね)。
お問い合わせは下記のメールアドレスにお寄せください。
plantsmilehatena@gmail.com

しょくぶつ (^ ^)をフォローする
python
しょくぶつ (^ ^)をフォローする
タイトルとURLをコピーしました