目录
TensorFlow 2.x基础
1、安装 TensorFlow 2.x
2、TensorFlow 2.x 基础概念
2、1 Eager Execution
2、2 TensorFlow 张量(Tensor)
3、使用Keras构建神经网络模型
3、1 构建 Sequential 模型
3、2 编译模型
1、Optimizer(优化器)
2、Loss(损失函数)
3、Metrics(评估指标)
3、3 训练模型
3、4 评估模型
3、5 预测
4、使用 TensorFlow 2.x 实现自定义训练循环
5、TensorFlow 2.x 高级功能
5、1 TensorFlow Dataset(数据管道)
5、2 TensorFlow Serving
5、3 TensorFlow Lite(模型优化和部署)
总结
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 成为深度学习开发人员的首选框架之一。