TensorFlow 学习
目录
- 1. TensorFlow 是什么
- 2. 安装与验证
- 3. 学习路线
- 4. Tensor 基础
- 5. 自动求导与 GradientTape
- 6. Keras 快速上手
- 7. tf.data 数据管道
- 8. 完整示例一:线性回归
- 9. 完整示例二:二分类模型
- 10. 完整示例三:MNIST 图像分类
- 11. 保存、加载与推理
- 12. GPU、性能与调试
- 13. 常见错误
- 14. 面试常见问题
- 15. 建议练习
- 16. 参考资料
1. TensorFlow 是什么
TensorFlow 是一个用于机器学习和深度学习的开源框架,核心特点是:
- 支持张量计算和自动求导。
- 提供 Keras 作为高层 API。
- 支持 CPU、GPU、TPU 等多种设备。
- 既适合快速实验,也适合生产部署。
一个典型训练流程是:
准备数据 -> 构建模型 -> 定义损失和优化器 -> 前向传播 -> 计算损失 -> 反向传播 -> 更新参数 -> 保存模型常用入口:
importtensorflowastf2. 安装与验证
2.1 创建虚拟环境
Windows PowerShell:
python-m venv.venv.\.venv\Scripts\activate python-m pip install--upgrade pip setuptools wheelLinux/macOS:
python3-mvenv .venvsource.venv/bin/activate python-mpipinstall--upgradepip setuptools wheel2.2 安装 TensorFlow
官方推荐使用pip安装:
pipinstalltensorflow如果你需要更详细的系统要求、GPU 方案和平台差异,优先查看官方安装页:
https://www.tensorflow.org/install https://www.tensorflow.org/install/pip2.3 验证安装
新建check_tf.py:
importtensorflowastfprint("tensorflow version:",tf.__version__)print("eager execution:",tf.executing_eagerly())print("gpus:",tf.config.list_physical_devices("GPU"))x=tf.constant([1.0,2.0,3.0])print("sum:",tf.reduce_sum(x).numpy())运行:
python check_tf.py3. 学习路线
建议按这个顺序学:
tf.Tensor:创建、形状、类型、运算。- 自动求导:
tf.GradientTape。 - Keras:
Sequential、Model、Layer。 - 损失函数和优化器:
losses、optimizers。 tf.data:数据加载、批量、打乱、预取。- 训练循环:
model.fit()和自定义训练。 - 保存加载:
save_weights、SavedModel。 - GPU 和性能优化。
4. Tensor 基础
Tensor 是 TensorFlow 中的核心数据结构,类似 NumPy 数组,但支持自动求导和设备加速。
4.1 创建 Tensor
importtensorflowastf a=tf.constant([1,2,3])b=tf.zeros([2,3])c=tf.ones([2,3])d=tf.random.normal([2,3])e=tf.range(0,10,delta=2)print(a)print(b.shape)print(d.dtype)4.2 常用属性
importtensorflowastf x=tf.random.normal([4,5])print(x.shape)print(x.dtype)print(x.ndim)4.3 索引和切片
importtensorflowastf x=tf.reshape(tf.range(12),[3,4])print(x)print(x[0])print(x[:,1])print(x[1:3,:2])4.4 数学运算
importtensorflowastf a=tf.constant([[1.0,2.0],[3.0,4.0]])b=tf.constant([[10.0,20.0],[30.0,40.0]])print(a+b)print(a*b)print(tf.matmul(a,b))print(tf.reduce_mean(a))print(tf.reduce_sum(a,axis=0))4.5 广播机制
importtensorflowastf x=tf.random.normal([3,4])bias=tf.constant([1.0,2.0,3.0,4.0])y=x+biasprint(y.shape)4.6 Tensor 和 NumPy 互转
importnumpyasnpimporttensorflowastf arr=np.array([1,2,3],dtype=np.float32)t=tf.convert_to_tensor(arr)print(t.numpy())5. 自动求导与 GradientTape
TensorFlow 用tf.GradientTape记录计算过程并计算梯度。
5.1 最小例子
importtensorflowastf x=tf.Variable(2.0)withtf.GradientTape()astape:y=x**2+3*x+1dy_dx=tape.gradient(y,x)print("y =",y.numpy())print("dy/dx =",dy_dx.numpy())5.2 多变量求导
importtensorflowastf w=tf.Variable([1.0,2.0,3.0])x=tf.constant([4.0,5.0,6.0])withtf.GradientTape()astape:y=tf.reduce_sum(w*x)grad=tape.gradient(y,w)print(grad.numpy())5.3 关闭梯度记录
推理时不需要梯度:
importtensorflowastfwithtf.device("/CPU:0"):x=tf.constant(2.0)y=x*10print(y.numpy())5.4 只看一次的梯度
默认情况下,GradientTape只用一次。要重复求导可以设置:
withtf.GradientTape(persistent=True)astape:...但用完记得释放,避免占内存。
6. Keras 快速上手
TensorFlow 里最常用的是 Keras。它提供了很顺手的高层 API,适合快速搭建模型。
6.1 Sequential 模型
importtensorflowastf model=tf.keras.Sequential([tf.keras.layers.Dense(32,activation="relu",input_shape=(10,)),tf.keras.layers.Dense(16,activation="relu"),tf.keras.layers.Dense(3)])model.summary()6.2 Functional API
适合多输入、多分支、残差结构等复杂模型。
importtensorflowastf inputs=tf.keras.Input(shape=(10,))x=tf.keras.layers.Dense(32,activation="relu")(inputs)x=tf.keras.layers.Dense(16,activation="relu")(x)outputs=tf.keras.layers.Dense(3)(x)model=tf.keras.Model(inputs,outputs)model.summary()6.3 编译模型
model.compile(optimizer=tf.keras.optimizers.Adam(1e-3),loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=["accuracy"])6.4 训练模型
history=model.fit(x_train,y_train,epochs=5,batch_size=32)7. tf.data 数据管道
tf.data用来高效构建数据输入管道,常用于训练集、验证集和大规模数据读取。
7.1 从 Tensor 创建数据集
importtensorflowastf x=tf.range(10)ds=tf.data.Dataset.from_tensor_slices(x)foriteminds.take(3):print(item.numpy())7.2 批量、打乱、预取
ds=tf.data.Dataset.from_tensor_slices((x,x*2))ds=ds.shuffle(10).batch(4).prefetch(tf.data.AUTOTUNE)7.3 map 处理
defnormalize(x,y):returntf.cast(x,tf.float32)/10.0,y ds=ds.map(normalize)8. 完整示例一:线性回归
目标:学习y = 3x + 2 + noise。
保存为linear_regression_tf.py。
importtensorflowastfdefmain():tf.random.set_seed(42)x=tf.linspace(-5.0,5.0,200)x=tf.reshape(x,[-1,1])noise=tf.random.normal(tf.shape(x),stddev=0.5)y=3.0*x+2.0+noise model=tf.keras.Sequential([tf.keras.layers.Dense(1,input_shape=(1,))])model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.05),loss=tf.keras.losses.MeanSquaredError())history=model.fit(x,y,epochs=100,verbose=0)weight,bias=model.layers[0].get_weights()print("weight:",weight[0][0])print("bias:",bias[0])test_x=tf.constant([[10.0]])pred=model(test_x,training=False)print("x=10 prediction:",pred.numpy()[0][0])if__name__=="__main__":main()训练核心就是:
model.compile(...)model.fit(...)9. 完整示例二:二分类模型
目标:判断二维点是否落在圆内。
保存为binary_classification_tf.py。
importtensorflowastfdefbuild_dataset(n=2000):x=tf.random.uniform([n,2],minval=-2.0,maxval=2.0)radius=tf.sqrt(tf.reduce_sum(tf.square(x),axis=1,keepdims=True))y=tf.cast(radius<1.0,tf.float32)returnx,ydefmain():tf.random.set_seed(0)x,y=build_dataset()ds=tf.data.Dataset.from_tensor_slices((x,y))ds=ds.shuffle(2000).batch(64).prefetch(tf.data.AUTOTUNE)model=tf.keras.Sequential([tf.keras.layers.Dense(32,activation="relu",input_shape=(2,)),tf.keras.layers.Dense(32,activation="relu"),tf.keras.layers.Dense(1)])model.compile(optimizer=tf.keras.optimizers.Adam(1e-3),loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=[tf.keras.metrics.BinaryAccuracy(threshold=0.0)])model.fit(ds,epochs=20,verbose=1)sample=tf.constant([[0.2,0.3],[1.5,1.5]])logits=model(sample,training=False)probs=tf.sigmoid(logits)print(probs.numpy())if__name__=="__main__":main()注意:
- 二分类如果输出一个 logit,损失函数用
BinaryCrossentropy(from_logits=True)。 - 不要在最后一层再手动加
sigmoid后传给这个损失。
10. 完整示例三:MNIST 图像分类
这是 TensorFlow 入门最经典的例子之一。
保存为mnist_tf.py。
importtensorflowastfdefmain():tf.random.set_seed(42)(x_train,y_train),(x_test,y_test)=tf.keras.datasets.mnist.load_data()x_train=x_train.astype("float32")/255.0x_test=x_test.astype("float32")/255.0x_train=x_train[...,tf.newaxis]x_test=x_test[...,tf.newaxis]train_ds=tf.data.Dataset.from_tensor_slices((x_train,y_train))train_ds=train_ds.shuffle(10000).batch(64).prefetch(tf.data.AUTOTUNE)test_ds=tf.data.Dataset.from_tensor_slices((x_test,y_test))test_ds=test_ds.batch(256).prefetch(tf.data.AUTOTUNE)model=tf.keras.Sequential([tf.keras.layers.Conv2D(32,3,activation="relu",input_shape=(28,28,1)),tf.keras.layers.MaxPool2D(),tf.keras.layers.Conv2D(64,3,activation="relu"),tf.keras.layers.MaxPool2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128,activation="relu"),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10)])model.compile(optimizer=tf.keras.optimizers.Adam(1e-3),loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=["accuracy"])model.fit(train_ds,validation_data=test_ds,epochs=5)model.save("mnist_tf_model")print("saved to mnist_tf_model")if__name__=="__main__":main()11. 保存、加载与推理
11.1 保存模型
model.save("my_model")11.2 加载模型
loaded=tf.keras.models.load_model("my_model")11.3 只保存权重
model.save_weights("weights.keras")model.load_weights("weights.keras")11.4 推理
withtf.device("/CPU:0"):pred=loaded(tf.constant([[1.0,2.0,3.0]]),training=False)print(pred.numpy())12. GPU、性能与调试
12.1 查看 GPU
print(tf.config.list_physical_devices("GPU"))12.2 设定显存按需增长
gpus=tf.config.list_physical_devices("GPU")forgpuingpus:tf.config.experimental.set_memory_growth(gpu,True)12.3 tf.function
tf.function可以把 Python 函数编译成图,常用于提升性能。
@tf.functiondeffast_step(x):returnx*x+112.4 调试建议
- 先用小数据跑通。
- 先确认 shape 再看精度。
- 优先检查标签类型和损失函数是否匹配。
- 遇到问题时先关闭复杂技巧,比如
tf.function、混合精度。
13. 常见错误
13.1 shape 不匹配
常见报错:
ValueError: Input 0 of layer ... is incompatible with the layer先打印:
print(x.shape)print(y.shape)13.2 分类任务损失函数用错
多分类通常用:
tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)二分类常用:
tf.keras.losses.BinaryCrossentropy(from_logits=True)13.3 忘记归一化
图像输入通常要除以 255.0。
13.4 训练和推理模式混用
model(x,training=True)model(x,training=False)13.5 忘记用float32
很多模型训练默认希望输入是float32。
14. 面试常见问题
14.1 TensorFlow 和 Keras 是什么关系?
Keras 是 TensorFlow 里的高层 API,负责快速搭建模型、训练和评估。
14.2tf.Tensor和tf.Variable有什么区别?
tf.Tensor更像不可变数据,tf.Variable表示可训练参数,梯度通常更新到Variable上。
14.3GradientTape的作用是什么?
它用于记录前向过程并自动计算梯度,是 TensorFlow 的自动求导核心工具。
14.4 为什么分类损失常用from_logits=True?
因为直接使用 logits 数值更稳定,避免重复手动做softmax或sigmoid。
14.5model.fit()和自定义训练循环有什么区别?
model.fit()简洁,适合常规训练;自定义训练循环更灵活,适合复杂逻辑和研究实验。
14.6tf.data有什么用?
它用于构建高效的数据输入管道,支持批处理、打乱、映射、并行和预取。
14.7model.save()保存了什么?
通常会保存模型结构、权重和必要的配置,方便之后直接加载推理。
14.8training=True和training=False为什么重要?
Dropout、BatchNorm 等层在训练和推理时行为不同。
14.9 为什么要先看 shape?
深度学习里很多错误本质上都是张量形状不对,先看 shape 往往最快。
14.10 TensorFlow 适合什么场景?
适合快速原型、模型训练、图像/文本/结构化数据任务,以及部署到多种设备。
15. 建议练习
练习 1:Tensor 基础
写代码完成:
- 创建一个
[5, 3]的随机 Tensor。 - 取第一行。
- 计算每一列平均值。
- 变成
float64。
练习 2:改造线性回归
把示例中的真实函数改成:
y=-4.0*x+7.0+noise观察模型是否能学到接近的参数。
练习 3:改造二分类模型
把二分类模型的隐藏层改成 64、64、32 三层,看看准确率和收敛速度有什么变化。
练习 4:保存后加载
训练完 MNIST 模型后,加载模型并对几张图片做推理。
练习 5:写一个自定义 Dataset
做一个从 CSV 读取特征和标签的数据管道,再接入tf.data.Dataset训练。
16. 参考资料
- TensorFlow 官方首页:https://www.tensorflow.org/
- TensorFlow 安装页:https://www.tensorflow.org/install
- TensorFlow pip 安装页:https://www.tensorflow.org/install/pip
- TensorFlow 教程首页:https://www.tensorflow.org/tutorials
- TensorFlow Keras 指南:https://www.tensorflow.org/guide/keras
- TensorFlow 基础指南:https://www.tensorflow.org/guide/basics
- TensorFlow 2 Quickstart for beginners:https://www.tensorflow.org/tutorials/quickstart/beginner
