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

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

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

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

Q&A

解決済

1回答

3740閲覧

tensorflow1.4.0での変数のrestoreについて

KEEL

総合スコア52

Python

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

0グッド

1クリップ

投稿2018/01/03 08:35

編集2018/01/04 01:54

Windows10, Anaconda上でtensorflow1.4.0を用いて学習済みモデルの読み込みをしたいと考えています。そこでMNISTのコードを改変しましたが、現状、変数がrestoreされず困っています。

###変数をsaveするコード
このコードではrestoreができているようです。

python:savemodel.py

1 2import tensorflow as tf 3from tensorflow.examples.tutorials.mnist import input_data 4 5# データ読み込み 6mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 7 8# placeholder用意 xは学習用画像 9x = tf.placeholder(tf.float32, [None, 784]) 10# y_は学習用ラベル 11y_ = tf.placeholder(tf.float32, [None, 10]) 12 13# weightとbias 14# さっきの例ではw * xだったけど、今回はw * x + b 15W = tf.Variable(tf.zeros([784, 10]),name='W') 16b = tf.Variable(tf.zeros([10]),name='b') 17 18# Softmax Regressionを使う yはモデル 19y = tf.nn.softmax(tf.matmul(x, W) + b) 20 21# 交差エントロピー 22cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 23 24# 先ほど使ったGradientDescentOptimizerで、今回はcross_entropyを利用 25train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 26 27model_path = './model/model.ckpt' 28 # 初期化 29init = tf.global_variables_initializer() 30sess = tf.Session() 31sess.run(init) 32 33# 学習 34for i in range(1000): 35 batch_xs, batch_ys = mnist.train.next_batch(100) 36 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 37 if i == 999: 38 saver = tf.train.Saver() 39 saver.save(sess,model_path) 40 print("model saved" + model_path) 41 print(sess.run(W)) 42 print(sess.run(b)) 43 44# テストデータで予測 45correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 46accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 47acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) 48print('accuracy : '+str(acc)); 49sess.close() 50 51sess = tf.InteractiveSession() 52init = tf.global_variables_initializer() 53sess.run(init) 54 55saver.restore(sess,model_path) 56print(sess.run(W)) 57print(sess.run(b)) 58correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 59accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 60acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) 61print('accuracy : '+str(acc)) 62

実行時コンソール出力
この時Wとbの値を表示させておりどちらも同じ値が確認できます。

Extracting MNIST_data/train-images-idx3-ubyte.gz Extracting MNIST_data/train-labels-idx1-ubyte.gz Extracting MNIST_data/t10k-images-idx3-ubyte.gz Extracting MNIST_data/t10k-labels-idx1-ubyte.gz model saved./model/model.ckpt [[ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] ..., [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.]] [-0.61506635 0.45124692 0.21486145 -0.35527256 -0.03915499 1.95576119 -0.17007764 0.89766943 -1.96336353 -0.37660047] accuracy : 0.9153 INFO:tensorflow:Restoring parameters from ./model/model.ckpt [[ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] ..., [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.]] [-0.61506635 0.45124692 0.21486145 -0.35527256 -0.03915499 1.95576119 -0.17007764 0.89766943 -1.96336353 -0.37660047] accuracy : 0.9153

###変数をrestoreするコード
このコードでは変数のrestoreが出来ていないようです。

python:restoremodel.py

1import tensorflow as tf 2from tensorflow.examples.tutorials.mnist import input_data 3mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 4 5x = tf.placeholder(tf.float32, [None, 784]) 6y_ = tf.placeholder(tf.float32, [None, 10]) 7 8W = tf.Variable(tf.zeros([784, 10])) 9b = tf.Variable(tf.zeros([10])) 10 11y = tf.nn.softmax(tf.matmul(x, W) + b) 12 13init = tf.global_variables_initializer() 14sess = tf.Session() 15sess.run(init) 16 17saver = tf.train.import_meta_graph('./model/model.ckpt.meta') 18model_path = './model/model.ckpt' 19 20ckpt = tf.train.get_checkpoint_state('./model/') 21print(ckpt) 22 23saver.restore(sess,model_path) 24print(sess.run(W)) 25print(sess.run(b)) 26correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 27accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 28acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) 29print('accuracy : '+str(acc)); 30

実行時コンソール出力
こちらでもWとbの値を表示させていますがbの値が正しく読み込まれていないようです。

Extracting MNIST_data/train-images-idx3-ubyte.gz Extracting MNIST_data/train-labels-idx1-ubyte.gz Extracting MNIST_data/t10k-images-idx3-ubyte.gz Extracting MNIST_data/t10k-labels-idx1-ubyte.gz model_checkpoint_path: "./model/model.ckpt" all_model_checkpoint_paths: "./model/model.ckpt" INFO:tensorflow:Restoring parameters from ./model/model.ckpt accuracy : 0.098 [[ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] ..., [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.] [ 0. 0. 0. ..., 0. 0. 0.]] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

学習済みモデルの読み込みをし、正解率を表示させたいのですがsaver.restore(sess,model_path)の命令で変数が読み込まれると解釈しましたが、コンソールの出力を見るとbの値が読み込めていないように見受けられます。
そこでなんらかの方法で学習済みモデルを復元する方法を教えていただきたいです。
まだ勉強を始めて日が浅く、分からないことが多いため初歩的な質問で申し訳ないですが回答をいただけると幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/01/03 18:11 編集

変数をsaveするコード-->restore OK、変数をrestoreするコード-->restore NGのようですが、「変数をrestoreするコード」のように改変したところ、値がきちんとロードされなくなったということでしょうか?もう少し、○○をしたくて、××をしたけれども、どこの部分(どの行で)どうならなくて困っている、という書き方をした方が回答が得られやすいと思います。
KEEL

2018/01/04 01:56

アドバイスありがとうございますご指摘の通りです
guest

回答1

0

ベストアンサー

saver = tf.train.import_meta_graph(...)という書き方を初めて見ました。
試していないのでいけませんが、ここが怪しい気がします。

気になって調べると、以下の関係がある事が分かります。

操作対象書き出し読み出し
セッションsaver.save(...)saver.restore
メタグラフexport_meta_graphimport_meta_graph

問題はセッションの復旧だと思いますので、以下のようにして、メタグラフのコードをバッサリ削ってはいかがでしょうか?

Python

1# saver = tf.train.import_meta_graph('./model/model.ckpt.meta') 2saver = tf.train.Saver() 3model_path = './model/model.ckpt' 4 5ckpt = tf.train.get_checkpoint_state('./model/') 6print(ckpt) 7 8saver.restore(sess,model_path)

2018-01-04 16:55 追記

書き替えを適用するとこんな感じです。
確認のため学習を10STEPくらいで止めたものを保存しました。
結果、Accuracyは0.90弱でしたが、ロード後(以下のコードです)で学習を飛ばして判定させても結果は0.90弱になりました。

ロード後のイメージ写真を貼りますね。
イメージ説明

Python

1# coding: UTF-8 2import tensorflow as tf 3from tensorflow.examples.tutorials.mnist import input_data 4 5# データ読み込み 6mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 7 8# placeholder用意 xは学習用画像 9x = tf.placeholder(tf.float32, [None, 784]) 10# y_は学習用ラベル 11y_ = tf.placeholder(tf.float32, [None, 10]) 12 13# weightとbias 14# さっきの例ではw * xだったけど、今回はw * x + b 15W = tf.Variable(tf.zeros([784, 10]),name='W') 16b = tf.Variable(tf.zeros([10]),name='b') 17 18# Softmax Regressionを使う yはモデル 19y = tf.nn.softmax(tf.matmul(x, W) + b) 20 21# 交差エントロピー 22cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) 23 24# 先ほど使ったGradientDescentOptimizerで、今回はcross_entropyを利用 25train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 26 27 28# 初期化に関するコードの書き換え 29# ------------------------------------------- 30 31# model_path = './model/model.ckpt' 32# # 初期化 33#init = tf.global_variables_initializer() 34#sess = tf.Session() 35#sess.run(init) 36 37model_path = './model/model.ckpt' 38# 初期化 39init = tf.global_variables_initializer() 40sess = tf.Session() 41saver = tf.train.Saver() 42saver.restore(sess,model_path) 43sess.run(init) 44# ------------------------------------------- 45 46 47# データ読み込み確認のため学習はコメントアウト 48# ------------------------------------------- 49# 学習 50#for i in range(1000): 51# print(i) 52# batch_xs, batch_ys = mnist.train.next_batch(100) 53# sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 54# if i == 99: 55# saver = tf.train.Saver() 56# saver.save(sess,model_path) 57# print("model saved" + model_path) 58# print(sess.run(W)) 59# print(sess.run(b)) 60# ------------------------------------------- 61 62# テストデータで予測 63correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 64accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 65acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) 66print('accuracy : '+str(acc)); 67sess.close() 68 69sess = tf.InteractiveSession() 70init = tf.global_variables_initializer() 71sess.run(init) 72 73saver.restore(sess,model_path) 74print(sess.run(W)) 75print(sess.run(b)) 76correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 77accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 78acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) 79print('accuracy : '+str(acc))

投稿2018/01/04 02:22

編集2018/01/04 07:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KEEL

2018/01/04 05:49

回答ありがとうございます ご指摘の通り'saver = tf.train.import_meta_graph('./model/model.ckpt.meta')'の部分を'saver = tf.train.Saver()'としたところ NotFoundError: Key Variable_4 not found in checkpoint [[Node: save_4/RestoreV2_4 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save_4/Const_0_0, save_4/RestoreV2_4/tensor_names, save_4/RestoreV2_4/shape_and_slices)]] といったエラーが出るようになりました。 このエラーの解決法を調べるとモデルの構築前に'tf.reset_default_graph()'を挟むと書いてあったのでこれをモデルの構築前に追加し実行するとエラーは出なくなりましたが、実行結果は上述のようにWもbも全て0となってしまいました。
退会済みユーザー

退会済みユーザー

2018/01/04 07:50

回答を書き換えますね
退会済みユーザー

退会済みユーザー

2018/01/04 08:00

書き替え後のコードの「# テストデータで予測」のあたりが、先の読み込み処理と重複していますが、元のコードからあまり変えすぎると分かりにくくなると思って、そのまま直さずにおいてあります。実装する際には重複する部分は適当に修正ください。
KEEL

2018/01/04 11:55

実行できました ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問