1、TensorFlow基础回顾:TensorFlow发展史、核心概念与环境搭建
各位同学,欢迎来到《TensorFlow自定义层与自定义训练实战》的第一章。说实话,每次开始一个新课程,我都习惯先带大家回顾一下基础。不是因为我啰嗦,而是我踩过太多「基础不牢,地动山摇」的坑了。
这一章,咱们聊聊TensorFlow的来龙去脉、核心概念,以及怎么把环境搭得顺手。嗯,都是干货,咱们开始吧。
1.1 TensorFlow发展史:从闭源到开源,从1.x到2.x
TensorFlow是Google Brain团队在2015年开源的深度学习框架。但你知道吗?它最早其实是Google内部用于研究和生产的工具,叫DistBelief。我2016年刚接触深度学习时,用的还是Caffe和Theano,TensorFlow一出来,我就觉得这东西有戏——计算图的概念太优雅了。
发展历程的几个关键节点:
- 2015年11月:TensorFlow 1.0 正式开源。静态计算图,需要先构建图再执行。说实话,调试起来挺痛苦的。
- 2017年:引入Eager Execution(动态图模式)。我记得当时看到这个更新,差点拍桌子——终于不用再忍受「先建图再跑」的折磨了。
- 2019年:TensorFlow 2.0 发布。默认启用Eager Execution,合并了Keras作为官方高级API。说白了,就是向PyTorch的易用性看齐。
- 至今:2.x持续迭代,加入了更多生产部署、移动端、Web端支持。
我的建议:如果你是新学,直接上TensorFlow 2.x。1.x的静态图模式虽然在某些场景下性能更好,但开发效率太低了。我在一个工业项目中被迫维护过1.x的老代码,那感觉就像穿着雨衣洗澡——能干活,但浑身难受。
1.2 核心概念:张量、计算图、会话
这三个概念,是TensorFlow的基石。咱们一个一个说。
1.2.1 张量(Tensor)
张量,说白了就是多维数组。0维是标量,1维是向量,2维是矩阵,3维及以上就叫张量。TensorFlow里所有数据都以张量的形式流动。
举个例子:
import tensorflow as tf
# 标量(0维)
scalar = tf.constant(3.14)
# 向量(1维)
vector = tf.constant([1, 2, 3])
# 矩阵(2维)
matrix = tf.constant([[1, 2], [3, 4]])
# 3维张量
tensor_3d = tf.constant([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(scalar.shape) # 输出: ()
print(vector.shape) # 输出: (3,)
print(matrix.shape) # 输出: (2, 2)
print(tensor_3d.shape) # 输出: (2, 2, 2)
我在项目中遇到过一个问题:新手容易把张量的shape搞混。记住一个口诀——shape的每个维度,从外到内数括号。你想想看,是不是这个理?
1.2.2 计算图(Graph)
计算图是TensorFlow的灵魂。它把计算过程表示为一个有向无环图,节点是操作(op),边是张量。
在1.x时代,你得先构建图,再在会话中执行。2.x默认启用动态图,图是即时构建的,调试起来方便多了。
但注意,静态图并没有消失。你仍然可以用 @tf.function 装饰器将Python函数编译成静态图,获得性能提升。
@tf.function
def compute(x, y):
return tf.matmul(x, y) + tf.constant(1.0)
a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
b = tf.constant([[5.0, 6.0], [7.0, 8.0]])
result = compute(a, b)
print(result)
小技巧:用 @tf.function 时,尽量让输入是张量,避免Python原生类型。否则每次调用都会重新编译图,性能反而下降。我曾经因为这个坑,把训练速度从1小时拖到了3小时——嗯,血的教训。
1.2.3 会话(Session)
在1.x中,会话是执行计算图的引擎。你需要显式创建Session,然后调用 sess.run() 来执行操作。
2.x中,会话被隐藏了。你直接调用函数或方法,TensorFlow自动管理执行。但如果你需要手动控制资源,可以用 tf.compat.v1.Session(不推荐)。
我个人的习惯是:除非有特殊需求,否则别碰Session。让框架帮你打理这些细节,你专注于模型设计就好。
1.3 环境搭建与版本选择
环境搭建这事儿,说简单也简单,说复杂也复杂。我见过太多同学卡在第一步——装了半天,import报错。咱们一步步来。
1.3.1 版本选择
目前TensorFlow的最新稳定版是2.x。我建议你选择 2.10 或 2.12 这两个版本。为什么?
- 2.10:最后一个原生支持GPU的Windows版本(之后Windows GPU支持需要WSL2)。
- 2.12:功能完整,bug较少,社区支持好。
如果你用的是Apple Silicon(M1/M2芯片),建议用 tensorflow-macos 和 tensorflow-metal 插件,能充分利用GPU加速。
| 操作系统 | 推荐版本 | 备注 |
|---|---|---|
| Windows | 2.10 | 原生GPU支持,无需WSL2 |
| Linux | 2.12+ | GPU支持最好,CUDA兼容性高 |
| macOS (Intel) | 2.12 | CPU模式,GPU支持有限 |
| macOS (Apple Silicon) | 2.12 (tensorflow-macos) | 配合tensorflow-metal使用 |
1.3.2 安装步骤
我推荐用 conda 或 venv 创建虚拟环境。别偷懒,直接在base环境装,迟早会出问题。
# 创建虚拟环境(Python 3.9 比较稳妥)
conda create -n tf_env python=3.9
# 激活环境
conda activate tf_env
# 安装TensorFlow
pip install tensorflow==2.12.0
# 验证安装
python -c "import tensorflow as tf; print(tf.__version__)"
注意:如果你要装GPU版本,先确认CUDA和cuDNN的版本兼容性。TensorFlow 2.12 需要 CUDA 11.8 和 cuDNN 8.6。我曾经因为CUDA版本不对,折腾了一整天——最后发现是少装了一个依赖库。
1.3.3 验证GPU是否可用
import tensorflow as tf
# 检查GPU
gpus = tf.config.list_physical_devices('GPU')
if gpus:
print(f"找到 {len(gpus)} 个GPU设备")
for gpu in gpus:
print(f" - {gpu.name}")
else:
print("没有检测到GPU,将使用CPU")
如果输出显示没有GPU,别慌。先检查驱动,再检查CUDA版本。实在不行,用CPU跑小模型练手也行——就是慢点,但能跑。
1.4 本章小结
这一章,咱们回顾了TensorFlow的发展史,理清了张量、计算图、会话这三个核心概念,也把环境搭建的坑提前填上了。
你想想看,这些基础东西搞明白了,后面学自定义层和自定义训练,是不是就顺多了?
下一章,咱们正式进入自定义层的世界。我会带你手写一个全连接层,看看TensorFlow底层到底是怎么工作的。嗯,到时候见。
课后练习:
- 创建一个形状为 (3, 4, 5) 的随机张量,并打印它的shape和dtype。
- 用
@tf.function装饰一个函数,实现两个矩阵相乘并加上偏置。 - 检查你的环境是否支持GPU,如果不支持,尝试用CPU跑一个小模型。