目录
- TensorFlow 简介
- 核心概念
- TensorFlow 是什么?
- 神经网络的基本组成部分
- TensorFlow 的核心组件:
tf.data,tf.keras,tf.TensorFlow
- 实战:构建你的第一个神经网络
- 问题:手写数字识别 (MNIST 数据集)
- 步骤 1:环境准备与数据加载
- 步骤 2:数据预处理
- 步骤 3:构建模型
- 步骤 4:编译模型
- 步骤 5:训练模型
- 步骤 6:评估模型
- 步骤 7:进行预测
- 进阶概念与技巧
- 更复杂的模型结构
- 自定义训练循环
- 模型保存与加载
- 使用 GPU 加速
- 总结与学习路径
TensorFlow 简介
TensorFlow 是一个由 Google 开发的开源机器学习框架,它已经成为业界和学术界最流行的深度学习工具之一。

- 核心思想:将复杂的计算表示为一个计算图,在这个图中,数据(张量, Tensor)在不同的节点(操作, Operation)之间流动。
- 主要优势:
- 灵活性和可扩展性:可以从小型研究项目扩展到大规模生产部署。
- 跨平台:支持 CPU、GPU、TPU,以及移动端(TensorFlow Lite)和浏览器(TensorFlow.js)。
- 强大的生态系统:拥有 Keras(高级 API)、TensorBoard(可视化工具)、TensorFlow Hub(预训练模型)等丰富的工具。
核心概念
TensorFlow 是什么?
TensorFlow 是一个用 Python 编写的数值计算库,特别擅长处理多维数组(即张量, Tensor),它的名字就揭示了其本质:
- Tensor (张量):多维数组,可以是一个标量(0维)、向量(1维)、矩阵(2维)或更高维度的数组。
- Flow (流):数据在计算图中从输入流到输出的过程。
神经网络的基本组成部分
一个典型的神经网络由以下几层组成:
- 输入层:接收原始数据。
- 隐藏层:进行特征提取和变换,每一层由多个神经元 组成。
- 输出层:产生最终的预测结果。
- 激活函数:为隐藏层和输出层引入非线性,使网络能够学习复杂的模式,常见的有
ReLU,Sigmoid,Softmax。 - 损失函数:衡量模型预测值与真实值之间的差距,训练的目标就是最小化这个损失,常见的有
Mean Squared Error(回归),SparseCategoricalCrossentropy(分类)。 - 优化器:根据损失函数的结果,调整网络中的权重和偏置,以最小化损失,最常用的是
Adam,SGD。
TensorFlow 的核心组件
tf.data:用于高效构建输入数据管道,它可以轻松处理数据加载、预处理、批处理和打乱等操作,是处理大规模数据集的关键。tf.keras:TensorFlow 的高级 API,极大地简化了构建和训练模型的过程,你只需像搭积木一样堆叠Layer即可定义模型,无需关心底层计算图的细节。对于初学者,强烈推荐从tf.keras开始。tf.Tensor:TensorFlow 的基本数据结构,一个多维数组,所有在 TensorFlow 中计算的数据都以 Tensor 的形式存在。
实战:构建你的第一个神经网络
我们将使用经典的 MNIST 数据集来构建一个能识别手写数字(0-9)的神经网络,这是一个入门级的图像分类任务。
问题:手写数字识别
- 输入:一张 28x28 像素的灰度图片。
- 输出:图片中是哪个数字(0 到 9 中的一个)。
步骤 1:环境准备与数据加载
确保你已经安装了 TensorFlow,加载 MNIST 数据集,这个数据集被直接包含在 TensorFlow 中,非常方便。

import tensorflow as tf
import numpy as np
print("TensorFlow 版本:", tf.__version__)
# 加载 MNIST 数据集
# Keras 会将数据集自动分为训练集和测试集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 查看数据形状
print("训练集图像形状:", x_train.shape) # (60000, 28, 28)
print("训练集标签形状:", y_train.shape) # (60000,)
print("测试集图像形状:", x_test.shape) # (10000, 28, 28)
print("测试集标签形状:", y_test.shape) # (10000,)
步骤 2:数据预处理
原始像素值在 0 到 255 之间,为了加快模型收敛速度并提高稳定性,我们通常将数据归一化到 0 到 1 之间。
# 将像素值从 0-255 归一化到 0-1 # 将数据类型转换为 float32 x_train, x_test = x_train / 255.0, x_test / 255.0
步骤 3:构建模型
我们将使用 tf.keras.Sequential 模型,它是一个简单的层堆叠容器。
Flatten:将 28x28 的二维图像展平成一个 784 (28*28) 的一维向量。Dense:全连接层,是标准的神经网络层。- 第一个
Dense层有 128 个神经元,使用relu激活函数。 - 第二个(也是最后一个)
Dense层有 10 个神经元,对应 0-9 这 10 个类别,使用softmax激活函数,它会输出一个概率分布,每个类别的概率之和为 1。
- 第一个
# 使用 Keras Sequential API 构建模型
model = tf.keras.models.Sequential([
# 将 28x28 的图像展平成 784 维的向量
tf.keras.layers.Flatten(input_shape=(28, 28)),
# 添加一个全连接层,有 128 个神经元,使用 ReLU 激活函数
tf.keras.layers.Dense(128, activation='relu'),
# 为了防止过拟合,可以添加一个 Dropout �层(可选)
# tf.keras.layers.Dropout(0.2),
# 输出层,有 10 个神经元,对应 10 个类别,使用 Softmax 激活函数
tf.keras.layers.Dense(10, activation='softmax')
])
# 打印模型结构
model.summary()
步骤 4:编译模型
在训练之前,需要配置模型的损失函数、优化器和评估指标。
optimizer='adam':使用 Adam 优化器,它是一种自适应学习率优化算法,效果通常很好。loss='sparse_categorical_crossentropy':因为我们的标签是整数(0, 1, 2...),所以使用这个损失函数,如果标签是 one-hot 编码的向量,则应使用categorical_crossentropy。metrics=['accuracy']:我们希望监控模型的准确率。
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
步骤 5:训练模型
使用 model.fit() 方法来训练模型。

x_train,y_train:训练数据。epochs=5:将整个训练数据集过 5 遍。validation_data=(x_test, y_test):在每个 epoch 结束后,用测试集评估模型性能,这样可以监控模型是否过拟合。
# 训练模型
print("\n开始训练模型...")
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
print("模型训练完成!")
步骤 6:评估模型
使用 model.evaluate() 在测试集上评估模型的最终性能。
# 在测试集上评估模型
print("\n在测试集上评估模型...")
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'\n测试集准确率: {test_acc:.4f}')
步骤 7:进行预测
现在我们可以用训练好的模型来预测一张新图片了。
import matplotlib.pyplot as plt # 选择测试集中的第一张图片 predictions = model.predict(x_test) predicted_label = np.argmax
