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

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

ただいまの
回答率

91.04%

  • Python

    5186questions

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

  • TensorFlow

    451questions

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,216

Mocchan2718

score 3

参考書を基に手書き文字の自動認識アプリケーションを実行したい

「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について勉強し始めて間もなく、解決の糸口が掴めません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/16 16: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*
    ```

    キャンセル

  • 2017/07/16 16:18

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

    キャンセル

  • 2017/07/16 16:36

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

    キャンセル

  • 2017/07/16 16:45 編集

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

    キャンセル

  • 2017/07/16 16:49

    分かりました、試してみます。
    学習に時間がかかるので遅くなるとは思いますが、後ほど報告させていただきます。

    sess.close()を追記するのは、saver.save(sess, "cnn_session", global_step=i)の後ですよね?

    キャンセル

  • 2017/07/16 16:57 編集

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

    キャンセル

  • 2017/07/16 17:03

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

    キャンセル

  • 2017/07/16 17:08

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

    キャンセル

  • 2017/07/16 23:13 編集

    saveするときに、名前を変えることができれば成功するのでしょうか...?

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

    キャンセル

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

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    5186questions

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

  • TensorFlow

    451questions