核心要点
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 是执行计算图的运行时:
# 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})角色:
- 分配资源:GPU/CPU 内存
- 执行节点:sess.run(fetches, feed_dict) 按依赖序计算
- 传入数据:feed_dict 将值绑到 Placeholder
- 取出结果:返回 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(变量未初始化)。
追问
追问 1:Session.run 可以一次算多个节点吗?
可以。fetches 传一个列表或字典即可,如 sess.run([loss, acc, train_op]),TF 会按依赖一次性求值并返回对应的 numpy 结果。一次 run 取多个节点比分多次 run 高效,且共享的中间结果只算一次。
追问 2:InteractiveSession 和 Session 区别?
InteractiveSession 在创建时把自己设为默认 session,因此可以直接写 tensor.eval()、op.run() 而不用显式传 session,便于在 Jupyter/交互环境下调试;普通 Session 需要 with sess.as_default() 或显式传入。功能相同,区别只在默认上下文。
追问 3:TF 2.x 如何模拟 Session 行为?
无需模拟:Eager 下运算即时返回结果。若想要 1.x 那样的「先建图再批量执行」的性能,用 @tf.function 把函数编译成图,TF 内部自动管理执行;只有运行纯旧代码时才用 tf.compat.v1.Session 并 disable_eager_execution。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出
- Tensorflow
全球最流行的机器学习框架之一,195K+ stars。Google 开源的端到端 ML 平台,支持 TensorFlow、Keras 等多种 API,覆盖深度学习、强化学习、移动端部署等全场景,是 AI 工程师的必备工具
- Keras
深度学习框架,64,020+ stars。高级神经网络 API,支持 TensorFlow、JAX、PyTorch 多后端。以用户友好著称,让深度学习从实验到生产的转化变得简单高效