TensorFlow 2.2.0运行初始化报tables_initializer等属性错误的解决方法
错误成因
- TensorFlow 2.x 从版本设计上就移除了根命名空间下挂载的1.x时代静态图专属API,2.2.0默认开启Eager执行模式,原本1.x版本中直接通过
tf.xxx调用的tables_initializer、global_variables_initializer、local_variables_initializer、group等接口,全部被迁移到tf.compat.v1兼容模块下,直接在根tf路径调用就会触发模块无对应属性的报错。 - 代码中使用的
K.get_session()属于Keras 1.x时代的全局会话获取接口,TensorFlow2.2.0的默认运行逻辑已经废弃了“手动获取全局会话、手动执行初始化op”的执行流程,和根路径调用旧初始化接口属于同一类的版本适配问题。 - 原代码仅导入了
tensorflow.python.keras.backend as K,没有显式导入tensorflow模块本身,本身也存在依赖导入不全的潜在问题。
可落地解决方法
方案1:快速兼容原有旧代码
在所有TensorFlow相关代码的最开头,添加1.x兼容开关,无需改动原有初始化逻辑即可跑通:
import numpy as np import tensorflow.compat.v1 as tf # 关闭2.x默认行为,完整开启1.x兼容模式 tf.disable_v2_behavior() import tensorflow.python.keras.backend as K session = K.get_session() init_op = tf.group(tf.tables_initializer(), tf.global_variables_initializer(), tf.local_variables_initializer()) session.run(init_op) np.random.seed(1) tf.set_random_seed(1)
- 注意兼容模式必须在其他TensorFlow相关导入之前开启,否则兼容配置不会生效。
方案2:适配TensorFlow2.2.0原生写法(长期推荐)
完全替换为2.x支持的公开API,避免后续跨版本升级再出现兼容性问题:
- 移除手动初始化全局会话、手动跑初始化op的冗余逻辑,2.x下变量、哈希表会在创建时自动完成初始化,不需要手动触发全局初始化流程。
- 随机种子设置替换为2.x原生接口:
tf.random.set_seed(1),替代旧版的tf.set_random_seed。 - 如果必须用到静态图会话做兼容,所有旧版初始化接口从公开兼容路径调用,替换原代码中的对应接口:
- 表初始化:
tf.compat.v1.tables_initializer() - 全局变量初始化:
tf.compat.v1.global_variables_initializer() - 局部变量初始化:
tf.compat.v1.local_variables_initializer()
- 表初始化:
- 不要通过tensorflow.python.xxx的内部模块路径导入接口,这类路径没有官方兼容承诺,跨版本迭代时很容易出现路径变更、属性移除的报错,替换为
tensorflow.compat.v1.keras.backend的公开兼容路径获取会话即可。
内容的提问来源于stack exchange,提问作者Carla Flores
相关产品推荐
相关产品推荐

