目录
TensorFlow 2.x基础
TensorFlow 2.x 是一个广泛使用的深度学习框架,特别适用于神经网络的构建和训练。与之前的版本相比,TensorFlow 2.x 提供了更加简洁和易用的 API,集成了 Keras 作为高层 API,并支持动态图(Eager Execution)。
1、安装 TensorFlow 2.x
首先,确保你已经安装了 TensorFlow 2.x。(Python 3.11.4)可以通过以下命令来安装:pip install tensorflow 查看:pip show tensorflow
Name: tensorflow
Version: 2.18.0
2、TensorFlow 2.x 基础概念
2、1 Eager Execution
TensorFlow 2.x 默认启用 Eager Execution,这意味着操作是即时执行的,计算结果会立刻返回,而不需要构建图。这样使得调试更加容易,代码更具可读性。
import tensorflow as tf
# 启用 Eager Execution
tf.compat.v1.enable_eager_execution()
# 创建一个张量并执行操作
a = tf.constant([1, 2, 3])
b = tf.constant([4, 5, 6])
c = a + b # 即时执行
print(c) # 输出结果: tf.Tensor([5 7 9], shape=(3,), dtype=int32)
2、2 TensorFlow 张量(Tensor)
TensorFlow 的核心数据结构是张量(tensor)。张量类似于 NumPy 数组,可以存储数据并在 TensorFlow 图中传递。你可以创建不同类型的张量:
# 创建张量
t1 = tf.constant([1, 2, 3]) # 一维张量
t2 = tf.constant([[1, 2], [3, 4]]) # 二维张量
# 张量操作
t3 = t1 + 5 # 所有元素加5
print(t3) # tf.Tensor([6 7 8], shape=(3,), dtype=int32)
3、使用Keras构建神经网络模型
TensorFlow 2.x 中,Keras 成为默认的高级API。通过Keras可以快速构建和训练神经网络。
3、1 构建 Sequential 模型
tf.keras.models.Sequential 是TensorFlow Keras API 中用于构建模型的一种简单方式。它允许你按顺序堆叠多个层(layers),以构建深度学习模型,可以通过 add 方法向模型中添加层。常用的层包括全连接层(Dense)、卷积层(Conv2D)、池化层(MaxPooling2D)等
from tensorflow.keras import layers, models
# 创建一个简单的 Sequential 模型
model = models.Sequential([
#有 128 个神经元,激活函数为 ReLU
layers.Dense(128, activation='relu', input_shape=(784,)), # 输入层784 维的向量
layers.Dropout(0.2), # Dropout 层丢弃 20% 的神经元,防止过拟合
layers.Dense(10, activation='softmax') # 输出层10 个神经元,激活函数为 softmax用于多分类
])
# 打印模型概述
model.summary()
3、2 编译模型
在构建模型后,需要编译它,选择优化器、损失函数和评估指标:在深度学习中,optimizer、loss 和 metrics 是模型编译时的重要参数。下面将详细解释这三个参数的含义及其在模型训练中的作用。
1、Optimizer(优化器)
optimizer='adam' 指定了使用 Adam 优化器。优化器的主要作用是更新模型的权重,以最小化损失函数。Adam 优化器结合了动量和自适应学习率的优点,通常在许多任务中表现良好。
Adam 优化器的特点:自适应学习率:根据每个参数的历史梯度动态调整学习率。适合大规模数据和高维参数。通常收敛速度快,效果好。
2、Loss(损失函数)
loss='sparse_categorical_crossentropy' 指定了使用稀疏分类交叉熵作为损失函数。损失函数用于衡量模型预测值与真实值之间的差距。
稀疏分类交叉熵的特点:适用于多分类问题,且标签是整数形式(而不是独热编码)。计算方式是对每个样本的预测概率与真实标签的交叉熵进行求和。适合处理类别较多的分类问题。
3、Metrics(评估指标)
metrics=['accuracy'] 指定了在训练和评估过程中使用的评估指标。在这里,使用的是准确率(accuracy它表示模型预测正确的样本占总样本的比例。
准确率的特点:简单易懂,常用于分类问题。适合类别均衡的数据集,但在类别不均衡时可能会产生误导。
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
3、3 训练模型
训练模型时,需要指定训练数据、标签、批量大小、训练的轮数(epochs)等参数:
# 假设我们已经加载了 MNIST 数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
# 预处理数据
train_images = train_images.reshape((train_images.shape[0], 784)).astype('float32') / 255
test_images = test_images.reshape((test_images.shape[0], 784)).astype('float32') / 255
# 训练模型
history = model.fit(train_images, train_labels, epochs=5, batch_size=64, validation_data=(test_images, test_labels))
-
epochs:表示整个训练数据集将被训练的次数。设置为5模型将遍历整个训练数据集5次
-
batch_size:表示每次迭代中用于训练的样本数量。选择合适的 batch_size对模型的训练速度和性能有很大影响。常见的选择有32、64、128等,具体选择可以根据你的数据集大小和计算资源来决定。
3、4 评估模型
训练完成后,可以通过 evaluate 函数来评估模型在测试集上的表现:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')
model.evaluate(test_images, test_labels):这个函数用于评估模型在测试数据集上的表现。
test_images 是测试集的输入数据,通常是图像数据。
test_labels 是对应的标签,表示每个测试样本的真实类别。
该函数返回两个值:test_loss 和 test_acc,分别表示测试集上的损失值和准确率。print(f'Test accuracy: {test_acc}'):
准确率 (Accuracy):正确预测的样本占总样本的比例。
精确率 (Precision):正确预测为正类的样本占所有预测为正类的样本的比例。
召回率 (Recall):正确预测为正类的样本占所有实际为正类的样本的比例。
F1-score:精确率和召回率的调和平均数。
3、5 预测
使用训练好的模型进行预测:
predictions = model.predict(test_images)
print(predictions[0]) # 打印第一个测试样本的预测结果
4、使用 TensorFlow 2.x 实现自定义训练循环
虽然 Keras 提供了便捷的接口,但有时我们需要更多控制,特别是需要自定义训练循环时。在 TensorFlow 2.x 中,你可以轻松实现自定义的训练循环。
# 自定义训练循环
for epoch in range(5): # 训练5轮
for step, (images, labels) in enumerate(train_dataset):
with tf.GradientTape() as tape:
predictions = model(images, training=True)
loss = tf.losses.sparse_categorical_crossentropy(labels, predictions)
# 计算梯度并更新模型参数
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
5、TensorFlow 2.x 高级功能
5、1 TensorFlow Dataset(数据管道)
tf.data API 用于构建高效的数据管道,尤其是在处理大规模数据时。可以创建自定义的数据集、批处理和预处理操作。
# 加载数据集并进行预处理
train_dataset = tf.data.Dataset.from_tensor_slices((train_images, train_labels))
train_dataset = train_dataset.shuffle(10000).batch(64)
# 迭代数据
for images, labels in train_dataset:
print(images.shape, labels.shape)
tf.data.Dataset.from_tensor_slices((train_images, train_labels)):函数将训练图像和标签转换为一个 tf.data.Dataset 对象。train_images 是一个包含训练图像的张量,train_labels 是对应的标签这个方法会将每个图像和其对应的标签配对,形成一个数据集。
train_dataset.shuffle(10000):这个方法用于随机打乱数据集中的样本,以提高模型的泛化能力。参数 10000 指定了缓冲区的大小,表示在打乱时会随机选择最多10000个样本进行打乱。这个值可以根据你的数据集大小进行调整。
batch(64):这个方法将数据集分成多个批次,每个批次包含64个样本。在训练过程中,模型会一次处理一个批次的数据,这样可以提高训练效率并减少内存占用。
5、2 TensorFlow Serving
TensorFlow Serving 是一个为生产环境提供的高效部署服务,它可以帮助你在服务器端进行实时的模型推理。你可以通过 TensorFlow Serving 部署训练好的模型,并通过 API 进行访问。
# 启动 TensorFlow Serving
docker run -p 8501:8501 --name=tf_serving_mnist \
--mount type=bind,source=/path/to/saved_model,destination=/models/mnist \
-e MODEL_NAME=mnist -t tensorflow/serving
5、3 TensorFlow Lite(模型优化和部署)
TensorFlow Lite 允许将训练好的模型转换为适用于移动设备和边缘设备的格式。通过量化和剪枝等技术,TensorFlow Lite 可以显著减少模型的大小和计算需求。
# 使用 TensorFlow Lite 转换模型
tflite_convert --saved_model_dir=/path/to/saved_model --output_file=model.tflite
总结
TensorFlow 2.x 是一个功能强大且灵活的深度学习框架,它集成了许多先进的功能,如 Keras、高效的数据处理 API(tf.data)、Eager Execution 和自动化的模型优化工具。通过简洁的 API 和强大的性能,TensorFlow 2.x 成为深度学习开发人员的首选框架之一。