繁体   English   中英

如何在使用Tensorflow-2.0 tf.optimizers时修复“给定对象不是优化器实例”?

[英]How fix 'The given object is not an Optimizer instance' when using Tensorflow-2.0 tf.optimizers?

我正在使用Tensorflow 2.0和标准的DNNClassifier估算器。 似乎tf.optimizers中的Optimizers不是分类器所期望的Optimizer的实例。

我已经在tf.keras.optimizers上使用了tf.optimizers和新的keras实现并得到了同样的错误。 即使使用估计器调用作为lambda函数仍然返回相同的消息。


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 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()

原因是你正在为模型和层使用tensorflow.python.keras api,为SGD使用keras.optimizers。 它们是张量流和纯keras的两种不同的keras版本。 他们无法一起工作。 您必须将所有内容更改为一个版本。

在此之后,我的代码工作得很好:P

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM