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中移出,谢谢。我会更新答案