以前保存した Keras モデルをロードすると結果が異なる理由: 経験と教訓

以前保存した Keras モデルをロードすると結果が異なる理由: 経験と教訓

機械学習モデルは、これまで以上に実稼働環境で広く使用されるようになりました。 Keras は、強力な機械学習およびディープラーニング モデルを作成するための人気のあるライブラリの 1 つです。ただし、実際のデータとモデル アーキテクチャによっては、これらのモデルのトレーニング プロセスは計算コストが高く、時間がかかることがよくあります。モデルによっては、トレーニングに数週間から数か月かかるものもあります。したがって、モデルをローカルに保存し、予測が必要になったときに再度取得できることが重要になります。しかし、何らかの理由で保存したモデルが正しく読み込まれない場合はどうすればよいでしょうか? 自分の経験に基づいて回答してみたいと思います。

Keras モデルの使用方法と保存方法については詳しく説明しません。読者がこのプロセスに精通していることを前提として、ロード時に予期しないモデルの動作に対処する方法に直接進みます。つまり、Model 変数に保存されている Keras モデルをトレーニングした後、そのまま保存して、次回ロードするときにトレーニングをスキップして予測のみを行えるようにします。

私が好むアプローチは、モデルの作成時にランダムに生成され、モデルのトレーニング時に更新されるモデルの重みを保存することです。そこで、model.save_weights("model.h5")をクリックしました。モデルによって学習された重みを含む「model.h5」ファイルが作成されます。次に、別のセッションで、以前と同じアーキテクチャを使用してモデルを再構築し、 new_model.load_weights("model.h5") を使用して保存したトレーニング済みの重みをロードしました。すべて順調のようです。ただ、new_model.predict(test_data) をクリックした後、精度がゼロになるのですが、その理由はわかりません。

モデルが正しい予測を行えない理由はたくさんあることが判明しました。この記事では、最も一般的な原因をまとめ、その解決方法について説明します。

1. まずデータを注意深く確認してください。

明らかなことのように思えますが、1 つのミスが、ディスクからモデルを再ロードするときにパフォーマンスの低下につながる可能性があります。たとえば、言語モデルを構築する場合は、新しいセッションごとに次の操作を実行する必要があります。

  • クラス ラベルの順序を再確認してください。番号にマッピングした場合は、各セッションで各クラス ラベルに同じ番号が付けられていることを再確認してください。これは、毎回異なる順序でタグを返す list(set()) 関数を使用して取得している場合に発生する可能性があります。これにより、ラベルの予測が台無しになる可能性があります。
  • データセットを検査します。テスト データが別のファイルにない場合は、トレーニングとテストの分割がランダムでないことを確認してください。ランダムでないと、予測を行うたびに異なるデータに基づいて予測することになり、予測の精度に一貫性がなくなります。

もちろん、作業する分野によっては、他のデータ関連の問題に遭遇する可能性もあります。ただし、データ表現の一貫性は常に確認してください。

2. メトリクスの問題

エラーや一貫性のない結果のもう一つの原因は、精度測定の選択です。モデルを構築してその重みを保存するときは、通常、次の操作を行います。

 def build_model ( max_len , n_tags ):
input_layer = 入力( 形状= ( max_len ,))
output_layer = Dense ( n_tagsactivation = 'softmax' )( input_layer )
model = モデル( 入力層出力層)

リターンモデル

モデル= build_model ()
モデル. コンパイル( オプティマイザ= "adam"
損失= "sparse_categorical_crossentropy"メトリック= [ "accuracy" ])

モデル. フィット(..)
モデル.save_weights ( "model.h5" )

新しいセッション/スクリプトで開く必要がある場合は、次の操作を行う必要があります。

 def build_model ( max_len , n_tags ):
input_layer = 入力( 形状= ( max_len ,))
output_layer = Dense ( n_tagsactivation = 'softmax' )( input_layer )
model = モデル( 入力層出力層)

リターンモデル
モデル= build_model ()
モデル. コンパイル( オプティマイザー= "adam"損失= "sparse_categorical_crossentropy"メトリック= [ "accuracy" ])
モデル.load_weights ( "model.h5" )
モデルを評価する( )

使用される特定の Keras/Tensorflow バージョンによっては、エラーが発生する可能性があります。この問題は、モデルをコンパイルし、メトリックとして「精度」を選択すると発生します。 Keras は、「スパース分類精度」、「分類精度」など、さまざまな精度の定義を認識します。作業するデータに応じて、異なる定義が推奨されるソリューションとなります。これは、メトリックを「精度」に設定すると、Keras は、データ分布に最も適していると思われる特定の精度タイプのいずれかを割り当てようとするためです。実行ごとに異なる精度メトリックが推測される可能性があります。ここでの最善の解決策は、Keras に精度メトリックを選択させるのではなく、常に精度メトリックを明示的に設定することです。例えば、

 モデル. コンパイル( オプティマイザ= "adam"
損失= "sparse_categorical_crossentropy"メトリック= [ "accuracy" ])

次と置き換えます:

 モデル. コンパイル( オプティマイザ= "adam"
損失= "sparse_categorical_crossentropy"メトリック= [ "sparse_categorical_accuracy" ])

3. ランダム性

以前と同じデータで Keras ニューラル ネットワークを再トレーニングする場合、同じ結果が 2 回得られることはほとんどありません。これは、Keras のニューラル ネットワークが重みを初期化するときにランダム性を使用するため、重みは実行するたびに異なる方法で初期化され、学習プロセス中に異なる方法で更新され、予測を行うときに同じ精度の結果が得られにくくなるためです。

何らかの理由でトレーニング前に重みを等しくする必要がある場合は、コードの前の部分で乱数ジェネレーターを設定できます。

 numpy.random からシードをインポートします
種子( 42 )
tensorflow からset_random_seed をインポートする
ランダムシードを設定する( 42 )

numpy ランダム シードは Keras に使用されますが、Tensorflow バックエンドでは独自の乱数ジェネレーターを同じシードに設定する必要があります。このコード スニペットにより、コードを実行するたびにニューラル ネットワークの重みが同じように初期化されるようになります。

4. カスタムレイヤーの使用に注意する

Keras は多くのレイヤー (Dense、LSTM、Dropout、BatchNormalization など) を提供しますが、モデル内のデータに対して特定のアクションを実行したいのに、そのための特定のレイヤーが定義されていない場合があります。一般的に、Keras は Lambda レイヤー クラスと基本レイヤー クラスの 2 種類のレイヤーを提供します。ただし、特にモデル アーキテクチャを json 形式で保存する場合は、これら 2 つのレイヤーに注意してください。 Lambda レイヤーの難しい部分は、シリアル化の制限です。これは Python バイトコードのシリアル化とともに保存されるため、保存されたのと同じ環境にのみロードでき、移植性はありません。この問題が発生した場合は、通常、モデル全体を保存するのではなく、keras.layers.Layer レイヤーを上書きするか、その重みのみを保存してモデルを最初から再構築することをお勧めします。

5. カスタムオブジェクト

多くの場合、カスタム関数を使用してデータに適用したり、損失/精度などのメトリックを計算したりする必要があります。

Keras では、モデルの保存/読み込み時に追加のパラメータを指定できるため、これが可能になります。以前に保存したモデルとともに、独自に作成した特別な損失関数をロードするとします。

 モデル= load_model ( "model.h5"custom_objects =
{ "custom_loss" : custom_loss })

このモデルを新しい環境にロードする場合、デフォルトではモデルを保存するときにこれらの関数は記憶されないため、新しい環境で custom_loss 関数を定義するように注意する必要があります。モデルのアーキテクチャ全体を保存したとしても、そのカスタム関数の名前も保存されますが、関数本体は追加で提供する必要があるものです。

6. グローバル変数初期化子

これは、バックエンドとして Tensorflow 1.x を使用する場合に特に重要です。多くのアプリケーションでそのバックエンドが依然として必要になる可能性があります。 tf 1.x セッションを実行するときは、すべての変数をランダムに初期化する tf.global_variables_initializer() を実行する必要があります。この副作用として、モデルを保存しようとすると、すべての重みが再初期化される可能性があります。次のコマンドを実行すると、この動作を手動で停止できます。

 keras.backend からmanual_variable_initialization をインポートします。manual_variable_initialization ( True )

結論

この記事では、新しい環境で Keras モデルが正しく読み込まれない最も一般的な原因となるいくつかの要因を示します。これらの問題によって予期しない結果が発生する場合もあれば、単にエラーが発生するだけの場合もあります。これらがいつどのように発生するかは、使用している Python のバージョンや Tensorflow および Keras のバージョンによって大きく異なります。これらのバージョンの中には互換性がないものもあり、予期しない動作につながる可能性があります。この記事を読めば、次にこの種の問題に遭遇したときにどこから始めればよいかがわかるようになるでしょう。

元のタイトル: 以前に保存した Keras モデルをロードすると異なる結果になる理由: 学んだ教訓、著者: Kristina Popova

<<:  機械学習は金融自動化においてどのような役割を果たすのでしょうか?

>>:  エヌビディアによる660億ドルのアーム買収は失敗、ソフトバンクはIPOを通じてアームの事業を独立上場へ

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

猫=チューリングマシン? 4つのテストにより、「猫コンピューター」が任意の計算を実行できることが証明された

柔らかくてかわいい猫は、いつも私たちに「猫を撫でたい」「猫を抱きしめたい」という衝動を掻き立てます。...

自動化とエンタープライズAIは2021年に大きく成長する

最近のガートナーの調査によると、労働力の自動化とエンタープライズ人工知能が 2021 年の主要なトレ...

ハイパーオートメーションはビジネスの未来か?企業にとって何ができるのでしょうか?

ロボティックプロセスオートメーション、人工知能、機械学習などの新しいテクノロジーを組み合わせることで...

2020 年の人工知能とディープラーニングの 5 つの将来トレンド

近年、人工知能は頻繁に話題になっていますが、まだ真の実現には程遠い状況です。 [[314350]]人...

...

IDCレポート:ジェネレーティブAIは爆発的な産業探査の時代に入り、技術供給側は商業化の初期段階にある

9月22日、IDCコンサルティングの公式WeChatアカウントによると、2023年下半期以降、ますま...

メタ、マイクロソフトなどの大手企業は、AIモデルの訓練に海賊版書籍を使用したとして、数人のアメリカ人作家から訴えられた。

現地時間水曜日のブルームバーグの報道によると、数人のアメリカ人作家が最近ニューヨーク連邦裁判所に訴訟...

Huaweiは封鎖を突破し、GoogleのDropout特許をベンチマークし、独自のアルゴリズムDisoutをオープンソース化

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

オンラインショッピングに革命が起こりました! Googleの最新AIモデルでは、姿勢を変えずにワンクリックで服を試着できる

ワンクリック着せ替えがGoogleで実現しました!このAIフィッティングモデルTryOnDiffus...

...

夜もカラフルに、ディープラーニングでフルカラー暗視システムを実現

いくつかの軍事大作映画では、兵士が暗視ゴーグルを装着して前方を捜索するシーンは欠かせないようです。暗...

Patronus AI が LLM に懸念すべきセキュリティ上の欠陥を発見

自動評価および安全性プラットフォームである Patronus AI は、大規模言語モデル (LLM)...