質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1027閲覧

Tensor Flow2.XにおけるSaved Model を再コンパイルせずに利用したい.

takumi2786

総合スコア4

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/10 01:26

#Tensor Flow2.XにおけるSaved Model読み込みについて.

##利用環境
Tensor flow 2.3
Python 3.6.9

問題点

TensorFlowでsaved model形式でモデルを保存し,読み込んだ際に,モデルを再コンパイルしないと,正しい精度が出ないようです.

モデル読み込み次にコンパイルを自動で行わせ,モデルを利用する際は,saved modelを読み込むだけにするような方法はありますか?

症状

まず,以下のようにモデルを学習させ,コールバックにより保存します

python

1model = create_model() 2checkpoint_path = "training_1/cp.ckpt" 3checkpoint_dir = os.path.dirname(checkpoint_path) 4 5# チェックポイントコールバックを作る 6cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path, 7 verbose=1) 8# 新しいコールバックを用いるようモデルを訓練 9model.fit(train_images, 10 train_labels, 11 epochs=10, 12 validation_data=(test_images,test_labels), 13 callbacks=[cp_callback]) # 訓練にコールバックを渡す

これにより,以下のような構造でモデルが保存されます.
イメージ説明

次に,モデルを以下のコードで読み込み,精度を評価します.

python

1# リストアされたモデルを評価 2new_model = tf.keras.models.load_model('training_1/cp.ckpt') 3 4# loss関数を手動で設定する必要がある? 5# new_model.compile(optimizer='adam', 6# loss='sparse_categorical_crossentropy', 7# metrics=['accuracy']) 8 9# new_model = create_model() 10 11new_model.load_weights("training_2/cp-0050.ckpt") 12 13loss, acc = new_model.evaluate(test_images, test_labels, verbose=2) 14print('Restored model, accuracy: {:5.2f}%'.format(100*acc))

32/32 - 0s - loss: 0.4815 - accuracy: 0.0900

Restored model, accuracy: 9.00%

このとき,モデルの正答率が9%程度と,かなり低くなってしまいます.

ただし,モデルロードの後にモデルコンパイルを実行すると,精度は学習時と同様になるようです.

python

1# リストアされたモデルを評価 2new_model = tf.keras.models.load_model('training_1/cp.ckpt') 3 4# loss関数を手動で設定する必要がある? 5new_model.compile(optimizer='adam', 6 loss='sparse_categorical_crossentropy', 7 metrics=['accuracy']) 8 9# new_model = create_model() 10 11new_model.load_weights("training_2/cp-0050.ckpt") 12 13loss, acc = new_model.evaluate(test_images, test_labels, verbose=2) 14print('Restored model, accuracy: {:5.2f}%'.format(100*acc))

32/32 - 0s - loss: 0.4815 - accuracy: 0.8830

Restored model, accuracy: 88.30%

モデルを構築した関数は,以下です.

python

1# 短いシーケンシャルモデルを返す関数 2def create_model(): 3 model = tf.keras.models.Sequential([ 4 keras.layers.Dense(512, activation='relu', input_shape=(784,)), 5 keras.layers.Dropout(0.2), 6 keras.layers.Dense(10, activation='softmax') 7 ]) 8 9 model.compile(optimizer='adam', 10 loss='sparse_categorical_crossentropy', 11 metrics=['accuracy']) 12 13 return model

##参考:
今回のコードは下記リンクのものを流用しています.
TensorFlowドキュメント モデルの保存と復元

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問