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

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

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

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

Q&A

解決済

1回答

1057閲覧

TensorFlowのセッション内でrestoreする際に起こるエラーについて

Mocchan2718

総合スコア15

Python

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

0グッド

1クリップ

投稿2017/07/16 06:04

###参考書を基に手書き文字の自動認識アプリケーションを実行したい
「TensorFlowで学ぶディープラーニング入門 畳み込みニューラルネットワーク徹底解説」という参考書でCNNについて勉強している者です。
現在、この参考書で、Chapter5-1の5.1.3「手書き文字の自動認識アプリケーション」のサンプルコードの実行を試みています。

この時、下記のようなエラーが表示され、アプリケーションの実行ができません。

###発生している問題・エラーメッセージ

NotFoundErrorTraceback (most recent call last) <ipython-input-11-4b0014ee6d3a> in <module>() 63 sess.run(tf.initialize_all_variables()) 64 saver = tf.train.Saver() ---> 65 saver.restore(sess, "cnn_session-20000") 66 67 # 手書き文字を入力するためのJavaScriptのコード . . . NotFoundError: Tensor name "Variable_23/Adam_1" not found in checkpoint files cnn_session-20000

###該当のソースコード

#!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from tensorflow.examples.tutorials.mnist import input_data np.random.seed(20160704) tf.set_random_seed(20160704) mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) # 1段目の畳み込みフィルターとプーリング層の定義 num_filters1 = 32 x = tf.placeholder(tf.float32, [None, 784]) x_image = tf.reshape(x, [-1, 28, 28, 1]) W_conv1 = tf.Variable(tf.truncated_normal([5, 5, 1, num_filters1], stddev=0.1)) h_conv1 = tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding="SAME") b_conv1 = tf.Variable(tf.constant(0.1, shape=[num_filters1])) h_conv1_cutoff = tf.nn.relu(h_conv1 + b_conv1) h_pool1 = tf.nn.max_pool(h_conv1_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") # 2段目の畳み込みフィルターとプーリング層の定義 num_filters2 = 64 W_conv2 = tf.Variable(tf.truncated_normal([5, 5, num_filters1, num_filters2], stddev=0.1)) h_conv2 = tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding="SAME") b_conv2 = tf.Variable(tf.constant(0.1, shape=[num_filters2])) h_conv2_cutoff = tf.nn.relu(h_conv2 + b_conv2) h_pool2 = tf.nn.max_pool(h_conv2_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") # 全結合層、ドロップアウト層、ソフトマックス関数の定義 h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*num_filters2]) num_units1 = 7*7*num_filters2 # 全結合層に入力するデータ数 num_units2 = 1024 # 全結合層のノード数 w2 = tf.Variable(tf.truncated_normal([num_units1, num_units2])) b2 = tf.Variable(tf.constant(0.1, shape=[num_units2])) hidden2 = tf.nn.relu(tf.matmul(h_pool2_flat, w2) + b2) # ドロップアウト層の処理 keep_prob = tf.placeholder(tf.float32) hidden2_drop = tf.nn.dropout(hidden2, keep_prob) w0 = tf.Variable(tf.zeros([num_units2, 10])) b0 = tf.Variable(tf.zeros([10])) p = tf.nn.softmax(tf.matmul(hidden2_drop, w0) + b0) # 誤差関数、トレーニングアルゴリズム、正解率の定義->ネットワークの定義は完了 t = tf.placeholder(tf.float32, [None, 10]) loss = -tf.reduce_sum(t * tf.log(p)) train_step = tf.train.AdamOptimizer(0.0001).minimize(loss) correct_prediction = tf.equal(tf.argmax(p, 1), tf.argmax(t, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) sess = tf.InteractiveSession() sess.run(tf.initialize_all_variables()) saver = tf.train.Saver() saver.restore(sess, "cnn_session-20000") # 手書き文字を入力するためのJavaScriptのコード input_form = """ <table> <td style="border-style: none;"> <div style="border: solid 2px #666; width: 143px; height: 144px"> <canvas width="140" height="140"></canvas> </td> <td style="border-style: none;"> <button onclick="clear_value()">Clear</button> </td> </table> """ javascript = """ <script type="text/Javascript"> var pixels = []; for (var i = 0; i < 28*28; i++) pixels[i] = 0 var click = 0; var canvas = document.querySelector("canvas"); canvas.addEventListener("mousemove", function(e){ if (e.buttons == 1) { click = 1; canvas.getContext("2d").fillStyle = "rgb(0, 0, 0)"; canvas.getContext("2d").fillRect(e.offsetX, e.offsetY, 8, 8); x = Math.floor(e.offsetY * 0.2) y = Math.floor(e.offsetX * 0.2) + 1 for (var dy = 0; dy < 2; dy++) { for (var dx = 0; dx < 2; dx++) { if ((x + dx < 28) && (y + dy < 28)) { pixels[(y+dy)+(x+dx)*28] = 1 } } } } else { if (click == 1) set_value() click = 0; } }); function set_value(){ var result = "" for (var i = 0; i < 28*28; i++) result += pixels[i] + "," var kernel = IPython.notebook.kernel; kernel.execute("image = [" + result + "]"); } function clear_value(){ canvas.getContext("2d").fillStyle = "rgb(255, 255, 255)"; canvas.getContext("2d").fillRect(0, 0, 140, 140); for (var i = 0; i < 28*28; i++) pixels[i] = 0 } </script> """ # 用意したHTMLフォームとJavaScriptを実行 from IPython.display import HTML HTML(input_form + javascript) # 変数imageの画像データをCNNに入力して、0~9のそれぞれの数字である確率を計算する p_val = sess.run(p, feed_dict={x:[image], keep_prob:1.0}) fig = plt.figure(figsize=(4, 2)) pred = p_val[0] subplot = fig.add_subplot(1, 1, 1) subplot.set_xticks(range(10)) subplot.set_xlim(-0.5, 9.5) subplot.set_ylim(0, 1) subplot.bar(range(10), pred, align="center") # 入力した画像データが、1段目と2段目のフィルターによって、どのように変化しているのかを確認する # 1段目のフィルターを通過した画像データを表示 conv1_vals, cutoff1_vals = sess.run([h_conv1, h_conv1_cutoff], feed_dict={x:[image], keep_prob:1.0}) fig = plt.figure(figsize=(16, 4)) for f in range(num_filters1): subplot = fig.add_subplot(4, 16, f+1) subplot.set_xticks([]) subplot.set_yticks([]) subplot.imshow(conv1_vals[0, :, :, f], cmap=plt.cm.gray_r, interpolation="nearest") for f in range(num_filters1): subplot = fig.add_subplot(4, 16, num_filters1+f+1) subplot.set_xticks([]) subplot.set_yticks([]) subplot.imshow(cutoff1_vals[0, :, :, f], cmap=plt.cm.gray_r, interpolation="nearest") # 2段目のフィルターを通過した画像データを表示 conv2_vals, cutoff2_vals = sess.run([h_conv2, h_conv2_cutoff], feed_dict={x:[image], keep_prob:1.0}) fig = plt.figure(figsize=(16, 8)) for f in range(num_filters2): subplot = fig.add_subplot(8, 16, f+1) subplot.set_xticks([]) subplot.set_yticks([]) subplot.imshow(conv2_vals[0, :, :, f], cmap=plt.cm.gray_r, interpolation="nearest") for f in range(num_filters2): subplot = fig.add_subplot(8, 16, num_filters2+f+1) subplot.set_xticks([]) subplot.set_yticks([]) subplot.imshow(cutoff2_vals[0, :, :, f], cmap=plt.cm.gray_r, interpolation="nearest")

###試したこと
同じ現象を解決している人がいないかネットで探してみました。
すると、以下のサイトでこのエラーを解決しているようです。
http://louis-needless.hatenablog.com/entry/notfounderror-bully-me

しかし、CNNについて勉強し始めて間もなく、解決の糸口が掴めません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

sessionをsaveする側のコードはありますか?
もし、ソースがこれで全てなら、一度もsaveしていないので、restoreできないと思います。

投稿2017/07/16 07:06

MasashiKimura

総合スコア1150

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

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

Mocchan2718

2017/07/16 07:13

回答ありがとうございます! ありますので、以下に記します。 ``` #!/usr/bin/env python # -*- coding: utf-8 -*- import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from tensorflow.examples.tutorials.mnist import input_data np.random.seed(20160704) tf.set_random_seed(20160704) mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) # 1段目の畳み込みフィルターとプーリング層の定義 num_filters1 = 32 x = tf.placeholder(tf.float32, [None, 784]) x_image = tf.reshape(x, [-1, 28, 28, 1]) W_conv1 = tf.Variable(tf.truncated_normal([5, 5, 1, num_filters1], stddev=0.1)) h_conv1 = tf.nn.conv2d(x_image, W_conv1, strides=[1, 1, 1, 1], padding="SAME") b_conv1 = tf.Variable(tf.constant(0.1, shape=[num_filters1])) h_conv1_cutoff = tf.nn.relu(h_conv1 + b_conv1) h_pool1 = tf.nn.max_pool(h_conv1_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") # 2段目の畳み込みフィルターとプーリング層の定義 num_filters2 = 64 W_conv2 = tf.Variable(tf.truncated_normal([5, 5, num_filters1, num_filters2], stddev=0.1)) h_conv2 = tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding="SAME") b_conv2 = tf.Variable(tf.constant(0.1, shape=[num_filters2])) h_conv2_cutoff = tf.nn.relu(h_conv2 + b_conv2) h_pool2 = tf.nn.max_pool(h_conv2_cutoff, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") # 全結合層、ドロップアウト層、ソフトマックス関数の定義 h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*num_filters2]) num_units1 = 7*7*num_filters2 # 全結合層に入力するデータ数 num_units2 = 1024 # 全結合層のノード数 w2 = tf.Variable(tf.truncated_normal([num_units1, num_units2])) b2 = tf.Variable(tf.constant(0.1, shape=[num_units2])) hidden2 = tf.nn.relu(tf.matmul(h_pool2_flat, w2) + b2) # ドロップアウト層の処理 keep_prob = tf.placeholder(tf.float32) hidden2_drop = tf.nn.dropout(hidden2, keep_prob) w0 = tf.Variable(tf.zeros([num_units2, 10])) b0 = tf.Variable(tf.zeros([10])) p = tf.nn.softmax(tf.matmul(hidden2_drop, w0) + b0) # 誤差関数、トレーニングアルゴリズム、正解率の定義->ネットワークの定義は完了 t = tf.placeholder(tf.float32, [None, 10]) loss = -tf.reduce_sum(t * tf.log(p)) train_step = tf.train.AdamOptimizer(0.0001).minimize(loss) correct_prediction = tf.equal(tf.argmax(p, 1), tf.argmax(t, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # セッションの用意 sess = tf.InteractiveSession() sess.run(tf.initialize_all_variables()) saver = tf.train.Saver() # 1回あたり50個のデータを使用するミニバッチで、確率的勾配降下法によるパラメーターの最適化を繰り返す i = 0 for _ in range(20000): i += 1 batch_xs, batch_ts = mnist.train.next_batch(50) sess.run(train_step, feed_dict={x:batch_xs, t:batch_ts, keep_prob:0.5}) if i % 500 == 0: loss_vals, acc_vals = [], [] for c in range(4): start = len(mnist.test.labels) / 4 * c end = len(mnist.test.labels) / 4 * (c+1) loss_val, acc_val = sess.run([loss, accuracy], feed_dict={x:mnist.test.images[start:end], t:mnist.test.labels[start:end], keep_prob:1.0}) loss_vals.append(loss_val) acc_vals.append(acc_val) loss_val = np.sum(loss_vals) acc_val = np.mean(acc_vals) print("Step: %d, Loss: %f, Accuracy: %f" % (i, loss_val, acc_val)) saver.save(sess, "cnn_session", global_step=i) # セッションの状態を保存したファイルが生成されていることの確認 ! ls cnn_session* ```
MasashiKimura

2017/07/16 07:18

私はInteractiveSessionをあまり使わないので違うかもですが、 sess.close()が必要ではないでしょうか?
Mocchan2718

2017/07/16 07:36

restoreしている側のコードで、でしょうか?
MasashiKimura

2017/07/16 07:45 編集

いえ、saveしているコードです
Mocchan2718

2017/07/16 07:49

分かりました、試してみます。 学習に時間がかかるので遅くなるとは思いますが、後ほど報告させていただきます。 sess.close()を追記するのは、saver.save(sess, "cnn_session", global_step=i)の後ですよね?
MasashiKimura

2017/07/16 07:57 編集

そうです。 取りあえず1エポックだけ回してみてはどうですか?
Mocchan2718

2017/07/16 08:03

500回学習させた後、restoreしましたが、同じエラーが出てしまいました。 セッションにうまくデータが保存されていないのでしょうか...
MasashiKimura

2017/07/16 08:08

たぶん、名前の問題ですね。 エラーが出ているところのAdamの名前がAdam_1なのが問題なのだと思います。 (少し疲れたので休憩中です)
Mocchan2718

2017/07/16 14:13 編集

saveするときに、名前を変えることができれば成功するのでしょうか...? 追記 このエラーを考えている時にまた別のエラー(変数imagesが宣言されていない)が出たので、気分転換がてらそっちを考えていました。 別のエラーが解決した際同時に元のエラーも解消されました(-_-;) Jupyter上でやっているのですが、全てを1つのセルにまとめて実行していたことが原因のようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問