Python 为什么tensorflow在多次训练估计器时说张量不是这个图的一个元素?

Python 为什么tensorflow在多次训练估计器时说张量不是这个图的一个元素?,python,machine-learning,tensorflow,keras,Python,Machine Learning,Tensorflow,Keras,考虑以下代码: import tensorflow as tf from tensorflow.python.estimator.model_fn import EstimatorSpec from tensorflow.contrib.keras.api.keras.layers import Dense def model_fn_1(features, labels, mode): x = [[1]] labels = [[10]] m = tf.constan

考虑以下代码:

import tensorflow as tf

from tensorflow.python.estimator.model_fn import EstimatorSpec
from tensorflow.contrib.keras.api.keras.layers import Dense


def model_fn_1(features, labels, mode):
    x = [[1]]
    labels = [[10]]
    m = tf.constant([[1, 2], [3, 4]], tf.float32)
    lookup = tf.nn.embedding_lookup(m, x, name='embedding_lookup')

    preds = Dense(1)(lookup)
    loss = tf.reduce_mean(labels - preds)
    train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss, tf.train.get_global_step())

    eval_metric_ops = {'accuracy': tf.metrics.accuracy(labels, preds)}
    return EstimatorSpec(mode=mode, loss=loss, train_op=train_op, eval_metric_ops=eval_metric_ops)


model_1 = tf.estimator.Estimator(model_fn_1)
model_1.train(input_fn=lambda: None, steps=1)
import tensorflow as tf
import numpy as np

from tensorflow.python.estimator.model_fn import EstimatorSpec
from tensorflow.contrib.keras.api.keras.layers import Embedding, Dense

def model_fn_2(features, labels, mode):
    x = tf.constant([[1]])
    labels = [[10]]
    m = np.array([[1, 2], [3, 4]])
    m = Embedding(2, 2, weights=[m], input_length=1, name='embedding_lookup')
    lookup = m(x)

    preds = Dense(1)(lookup)
    loss = tf.reduce_mean(labels - preds)
    train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss, tf.train.get_global_step())

    eval_metric_ops = {'accuracy': tf.metrics.accuracy(labels, preds)}
    return EstimatorSpec(mode=mode, loss=loss, train_op=train_op, eval_metric_ops=eval_metric_ops)


model_2 = tf.estimator.Estimator(model_fn_2)
model_2.train(input_fn=lambda: None, steps=1)
正如预期的那样,我可以多次执行
model_1.train(input_fn=lambda:None,steps=1)
,培训将从上一次执行继续

现在,考虑下面的代码:

import tensorflow as tf

from tensorflow.python.estimator.model_fn import EstimatorSpec
from tensorflow.contrib.keras.api.keras.layers import Dense


def model_fn_1(features, labels, mode):
    x = [[1]]
    labels = [[10]]
    m = tf.constant([[1, 2], [3, 4]], tf.float32)
    lookup = tf.nn.embedding_lookup(m, x, name='embedding_lookup')

    preds = Dense(1)(lookup)
    loss = tf.reduce_mean(labels - preds)
    train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss, tf.train.get_global_step())

    eval_metric_ops = {'accuracy': tf.metrics.accuracy(labels, preds)}
    return EstimatorSpec(mode=mode, loss=loss, train_op=train_op, eval_metric_ops=eval_metric_ops)


model_1 = tf.estimator.Estimator(model_fn_1)
model_1.train(input_fn=lambda: None, steps=1)
import tensorflow as tf
import numpy as np

from tensorflow.python.estimator.model_fn import EstimatorSpec
from tensorflow.contrib.keras.api.keras.layers import Embedding, Dense

def model_fn_2(features, labels, mode):
    x = tf.constant([[1]])
    labels = [[10]]
    m = np.array([[1, 2], [3, 4]])
    m = Embedding(2, 2, weights=[m], input_length=1, name='embedding_lookup')
    lookup = m(x)

    preds = Dense(1)(lookup)
    loss = tf.reduce_mean(labels - preds)
    train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss, tf.train.get_global_step())

    eval_metric_ops = {'accuracy': tf.metrics.accuracy(labels, preds)}
    return EstimatorSpec(mode=mode, loss=loss, train_op=train_op, eval_metric_ops=eval_metric_ops)


model_2 = tf.estimator.Estimator(model_fn_2)
model_2.train(input_fn=lambda: None, steps=1)
在这种情况下,我只能执行
model_2.train(input_fn=lambda:None,steps=1)
一次,当我再次尝试执行它时,我得到以下错误:

ValueError:无法获取参数 被解释为张量。(张量 张量(“嵌入查找/嵌入:0”,形状=(2,2), dtype=float32_ref)不是此图的元素。)


为什么会发生这种情况?我如何修复它?

这可能是tensorflow keras后端中的错误或不受支持的情况:会话被全局缓存且未清除。您可以通过调用以下命令手动清除:

来自tensorflow.contrib.keras.python.keras.backend导入清除会话
清除会话()
。。。在
序列
调用之间

简短原因:第二个
train
调用使用新节点构建一个新的图形,但是引擎盖下会话保留了前一个图形,这使得它们不兼容

更新。在最新的tensorflow中,keras被转移到另一个包中,现在看起来更简单:

从keras.backend导入清除会话
清除会话()

如果引擎盖下会话始终保留上一个图表,为什么不需要清除第一个代码段中代码的会话?在我的情况下,导入失败(不确定是由于TF更新还是什么原因)。直接使用keras.backend import clear_session中的
。@Overdrivr谢谢,它已从
contrib中移出,谢谢。我会更新答案