gpt4 book ai didi

python - 张量必须与带有 AdagradDA 优化器的 LinearClassifier 中的张量来自同一个图

转载 作者:行者123 更新时间:2023-11-30 09:06:31 25 4
gpt4 key购买 nike

我一直在尝试将 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_1:0", shape=(), dtype=int32) 必须来自与 Tensor("linear/linear_model/random_var/weights/part_0:0", shape= 相同的图表) (1, 1), dtype=float32_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("线性/线性/线性模型/随机_var/权重/part_0/AdagradDA_1:0) 相同的图", shape=(1, 1), dtype=float32_ref)。

当我使用 FtrlOptimizerAdagradOptimize 运行相同的代码时,代码运行正常。所以我猜测,这个问题必须与 global_step_tensor 实例有关。

<小时/>

以下是我迄今为止尝试过的事情:

  • 将代码片段移至 with tf.Session() as 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 操作,这是 AdagradDAOptimizer 将自行返回的内容(没有 lambda)。

2)您可以直接使用tf.train.get_global_step(),而不必定义全局步长张量。

我不太清楚为什么在这种情况下需要通过添加 lambda 来创建可调用对象。但我想每当你想使用需要 global_step 的优化器(或者你想通过它,例如学习率衰减)时,你需要将优化器设置为可调用的(因此需要 lambda )而不是 Tensorflow 操作

这也是文档 here 中学习率衰减示例的作用。 .

这是我在 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)

关于python - 张量必须与带有 AdagradDA 优化器的 LinearClassifier 中的张量来自同一个图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51040078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com