TensorFlow Eval()没有会话或移动变量到其他会话



我正在使用TensorFlow模型,如Iris预测示例中所述。因此,我没有会话对象。现在,我想将标签转换为带有.eval()的Numpy-Array。没有会话会出现错误。

Traceback (most recent call last):
 File "myfile.py", line 273, in <module>
   tf.app.run()
 File "/usr/local/lib/python3.4/site-packages/tensorflow/python/platform/app.py", line 30, in run
   sys.exit(main(sys.argv))
 File "myfile.py", line 270, in main
   train_and_eval()
 File "myfile.py", line 258, in train_and_eval
   label.eval()
 File "/usr/local/lib/python3.4/site-packages/tensorflow/python/framework/ops.py", line 559, in eval
   return _eval_using_default_session(self, feed_dict, self.graph, session)
 File "/usr/local/lib/python3.4/site-packages/tensorflow/python/framework/ops.py", line 3642, in _eval_using_default_session
   raise ValueError("Cannot evaluate tensor using `eval()`: No default "
ValueError: Cannot evaluate tensor using `eval()`: No default session is registered. Use `with sess.as_default()` or pass an explicit session to `eval(session=sess)`

是否有可能访问/获取在背景中使用的模型的会话?还是将张量转换为numpy-array的可能性?

如果我创建了一个新的会话,那么TensorFlow移动到本会话,但无法访问该变量。显示Python print(),但随后运行不合格。我如何解析此新会话的变量?

网的另一部分效果很好 - 只有这个特殊的东西将张量转换为numpy -array

    COLUMNS = ["col1", "col2", "col3", "target"]
    LABEL_COLUMN = "target"
    CATEGORICAL_COLUMNS = ["col1", "col2", "col3"]
    def build_estimator(model_dir):
        col1 = tf.contrib.layers.sparse_column_with_hash_bucket(
            "col1", hash_bucket_size=10000)
        col2........
        wide_columns = [col1, col2, col3]
        deep_columns = [
            tf.contrib.layers.embedding_column(col1, dimension=7),
            tf.contrib.layers.embedding_column(col2, dimension=7),
            tf.contrib.layers.embedding_column(col3, dimension=7)
        ]
        m = tf.contrib.learn.DNNLinearCombinedClassifier(...)
        return m
    def input_fn(file_names, batch_size):
        ...
        label = tf.string_to_number(examples_dict[LABEL_COLUMN], out_type=tf.int32)
        return feature_cols, label
    def train_and_eval():
        model_dir = "./model/"
        print(model_dir)
        m = build_estimator(model_dir)
        m.fit(input_fn=lambda: input_fn(train_file_name, batch_size), steps=steps)
        results = m.evaluate(input_fn=lambda: input_fn(test_file_name, batch_size),
            steps=1)
        pred_m = m.predict(input_fn=lambda: input_fn(test_file_name, batch_size))

        sess = tf.InteractiveSession()
        with sess.as_default():
            print("Is a session there?")
            _, label = input_fn(test_file_name, batch_size)
            label.eval()
            print(label)
    def main(_):
        train_and_eval()
    if __name__ == "__main__":
        tf.app.run()

新的会话从代码 - 尼普特的末尾开始:

        sess = tf.InteractiveSession()
        with sess.as_default():
            print("Is a session there?")
            _, label = input_fn(test_file_name, batch_size)
            label.eval()
            print(label)

您需要一个会话,并且需要在能够访问它们之前初始化变量:

with Session() as sess:
    sess.run(tf.global_variables_initializer())
    ...  
    label_numpy = label.eval()

我更改了订单以解决我的问题。

     import tensorflow as tf
     v= tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
     result = tf.clip_by_value(v, 2.5, 4.5).eval()
     with tf.Session() as sess:
          print(sess.run(result))

然后我的IDE警告" ValueReror:无法使用eval()评估张量:没有注册默认会话。使用with sess.as_default()或将显式会话传递给eval(session=sess)"

之后,我将其更改为:

    import tensorflow as tf
    v= tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
    with tf.Session() as sess:
        result = tf.clip_by_value(v, 2.5, 4.5).eval()
        print(sess.run(result))

然后解决了问题。

由于您使用估算器,因此可以这样评估:

 evaluate_result = estimator.evaluate(input_fn=lambda: my_input_fn(INPUT_FILE_PATH, BATCH_SIZE))

它将返回一个包含键入键入名称键入的评估指标的dict,以及一个包含执行此评估的全局步骤值的输入global_step。

否则,您可以使用一个会话,必须在其中初始化全局变量:

with Session() as sess:
    sess.run(tf.global_variables_initializer())

您将能够评估正常方式,并且会话可以访问您的模型。

我在尝试创建一些自定义指标/损失功能时也遇到了同样的问题。我最终要做的是使用tf.py_func或更好的tf.py_function来调用Python功能。(TensorFlow Doc)。

您传递到该功能的张量有望将其转换为Numpy数据/数组。py_funcpy_function之间的唯一区别是,使用py_func,张量会自动变成一个numpy数组,而使用py_function,它仍然是张量,您必须在其上手动调用.numpy()

TensorFlow将为您添加此调用。

def train_and_eval():
    ...
    with Session() as sess:
        sess.run(tf.global_variables_initializer())
        ...
        labels = #some tensor
        other = #some tensor
        result = tf.py_function(some_function, [labels, other], [tf.float64]) # where the last argument
        # is an array representing the return type(s) of `some_function()`.
        # If `some_function` returns nothing, then you can do
        # tf.py_function(some_function, [labels, other], [])
# your normal python function
def some_function(labels, other):
    '''
    If you called this through py_func, the inputs are already numpy arrays,
    if you called through py_function, they're Tensors and you have to call
    labels.numpy() and other.numpy() to turn them to numpy.
    '''
    labels, other = labels.numpy(), other.numpy()
    print(labels)

最新更新