मैं टेंसरफ़्लो में नया हूँ और मुझे यह त्रुटि संदेश तब मिला जब मैंने एक ग्राफ़ बनाने की कोशिश की और फिर कुछ ऑपरेशन निष्पादित किए:

ValueError                                Traceback (most recent call last)
<ipython-input-136-9e5ed7cede4c> in <module>()
----> 1 get_ipython().run_cell_magic('time', '', '\nn_epochs = 20\nbatch_size = 5\n\ninit = tf.global_variables_initializer()\n\nwith tf.Session(graph=graph) as sess:\n    print(0)\n    init.run()\n    print(1)\n    # init = tf.global_variables_initializer()\n    # saver = tf.train.Saver()\n    print(2)\n    for epoch in range(n_epochs):\n        for X_batch, y_batch in shuffle_batch(X_train, y_train, batch_size):\n            sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n        mse_batch = loss.eval(feed_dict={X: X_batch, y: y_batch})\n        mse_valid = loss.eval(feed_dict={X: X_valid, y: y_valid})\n        print(epoch, "Batch mse:", mse_batch, "Validation mse:", mse_valid)\n\n    # save_path = saver.save(sess, "./my_model_final.ckpt")')

4 frames
</usr/local/lib/python3.6/dist-packages/decorator.py:decorator-gen-60> in time(self, line, cell, local_ns)

<timed exec> in <module>()

/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in _run_using_default_session(operation, feed_dict, graph, session)
   5603                        "`run(session=sess)`")
   5604     if session.graph is not graph:
-> 5605       raise ValueError("Cannot use the default session to execute operation: "
   5606                        "the operation's graph is different from the "
   5607                        "session's graph. Pass an explicit session to "

ValueError: Cannot use the default session to execute operation: the operation's graph is different from the session's graph. Pass an explicit session to run(session=sess)

मैं हाइपरपैरामीटर ट्यूनिंग (प्रति परत न्यूरॉन्स की संख्या, छिपी हुई परतों की संख्या, आदि) के लिए कई ग्राफ़ बनाने के लिए एक विधि बनाने की कोशिश कर रहा हूं। कोड मुख्य रूप से https://github.com/ageron/handson-ml से लिया गया है। उदाहरण। मुझे नहीं लगता कि मैं ग्राफ़ का निर्माण और उपयोग सही तरीके से कर रहा हूँ।

import tensorflow as tf
import numpy as np
import pandas as pd


def reset_graph(seed=42):
    tf.reset_default_graph()
    tf.set_random_seed(seed)
    np.random.seed(seed)


def create_graph(n_inputs, n_outputs, n_hidden_layers=2, n_neurons_per_layer=100, activation_function=tf.nn.relu, learning_rate=0.01, 
                 optimize_method='nesterov'):

  g = tf.Graph()


  with g.as_default():
    X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X")
    y = tf.placeholder(tf.int32, shape=(None), name="y")

    # create layers
    with tf.name_scope("dnn"):
      hidden_layers = {}
      for i in range(n_hidden_layers):
        if i == 0:
          hidden_layers['hidden_1'] = tf.layers.dense(X, n_neurons_per_layer, activation=activation_function, name="hidden_1")
        else:
          name_last_layer = 'hidden_' + str(i)
          name_this_layer = 'hidden_' + str(i+1)
          hidden_layers[name_this_layer] = tf.layers.dense(hidden_layers[name_last_layer], n_neurons_per_layer, 
                                                           activation=activation_function, name="hidden_{}".format(i+1))
      name_last_hidden = 'hidden_' + str(n_hidden_layers)
      logits = tf.layers.dense(hidden_layers[name_last_hidden], n_outputs, name="logits")

    with tf.name_scope("loss"):
        xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
        loss = tf.reduce_mean(xentropy, name="loss")
        y_proba = tf.nn.softmax(logits)

    with tf.name_scope("eval"):
        correct = tf.nn.in_top_k(logits, y, 1)
        accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

    with tf.name_scope("train"):
      if optimize_method == 'nesterov': # nesterov optimizer
        optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate, momentum=0.9, use_nesterov=True)
      elif optimize_method == 'adam': # adam optimizer
        optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
      else: # momentum optimizer
        optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate, momentum=0.9)
      training_op = optimizer.minimize(loss)

  return g, loss, training_op, X, y


def shuffle_batch(X, y, batch_size):
    rnd_idx = np.random.permutation(len(X))
    n_batches = len(X) // batch_size
    for batch_idx in np.array_split(rnd_idx, n_batches):
        X_batch, y_batch = X[batch_idx], y[batch_idx]
        yield X_batch, y_batch

graph, loss, training_op, X, y = create_graph(100, 10)

n_epochs = 20
batch_size = 5

init = tf.global_variables_initializer()
# saver = tf.train.Saver()

with tf.Session(graph=graph) as sess:
    init.run()
    print(2)
    for epoch in range(n_epochs):
        for X_batch, y_batch in shuffle_batch(X_train, y_train, batch_size):
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
        mse_batch = loss.eval(feed_dict={X: X_batch, y: y_batch})
        mse_valid = loss.eval(feed_dict={X: X_valid, y: y_valid})
        print(epoch, "Batch mse:", mse_batch, "Validation mse:", mse_valid)

    # save_path = saver.save(sess, "./my_model_final.ckpt")
0
Li Ai 16 सितंबर 2019, 08:28

1 उत्तर

सबसे बढ़िया उत्तर

तो यहां समस्या यह है कि आप अपने अधिकांश कार्यों के लिए डिफ़ॉल्ट ग्राफ के अलावा एक ग्राफ ऑब्जेक्ट निर्दिष्ट कर रहे हैं (फ़ंक्शन में g के रूप में परिभाषित किया गया है, और फ़ंक्शन के बाहर graph के रूप में परिभाषित किया गया है), लेकिन ऑपरेशन tf.global_variables_initializer() डिफ़ॉल्ट ग्राफ़ में जोड़ा जाता है graph नहीं।

ग्राफ़ ऑब्जेक्ट में संचालन तब जोड़े जाते हैं जब उन्हें घोषित किया जाता है, न कि सत्र द्वारा बुलाए जाने पर, इसलिए यद्यपि आपने निर्दिष्ट किया है

with tf.Session(graph=graph) as sess:

init ऑपरेशन को निर्दिष्ट ग्राफ से भिन्न ग्राफ पर परिभाषित किया गया है, और इसलिए इस सत्र में नहीं कहा जा सकता है।

init संचालन घोषणा को बदलने के लिए

with graph.as_default():
    init = tf.global_variables_initializer()

सुलझाएंगे।

वैकल्पिक रूप से आप init की घोषणा को एक साथ हटा सकते हैं और सत्र के भीतर सीधे tf.global_variables_initializer() को कॉल कर सकते हैं:

with tf.Session(graph=graph) as sess:
    sess.run(tf.global_variables_initializer())
    print(2)
    for epoch in range(n_epochs):
    ...

जो स्वचालित रूप से sess से जुड़े ग्राफ़ पर वैरिएबल को इनिशियलाइज़ कर देगा।

1
FinleyGibson 16 सितंबर 2019, 13:56