TensorFlow 学习
目录1. TensorFlow 是什么2. 安装与验证3. 学习路线4. Tensor 基础5. 自动求导与 GradientTape6. 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 PowerShellpython-m venv.venv.\.venv\Scripts\activate python-m pip install--upgrade pip setuptools wheelLinux/macOSpython3-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.pyimporttensorflowastfprint(tensorflow version:,tf.__version__)print(eager execution:,tf.executing_eagerly())print(gpus:,tf.config.list_physical_devices(GPU))xtf.constant([1.0,2.0,3.0])print(sum:,tf.reduce_sum(x).numpy())运行python check_tf.py3. 学习路线建议按这个顺序学tf.Tensor创建、形状、类型、运算。自动求导tf.GradientTape。KerasSequential、Model、Layer。损失函数和优化器losses、optimizers。tf.data数据加载、批量、打乱、预取。训练循环model.fit()和自定义训练。保存加载save_weights、SavedModel。GPU 和性能优化。4. Tensor 基础Tensor 是 TensorFlow 中的核心数据结构类似 NumPy 数组但支持自动求导和设备加速。4.1 创建 Tensorimporttensorflowastf atf.constant([1,2,3])btf.zeros([2,3])ctf.ones([2,3])dtf.random.normal([2,3])etf.range(0,10,delta2)print(a)print(b.shape)print(d.dtype)4.2 常用属性importtensorflowastf xtf.random.normal([4,5])print(x.shape)print(x.dtype)print(x.ndim)4.3 索引和切片importtensorflowastf xtf.reshape(tf.range(12),[3,4])print(x)print(x[0])print(x[:,1])print(x[1:3,:2])4.4 数学运算importtensorflowastf atf.constant([[1.0,2.0],[3.0,4.0]])btf.constant([[10.0,20.0],[30.0,40.0]])print(ab)print(a*b)print(tf.matmul(a,b))print(tf.reduce_mean(a))print(tf.reduce_sum(a,axis0))4.5 广播机制importtensorflowastf xtf.random.normal([3,4])biastf.constant([1.0,2.0,3.0,4.0])yxbiasprint(y.shape)4.6 Tensor 和 NumPy 互转importnumpyasnpimporttensorflowastf arrnp.array([1,2,3],dtypenp.float32)ttf.convert_to_tensor(arr)print(t.numpy())5. 自动求导与 GradientTapeTensorFlow 用tf.GradientTape记录计算过程并计算梯度。5.1 最小例子importtensorflowastf xtf.Variable(2.0)withtf.GradientTape()astape:yx**23*x1dy_dxtape.gradient(y,x)print(y ,y.numpy())print(dy/dx ,dy_dx.numpy())5.2 多变量求导importtensorflowastf wtf.Variable([1.0,2.0,3.0])xtf.constant([4.0,5.0,6.0])withtf.GradientTape()astape:ytf.reduce_sum(w*x)gradtape.gradient(y,w)print(grad.numpy())5.3 关闭梯度记录推理时不需要梯度importtensorflowastfwithtf.device(/CPU:0):xtf.constant(2.0)yx*10print(y.numpy())5.4 只看一次的梯度默认情况下GradientTape只用一次。要重复求导可以设置withtf.GradientTape(persistentTrue)astape:...但用完记得释放避免占内存。6. Keras 快速上手TensorFlow 里最常用的是 Keras。它提供了很顺手的高层 API适合快速搭建模型。6.1 Sequential 模型importtensorflowastf modeltf.keras.Sequential([tf.keras.layers.Dense(32,activationrelu,input_shape(10,)),tf.keras.layers.Dense(16,activationrelu),tf.keras.layers.Dense(3)])model.summary()6.2 Functional API适合多输入、多分支、残差结构等复杂模型。importtensorflowastf inputstf.keras.Input(shape(10,))xtf.keras.layers.Dense(32,activationrelu)(inputs)xtf.keras.layers.Dense(16,activationrelu)(x)outputstf.keras.layers.Dense(3)(x)modeltf.keras.Model(inputs,outputs)model.summary()6.3 编译模型model.compile(optimizertf.keras.optimizers.Adam(1e-3),losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])6.4 训练模型historymodel.fit(x_train,y_train,epochs5,batch_size32)7. tf.data 数据管道tf.data用来高效构建数据输入管道常用于训练集、验证集和大规模数据读取。7.1 从 Tensor 创建数据集importtensorflowastf xtf.range(10)dstf.data.Dataset.from_tensor_slices(x)foriteminds.take(3):print(item.numpy())7.2 批量、打乱、预取dstf.data.Dataset.from_tensor_slices((x,x*2))dsds.shuffle(10).batch(4).prefetch(tf.data.AUTOTUNE)7.3 map 处理defnormalize(x,y):returntf.cast(x,tf.float32)/10.0,y dsds.map(normalize)8. 完整示例一线性回归目标学习y 3x 2 noise。保存为linear_regression_tf.py。importtensorflowastfdefmain():tf.random.set_seed(42)xtf.linspace(-5.0,5.0,200)xtf.reshape(x,[-1,1])noisetf.random.normal(tf.shape(x),stddev0.5)y3.0*x2.0noise modeltf.keras.Sequential([tf.keras.layers.Dense(1,input_shape(1,))])model.compile(optimizertf.keras.optimizers.SGD(learning_rate0.05),losstf.keras.losses.MeanSquaredError())historymodel.fit(x,y,epochs100,verbose0)weight,biasmodel.layers[0].get_weights()print(weight:,weight[0][0])print(bias:,bias[0])test_xtf.constant([[10.0]])predmodel(test_x,trainingFalse)print(x10 prediction:,pred.numpy()[0][0])if__name____main__:main()训练核心就是model.compile(...)model.fit(...)9. 完整示例二二分类模型目标判断二维点是否落在圆内。保存为binary_classification_tf.py。importtensorflowastfdefbuild_dataset(n2000):xtf.random.uniform([n,2],minval-2.0,maxval2.0)radiustf.sqrt(tf.reduce_sum(tf.square(x),axis1,keepdimsTrue))ytf.cast(radius1.0,tf.float32)returnx,ydefmain():tf.random.set_seed(0)x,ybuild_dataset()dstf.data.Dataset.from_tensor_slices((x,y))dsds.shuffle(2000).batch(64).prefetch(tf.data.AUTOTUNE)modeltf.keras.Sequential([tf.keras.layers.Dense(32,activationrelu,input_shape(2,)),tf.keras.layers.Dense(32,activationrelu),tf.keras.layers.Dense(1)])model.compile(optimizertf.keras.optimizers.Adam(1e-3),losstf.keras.losses.BinaryCrossentropy(from_logitsTrue),metrics[tf.keras.metrics.BinaryAccuracy(threshold0.0)])model.fit(ds,epochs20,verbose1)sampletf.constant([[0.2,0.3],[1.5,1.5]])logitsmodel(sample,trainingFalse)probstf.sigmoid(logits)print(probs.numpy())if__name____main__:main()注意二分类如果输出一个 logit损失函数用BinaryCrossentropy(from_logitsTrue)。不要在最后一层再手动加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_trainx_train.astype(float32)/255.0x_testx_test.astype(float32)/255.0x_trainx_train[...,tf.newaxis]x_testx_test[...,tf.newaxis]train_dstf.data.Dataset.from_tensor_slices((x_train,y_train))train_dstrain_ds.shuffle(10000).batch(64).prefetch(tf.data.AUTOTUNE)test_dstf.data.Dataset.from_tensor_slices((x_test,y_test))test_dstest_ds.batch(256).prefetch(tf.data.AUTOTUNE)modeltf.keras.Sequential([tf.keras.layers.Conv2D(32,3,activationrelu,input_shape(28,28,1)),tf.keras.layers.MaxPool2D(),tf.keras.layers.Conv2D(64,3,activationrelu),tf.keras.layers.MaxPool2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128,activationrelu),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10)])model.compile(optimizertf.keras.optimizers.Adam(1e-3),losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])model.fit(train_ds,validation_datatest_ds,epochs5)model.save(mnist_tf_model)print(saved to mnist_tf_model)if__name____main__:main()11. 保存、加载与推理11.1 保存模型model.save(my_model)11.2 加载模型loadedtf.keras.models.load_model(my_model)11.3 只保存权重model.save_weights(weights.keras)model.load_weights(weights.keras)11.4 推理withtf.device(/CPU:0):predloaded(tf.constant([[1.0,2.0,3.0]]),trainingFalse)print(pred.numpy())12. GPU、性能与调试12.1 查看 GPUprint(tf.config.list_physical_devices(GPU))12.2 设定显存按需增长gpustf.config.list_physical_devices(GPU)forgpuingpus:tf.config.experimental.set_memory_growth(gpu,True)12.3 tf.functiontf.function可以把 Python 函数编译成图常用于提升性能。tf.functiondeffast_step(x):returnx*x112.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_logitsTrue)二分类常用tf.keras.losses.BinaryCrossentropy(from_logitsTrue)13.3 忘记归一化图像输入通常要除以 255.0。13.4 训练和推理模式混用model(x,trainingTrue)model(x,trainingFalse)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_logitsTrue因为直接使用 logits 数值更稳定避免重复手动做softmax或sigmoid。14.5model.fit()和自定义训练循环有什么区别model.fit()简洁适合常规训练自定义训练循环更灵活适合复杂逻辑和研究实验。14.6tf.data有什么用它用于构建高效的数据输入管道支持批处理、打乱、映射、并行和预取。14.7model.save()保存了什么通常会保存模型结构、权重和必要的配置方便之后直接加载推理。14.8trainingTrue和trainingFalse为什么重要Dropout、BatchNorm 等层在训练和推理时行为不同。14.9 为什么要先看 shape深度学习里很多错误本质上都是张量形状不对先看 shape 往往最快。14.10 TensorFlow 适合什么场景适合快速原型、模型训练、图像/文本/结构化数据任务以及部署到多种设备。15. 建议练习练习 1Tensor 基础写代码完成创建一个[5, 3]的随机 Tensor。取第一行。计算每一列平均值。变成float64。练习 2改造线性回归把示例中的真实函数改成y-4.0*x7.0noise观察模型是否能学到接近的参数。练习 3改造二分类模型把二分类模型的隐藏层改成 64、64、32 三层看看准确率和收敛速度有什么变化。练习 4保存后加载训练完 MNIST 模型后加载模型并对几张图片做推理。练习 5写一个自定义 Dataset做一个从 CSV 读取特征和标签的数据管道再接入tf.data.Dataset训练。16. 参考资料TensorFlow 官方首页https://www.tensorflow.org/TensorFlow 安装页https://www.tensorflow.org/installTensorFlow pip 安装页https://www.tensorflow.org/install/pipTensorFlow 教程首页https://www.tensorflow.org/tutorialsTensorFlow Keras 指南https://www.tensorflow.org/guide/kerasTensorFlow 基础指南https://www.tensorflow.org/guide/basicsTensorFlow 2 Quickstart for beginnershttps://www.tensorflow.org/tutorials/quickstart/beginner