TensorFlow 2.x 中 tf.Session、tf.placeholder、tf.get_variable 等 TF 1.x API 已移除,直接调用会报 AttributeError 或 NameError;典型错误是使用 tf.Graph().as_default() 和 with tf.Session();需用 tf.compat.v1 并提前调用 disable_v2_behavior() 和 disable_eager_execution()。

确认哪些代码会直接报错
TensorFlow 2.x 默认启用 Eager Execution,tf.Session、tf.placeholder、tf.get_variable(非 tf.compat.v1 下)这些 TF 1.x 的核心 API 在 2.x 中已移除或禁用。一旦运行,你会立刻看到类似 AttributeError: module 'tensorflow' has no attribute 'Session' 或 NameError: name 'tf' is not defined(因 import tensorflow.compat.v1 as tf 没加)。最典型的“硬伤”是模型构建部分用了 tf.Graph().as_default() + with tf.Session() as sess: 这套流程——它在 TF 2.x 中完全不可用。
用 tf.compat.v1 临时兜底但必须设开关
迁移初期最省力的方式是导入兼容层并禁用 v2 行为:
import tensorflow.compat.v1 as tf tf.disable_v2_behavior() tf.disable_eager_execution()注意:这两行必须写在所有其他 TensorFlow 导入之前,且不能只写
disable_v2_behavior() —— 否则 tf.keras 可能仍走 v2 路径,和你手写的 tf.layers 混用时引发变量作用域冲突。另外,tf.disable_eager_execution() 必须在程序启动时调用,中途调用无效;如果你的代码里有 tf.function 或依赖 eager 的调试逻辑,这里会直接卡住。
逐模块替换 tf.layers 和 tf.keras 混用问题
TF 1.15 中常混用 tf.layers.dense 和 tf.keras.layers.Dense,但在 TF 2.x 兼容模式下,前者已被标记为 deprecated,后者才是正统。问题在于:二者创建的变量命名规则不同,tf.layers 默认不带 name= 时生成的变量名可能含下划线+数字(如 dense_1/kernel:0),而 tf.keras.layers 默认用类名+序号(如 dense/kernel:0),导致从 checkpoint 恢复权重时 tf.train.Saver 找不到对应变量。解决方法:
- 统一改用
tf.keras.layers,并在构造时显式传name='dense_1'保持命名一致 - 若必须加载旧 checkpoint,用
tf.train.list_variables(checkpoint_path)查看原始变量名,再用var_list={old_name: new_var}方式映射恢复 - 避免在同一个模型中交叉使用
tf.layers和tf.keras.layers
检查 tf.data 和自定义训练循环的隐性依赖
TF 1.15 的 tf.data.Dataset.make_one_shot_iterator() 在 TF 2.x 中已删,应改为 iter(dataset) + next(iterator);但更关键的是:如果你的训练循环里写了 sess.run([loss, train_op], feed_dict={...}),那即使开了 disable_eager_execution(),也不能直接跑通——因为 feed_dict 在 v1 兼容模式下虽可用,但输入数据必须是 NumPy 数组或 Tensor,不能是 Python list 或 dict(会触发 TypeError: Cannot convert a list to a tensor)。建议尽早切到 tf.keras.Model.fit() 或原生 @tf.function 训练循环,否则后续升级到纯 TF 2.x 时还要重写一遍。
inference.sh 的 Python SDK:运行 AI 应用、构建智能体,并集成 150 多个模型。包名:inferencesh (pip install inferencesh)。支持同步/异步……
真正麻烦的不是语法替换,而是那些没报错但结果不对的地方:比如 tf.nn.dropout 在 v1 模式下默认 is_training=True,而 tf.keras.layers.Dropout 默认只在训练时生效,但它的行为受 training= 参数控制,容易漏传;又比如 tf.image.resize_bilinear 和 tf.image.resize 的默认插值方式、对齐策略都不同,图像预处理结果会有像素级偏差。
立即学习“Python免费学习笔记(深入)”;

















