首页 > 解决方案 > 给出 AttributeError 的示例代码:“AdamOptimizer”对象没有属性“_beta1_power”

问题描述

我正在尝试在演示部分运行示例./quick_scripts/celebA_superres.sh "./images/182659.jpg" 。我是 python 新手并收到以下错误:

AttributeError:“AdamOptimizer”对象没有属性“_beta1_power”

据我所知,一个名为“AdamOptimizer”的对象的实例不知道如何处理这种类型的变量。代码如下:

def get_opt_reinit_op(opt, var_list, global_step):
    opt_slots = [opt.get_slot(var, name) for name in opt.get_slot_names() for var in var_list]
    if isinstance(opt, tf.train.AdamOptimizer):
        opt_slots.extend([opt._beta1_power, opt._beta2_power])  #pylint: disable = W0212
    all_opt_variables = opt_slots + var_list + [global_step]
    opt_reinit_op = tf.variables_initializer(all_opt_variables)
    return opt_reinit_op

该行opt_slots.extend([opt._beta1_power, opt._beta2_power]) #pylint: disable = W0212产生错误的位置。

我没有看到“AdamOptimizer”。我猜它藏在里面opt?我该如何调试这样的事情?这种调试有好的做法吗?

我应该提到我使用 2to3 将代码转换为 python3。这有什么重要的吗?

附加完整的回溯:

回溯(最后一次调用):文件“./src/compressed_sensing.py”,第 177 行,在 main(HPARAMS) 文件“./src/compressed_sensing.py”,第 21 行,在 main estimators = utils.get_estimators(hparams ) 文件“/home/erezsh/Projects/CSGM/csgm3/src/utils.py”,第 98 行,在 get_estimators estimators = {model_type: get_estimator(hparams, model_type) for model_type in hparams.model_types} 文件“/home/erezsh /Projects/CSGM/csgm3/src/utils.py”,第 98 行,在 estimators = {model_type: get_estimator(hparams, model_type) for model_type in hparams.model_types} 文件“/home/erezsh/Projects/CSGM/csgm3/src /utils.py”,第 91 行,在 get_estimator estimator = celebA_estimators.dcgan_estimator(hparams) 文件“/home/erezsh/Projects/CSGM/csgm3/src/celebA_estimators.py”,第 185 行,在 >dcgan_estimator opt_reinit_op = utils.get_opt_reinit_op(opt, var_list, global_step) 文件“/home/erezsh/Projects/CSGM/csgm3/src/utils.py”,第 545 行,在 >get_opt_reinit_op opt_slots.extend([opt._beta1_power, opt._beta2_power]) #pylint: disable = >W0212 AttributeError: 'AdamOptimizer' 对象没有属性 '_beta1_power'

标签: pythondebuggingtensorflow

解决方案


AdamOptimizer 肯定隐藏在 opt 中:引发错误的行仅在isinstance确定 opt 是tf.train.AdamOptimizer

if isinstance(opt, tf.train.AdamOptimizer):
    opt_slots.extend([opt._beta1_power, opt._beta2_power])

我不认为 2to3 应该归咎于此,我宁愿希望您安装的 TensorFlow 版本太新。csgm列表 TensorFlow 1.0.1的要求。在这个版本中_beta1_power_beta2_power仍然是 AdamOptimizer 的属性。这已在1.6 版中进行了更改,现在beta1_powerbeta2_power在需要它们的功能中本地分配。您可能可以通过调用_get_beta_accumulators()oprimizer 来获取这些值,但我猜它会在下一个最佳时机中断,新版本的行为会有所不同。


推荐阅读