Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 张量必须来自与使用AdagradDA优化器的LinearClassifier中的张量相同的图形_Python_Tensorflow_Machine Learning - Fatal编程技术网

Python 张量必须来自与使用AdagradDA优化器的LinearClassifier中的张量相同的图形

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 =

我一直在尝试将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 =  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)相同的图形。
当我使用FtrlOptimizeradagradaoptimize运行相同的代码时,代码运行正常。所以我猜,这个问题必须与
全局步骤张量
实例化有关


以下是我到目前为止尝试过的东西:

  • 使用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中添加了一些东西,允许这样做。你是对的,现代文档给出了类似的解决方案。删除否决票,因为您在答案中添加了版本警告。