核心要点

  • TF 1.x 把「定义图」和「执行图」分成两步,Session 是执行图、分配 GPU/CPU 资源的运行时

  • sess.run(fetches, feed_dict) 才真正触发计算,feed_dict 把数据绑到 placeholder

  • 运行 Variable 前必须先 sess.run(global_variables_initializer()) 初始化,否则报未初始化错误

  • TF 2.x 默认 Eager,运算即写即算、可直接 print,已不再需要 Session(旧代码用 tf.compat.v1.Session)

标准回答

TensorFlow 1.x 中,Session执行计算图的运行时:

python
# TF 1.x 风格
x = tf.placeholder(tf.float32, [None, 784])
y_pred = model(x)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(y_pred, feed_dict={x: batch})

角色

  1. 分配资源:GPU/CPU 内存
  2. 执行节点sess.run(fetches, feed_dict) 按依赖序计算
  3. 传入数据feed_dict 将值绑到 Placeholder
  4. 取出结果:返回 fetches 的 numpy 值

必须先建图开 Session 跑,两步分离导致调试困难。

TF 2.x:默认 Eager Execution,运算立即求值,无需 Session。遗留代码用 tf.compat.v1.Session()。理解 Session 对维护老项目、读懂 2017 年前教程仍有意义。新项目用 TensorFlow 2.x + Keras

常见误区

⚠️ 常见踩坑

以为定义 y_pred = model(x) 后变量就有了值——在 1.x 静态图里这只是建图,不跑 sess.run 永远拿不到数字;另一个高频坑是忘记 sess.run(global_variables_initializer()),直接 run 含 Variable 的节点会抛 FailedPreconditionError(变量未初始化)。

追问

追问 1Session.run 可以一次算多个节点吗?

可以。fetches 传一个列表或字典即可,如 sess.run([loss, acc, train_op]),TF 会按依赖一次性求值并返回对应的 numpy 结果。一次 run 取多个节点比分多次 run 高效,且共享的中间结果只算一次。

追问 2InteractiveSession 和 Session 区别?

InteractiveSession 在创建时把自己设为默认 session,因此可以直接写 tensor.eval()、op.run() 而不用显式传 session,便于在 Jupyter/交互环境下调试;普通 Session 需要 with sess.as_default() 或显式传入。功能相同,区别只在默认上下文。

追问 3TF 2.x 如何模拟 Session 行为?

无需模拟:Eager 下运算即时返回结果。若想要 1.x 那样的「先建图再批量执行」的性能,用 @tf.function 把函数编译成图,TF 内部自动管理执行;只有运行纯旧代码时才用 tf.compat.v1.Session 并 disable_eager_execution。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

📖 术语表

🛠️ AI 工具

  • Pytorch

    Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出

  • Tensorflow

    全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具

  • Keras

    深度学习框架,64,020+ stars。高级神经网络 API,支持 TensorFlow、JAX、PyTorch 多后端。以用户友好著称,让深度学习从实验到生产的转化变得简单高效