使用 Tensorflow-2.0 tf.optimizers 时如何修复 'The given object is not an Optimizer instance'?
How fix 'The given object is not an Optimizer instance' when using Tensorflow-2.0 tf.optimizers?
我正在使用带有标准 DNNClassifier 估计器的 Tensorflow 2.0。 tf.optimizers 中的优化器似乎不是分类器期望的优化器实例。
我已经使用了 tf.optimizers 和 tf.keras.optimizers 的新 keras 实现并得到了同样的错误。
即使将估算器调用用作 lambda 函数,仍然 returns 相同的消息。
lr = tf.optimizers.schedules.ExponentialDecay(
initial_learning_rate=0.1,
decay_steps=10000,
decay_rate=0.96)
optimizer = tf.optimizers.Adam(learning_rate=lr)
classifier = tf.estimator.DNNClassifier([20, 45, 15],
feature_columns,
n_classes=df.target.nunique(),
optimizer=optimizer)
classifier.train(input_fn=lambda: df_to_dataset(
train, batch_size=batch_size), steps=10000)
每次我执行时都会收到相同的消息,无论我选择哪个优化器:
The given object is not an Optimizer instance. Given: <tensorflow.python.keras.optimizer_v2.adam.Adam object at 0x7f7f186dada0>
原因是您对模型和图层使用 tensorflow.python.keras api,对 SGD 使用 keras.optimizers。它们是tensorflow和pure keras的两个不同的keras版本。他们不能一起工作。您必须将所有内容更改为一个版本。
在此之后,我的代码运行良好:P
希望对您有所帮助。
好的,对于找到这个的人:
此问题阻碍了 Tensorflow 2.0 的未来发布。
我今天在 github 存储库上发现了一个类似的问题:
https://github.com/tensorflow/tensorflow/issues/20812
截至今天,除了使用量身定制的估算器外,没有其他解决方法。 (我不确定这是否有效)
编辑:感谢@Vlad,我找到了解决方法。他建议使用 compat 来构建估算器,我照做了。
以下是代码最终的样子:
optimizer = tf.compat.v1.train.AdamOptimizer(
learning_rate=tf.compat.v1.train.exponential_decay(
global_step=0,
learning_rate=0.1,
decay_steps=10000,
decay_rate=0.96, staircase=True))
使用 tf.compat.v1.train.AdamOptimizer()
代替 tf.optimizers.Adam()
。
我正在使用带有标准 DNNClassifier 估计器的 Tensorflow 2.0。 tf.optimizers 中的优化器似乎不是分类器期望的优化器实例。
我已经使用了 tf.optimizers 和 tf.keras.optimizers 的新 keras 实现并得到了同样的错误。 即使将估算器调用用作 lambda 函数,仍然 returns 相同的消息。
lr = tf.optimizers.schedules.ExponentialDecay(
initial_learning_rate=0.1,
decay_steps=10000,
decay_rate=0.96)
optimizer = tf.optimizers.Adam(learning_rate=lr)
classifier = tf.estimator.DNNClassifier([20, 45, 15],
feature_columns,
n_classes=df.target.nunique(),
optimizer=optimizer)
classifier.train(input_fn=lambda: df_to_dataset(
train, batch_size=batch_size), steps=10000)
每次我执行时都会收到相同的消息,无论我选择哪个优化器:
The given object is not an Optimizer instance. Given: <tensorflow.python.keras.optimizer_v2.adam.Adam object at 0x7f7f186dada0>
原因是您对模型和图层使用 tensorflow.python.keras api,对 SGD 使用 keras.optimizers。它们是tensorflow和pure keras的两个不同的keras版本。他们不能一起工作。您必须将所有内容更改为一个版本。
在此之后,我的代码运行良好:P
希望对您有所帮助。
好的,对于找到这个的人:
此问题阻碍了 Tensorflow 2.0 的未来发布。 我今天在 github 存储库上发现了一个类似的问题:
https://github.com/tensorflow/tensorflow/issues/20812
截至今天,除了使用量身定制的估算器外,没有其他解决方法。 (我不确定这是否有效)
编辑:感谢@Vlad,我找到了解决方法。他建议使用 compat 来构建估算器,我照做了。 以下是代码最终的样子:
optimizer = tf.compat.v1.train.AdamOptimizer(
learning_rate=tf.compat.v1.train.exponential_decay(
global_step=0,
learning_rate=0.1,
decay_steps=10000,
decay_rate=0.96, staircase=True))
使用 tf.compat.v1.train.AdamOptimizer()
代替 tf.optimizers.Adam()
。