Python 张量必须来自与使用AdagradDA优化器的LinearClassifier中的张量相同的图形
我一直在尝试将tf.optimizer.AdagradDA与线性分类器结合使用。这是我的密码:Python 张量必须来自与使用AdagradDA优化器的LinearClassifier中的张量相同的图形,python,tensorflow,machine-learning,Python,Tensorflow,Machine Learning,我一直在尝试将tf.optimizer.AdagradDA与线性分类器结合使用。这是我的密码: def input_fn(): features_in = { "random_var": tf.convert_to_tensor(np.random.randn(100)) } labels_in = tf.convert_to_tensor(np.random.choice([0, 1], size=(100,), p=[1./2, 1./2])) dataset =
def input_fn():
features_in = { "random_var": tf.convert_to_tensor(np.random.randn(100)) }
labels_in = tf.convert_to_tensor(np.random.choice([0, 1], size=(100,), p=[1./2, 1./2]))
dataset = tf.data.Dataset.from_tensors((features_in, labels_in))
dataset.repeat(2)
dataset.batch(1)
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
return features, labels
def main():
global_step_tensor = tf.Variable(0, trainable=False, name='global_step')
optimizer = tf.train.AdagradDAOptimizer(learning_rate=0.001, global_step=global_step_tensor)
columns = [tf.feature_column.numeric_column('random_var')]
model = tf.estimator.LinearClassifier(optimizer=optimizer, feature_columns=columns)
model.train(input_fn=input_fn)
当我运行代码时,会出现以下错误之一:
ValueError:Tensor(“Identity\u 1:0”,shape=(),dtype=int32)必须来自与Tensor(“线性/线性模型/随机变量/权重/部分0:0”,shape=(1,1),dtype=float32\u ref)”相同的图形。
ValueError:Tensor(“Identity_1:0”,shape=(),dtype=int32)必须来自与Tensor(“linear/head/AdagradDA/update_linear/linear_model/random_var/weights/part_0/Cast_2/x:0”,shape=(),dtype=float32)相同的图形。
ValueError:Tensor(“Identity_1:0”,shape=(),dtype=int32)必须来自与Tensor(“linear/linear/linear_model/random_var/weights/part_0/AdagradDA_1:0”,shape=(1,1),dtype=float32_ref)相同的图形。
全局步骤张量实例化有关
以下是我到目前为止尝试过的东西:
- 使用tf.Session()作为sess:
在LinearClassifier
构造函数中创建优化器
警告:这在TensorFlow 1.10.0(以及更高版本)中有效。显然,它在TensorFlow 1.9.0(可能更早)中不起作用。见下面ZakJ的评论
您需要更改构建优化器对象的方式,如下所示:
optimizer = lambda: tf.train.AdagradDAOptimizer(learning_rate=0.001,global_step=tf.train.get_global_step())
1) 注意lambda。这将创建一个可调用的操作,而不是Tensorflow操作
,这是AdagraddaoOptimizer
将自行返回的操作(没有lambda)
2) 您可以直接使用tf.train.get_global_step()
,而不必定义全局步长张量
我不太清楚为什么在这种情况下需要通过添加lambda来创建一个callable。但是我想,每当你想使用一个需要global\u step
的优化器时(或者你想传递它,例如学习速率衰减),你就需要将优化器设置为可调用的(因此需要lambda),而不是Tensorflow操作
这也是文档中学习率衰减示例所做的
这是我在TensorFlow 1.10.0上成功运行的完整代码:
import tensorflow as tf
import numpy as np
def input_fn():
features_in = { "random_var": tf.convert_to_tensor(np.random.randn(100)) }
labels_in = tf.convert_to_tensor(np.random.choice([0, 1], size=(100,), p=[1./2, 1./2]))
dataset = tf.data.Dataset.from_tensors((features_in, labels_in))
dataset.repeat(2)
dataset.batch(1)
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
return features, labels
def main():
optimizer = lambda: tf.train.AdagradDAOptimizer(learning_rate=0.001,global_step=tf.train.get_global_step())
columns = [tf.feature_column.numeric_column('random_var')]
model = tf.estimator.LinearClassifier(optimizer=optimizer, feature_columns=columns)
model.train(input_fn=input_fn)
至少在版本1.9.0中,这不起作用。您会收到如下错误:给定对象不是优化器实例。给定:
。我用在Tensorflow 1.10.0上运行的完整代码更新了答案。你能在1.9.0上尝试这个精确的代码并告诉我你是否仍然得到那个错误吗?我使用了这个精确的代码,加上从main返回的model
,然后添加:est=main();测试配合(输入法)
。调用fit
时产生的错误与我上面给出的错误相同。您是指est.train(input\u fn)
?LinearClassifier
对象没有fit()方法。但是,当我按照您使用est.train(input\u fn)
所描述的操作时,代码运行良好。同样,这是1.10.0。无论如何,谢谢你尝试。是的,我的意思是“.train”--对不起,我无法编辑评论来更正它。听起来像是在1.10.0中添加了一些东西,允许这样做。你是对的,现代文档给出了类似的解决方案。删除否决票,因为您在答案中添加了版本警告。