《TensorFlow深度学习入门与实践》
1. 深度学习与人工神经网络
深度学习利用被称为人工神经网络的基本结构来模拟人类大脑的功能,尤其是在信息处理方面。人工神经网络由神经元层构成,第一层处理输入信号,然后将其传递给下一层,依此类推,直到得出最终结果。在每一层,输入信息以特定方式处理,生成同一信息的不同层次表示。整个过程实际上就是将信息转换到更抽象的层次,这与大脑皮层的工作方式类似。例如,眼睛接收到图像后,图像信号会经过多个处理阶段,先检测图形的轮廓,再识别几何形状,最后识别物体的性质并命名,实现了从图像到线条、几何图形再到文字的概念转换。
2. TensorFlow框架概述
TensorFlow是由谷歌大脑团队开发的库,旨在为机器学习和深度学习研究提供优秀工具。2017年2月谷歌发布了TensorFlow的第一个版本,在一年半的时间里进行了多次更新,其潜力、稳定性和可用性都得到了极大提升。目前,TensorFlow已成为一个成熟的深度学习框架,互联网上有丰富的文档、教程和项目。除了主包之外,还有许多相关库:
- TensorBoard:可用于可视化TensorFlow的内部图(https://github.com/tensorflow/tensorboard)。
- TensorFlow Fold:能生成漂亮的动态计算图(https://github.com/tensorflow/fold)。
- TensorFlow Transform:用于创建和管理输入数据管道(https://github.com/tensorflow/transform)。
TensorFlow基于图的结构和数据在图中的流动进行数学计算。其运行时系统内部创建的图称为数据流图,它会根据要执行的计算所基于的数学模型在运行时进行结构化。通过代码中的一系列指令,TensorFlow可以将任何数学模型转换为内部的数据流图。当对深度学习神经网络进行建模时,它会被转换为数据流图。由于神经网络的结构与图的数学表示非常相似,所以这个库非常适合开发深度学习项目。此外,TensorFlow不仅限于深度学习,还可用于表示人工神经网络,也能实现许多其他的计算和分析方法,可用于研究复杂物理系统等。数据流图的节点代表数学运算,边代表张量(多维数据数组),TensorFlow这个名字就源于这些张量在图中代表的数据流动,可用于对人工神经网络进行建模。
3. TensorFlow版本差异与安装
3.1 TensorFlow 2.x与TensorFlow 1.x的差异
自2019年引入TensorFlow 2.x版本后,相关的文本和示例代码都进行了重写。TensorFlow 1.x版本中的许多模块被移除或移动,Keras被完全整合为神经网络管理模块,因此之前的编程机制和范例大多不再兼容。不过,为了让之前用TensorFlow 1.x开发的大量程序继续可用,谷歌提供了一种方法。只需在代码开头将经典的导入语句:
import tensorflow as tf
替换为:
import tensorflow.compat.v1 as tf
这样在大多数情况下,即使使用的是TensorFlow 2.x版本,也能保证TensorFlow 1.x开发的代码完美执行。对于新的深度学习项目,建议使用TensorFlow 2.x范式。
3.2 安装TensorFlow
在开始工作之前,需要在计算机上安装TensorFlow库。如果已经安装了该库,可以通过以下代码查看版本:
import tensorflow as tf
tf.__version__
如果是1.x版本,建议创建一个新的虚拟环境来安装2.x版本,以避免影响系统中已安装模块的配置。如果系统中没有安装该库,可以通过以下方式安装:
- 使用Anaconda平台:可以通过Anaconda Navigator图形界面安装TensorFlow包,也可以在命令行输入:
conda install tensorflow
- 使用PyPI:
pip install tensorflow
需要注意的是,在使用Anaconda时,基于Python 3.10和3.11的虚拟环境可能会出现TensorFlow与其他库不兼容的问题,可创建Python 3.9的虚拟环境来避免。
4. 使用Jupyter Notebook编程
安装TensorFlow后,可以开始使用该库进行编程。本章的示例使用Jupyter Notebook,但也可以通过普通的Python会话进行。由于TensorFlow的最新版本对资源的需求越来越大,如果不采取适当的预防措施,使用IPython和Jupyter Notebook进行深度学习可能会出现问题。因此,在开始工作之前,需要在Notebook的第一个单元格(在IPython中也一样)添加以下代码:
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
这样可以避免因OpenMP API创建另一个实例而导致Jupyter Notebook崩溃的问题。
5. 张量的定义与操作
5.1 张量的基本概念
TensorFlow库的基本元素是张量,数据流图中流动的数据就是张量。张量由三个参数标识:
- rank:张量的维度(矩阵的rank为2,向量的rank为1)。
- shape:行数和列数(例如,(3, 3)表示3x3的矩阵)。
- type:张量元素的类型。
张量实际上就是多维数组,可以使用NumPy库轻松创建。例如:
import numpy as np
t = np.arange(9).reshape((3,3))
print(t)
输出:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
通过
tf.convert_to_tensor()
函数可以将多维数组转换为TensorFlow张量:
import tensorflow as tf
tensor = tf.convert_to_tensor(t)
print(tensor)
输出:
<tf.Tensor: shape=(3, 3), dtype=int64, numpy=
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])>
在转换过程中,还可以通过指定
dtype
参数来更改数据类型:
tensor2 = tf.convert_to_tensor(t, dtype='float64')
print(tensor2)
输出:
<tf.Tensor: shape=(3, 3), dtype=float64, numpy=
array([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])>
除了使用NumPy数组转换,还可以直接使用TensorFlow创建张量。例如:
- 创建全0张量:
t0 = tf.zeros((3,3),'float64')
print(t0)
输出:
<tf.Tensor: shape=(3, 3), dtype=float64, numpy=
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])>
- 创建全1张量:
t1 = tf.ones((3,3),'float64')
print(t1)
输出:
<tf.Tensor: shape=(3, 3), dtype=float64, numpy=
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])>
- 创建包含均匀分布随机值的张量:
trand = tf.random.uniform((3, 3), minval=0, maxval=1, dtype=tf.float32)
print(trand)
- 创建包含正态分布随机值的张量:
tnorm = tf.random.normal((3, 3), mean=0, stddev=3)
print(tnorm)
5.2 从pandas DataFrame加载数据到张量
在数据分析中,更常见的操作是将DataFrame中的数据加载到张量中。可以使用
tf.convert_to_tensor()
函数来实现。首先导入pandas库并创建一个简单的DataFrame:
import pandas as pd
df = pd.DataFrame(np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]),
columns=['a', 'b', 'c'])
print(df)
将整个DataFrame转换为张量:
tensor_df = tf.convert_to_tensor(df)
print(tensor_df)
通常只需要加载DataFrame中一个或多个列的值,可进行如下操作:
tensor_df = tf.convert_to_tensor(df[['a','b']])
print(tensor_df)
5.3 从CSV文件加载数据到张量
使用pandas库可以将CSV文件中的数据加载到DataFrame中,然后再转换为张量。例如,加载
training_data.csv
文件中的数据:
df = pd.read_csv('training_data.csv')
print(df)
该训练数据集包含三列,前两列表示笛卡尔平面上点的X、Y坐标,第三列包含标签。需要从DataFrame中提取特征和标签两个不同的张量:
df_features = df.copy()
df_labels = df_features.pop('label')
data_features = tf.convert_to_tensor(df_features)
data_labels = tf.convert_to_tensor(df_labels)
print(data_features)
print(data_labels)
5.4 张量的操作
定义两个张量
t1
和
t2
,并进行加法和乘法操作:
t1 = tf.random.uniform((3, 3), minval=0, maxval=1, dtype=tf.float32)
t2 = tf.random.uniform((3, 3), minval=0, maxval=1, dtype=tf.float32)
sum = tf.add(t1,t2)
mul = tf.matmul(t1,t2)
print(sum)
print(mul)
还可以计算张量的行列式:
det = tf.linalg.det(t1)
print(det)
TensorFlow 2.x中引入的
tf.linalg
模块包含许多矩阵代数运算,可用于张量计算。
6. 用TensorFlow开发深度学习模型的步骤
使用TensorFlow 2.x开发深度学习模型并进行训练和测试的基本步骤如下:
1. 定义张量(训练集和测试集)
2. 模型构建
3. 模型编译
4. 模型训练
5. 模型测试
6. 进行预测
前面已经介绍了如何从训练和测试数据集中准备张量,接下来将介绍模型构建。在构建基于神经网络的模型时,需要定义层的配置。使用TensorFlow 2.x时,不需要定义每个神经元和网络中的单个连接,可以使用Keras中预定义的层。例如:(此处原文档未给出具体示例,后续可根据实际情况补充)
以下是一个简单的mermaid流程图,展示了用TensorFlow开发深度学习模型的主要步骤:
graph LR
A[定义张量] --> B[模型构建]
B --> C[模型编译]
C --> D[模型训练]
D --> E[模型测试]
E --> F[进行预测]
通过以上步骤和操作,我们可以利用TensorFlow库进行深度学习模型的开发和训练,充分发挥其在数据处理和模型构建方面的优势。在实际应用中,还需要根据具体的问题和数据集进行适当的调整和优化。
《TensorFlow深度学习入门与实践》
7. 模型构建详解
在使用TensorFlow 2.x构建基于神经网络的模型时,利用Keras预定义的层能极大简化开发过程。下面通过一个简单的全连接神经网络示例来详细说明。
import tensorflow as tf
from tensorflow.keras import layers, models
# 构建一个简单的全连接神经网络模型
model = models.Sequential([
layers.Dense(64, activation='relu', input_shape=(2,)), # 输入层到第一个隐藏层,64个神经元,使用ReLU激活函数
layers.Dense(32, activation='relu'), # 第二个隐藏层,32个神经元,使用ReLU激活函数
layers.Dense(1, activation='sigmoid') # 输出层,1个神经元,使用Sigmoid激活函数用于二分类问题
])
# 打印模型结构
model.summary()
在上述代码中,我们使用
Sequential
模型依次堆叠各层。
Dense
层是全连接层,
input_shape
参数指定了输入数据的形状。激活函数的选择对于模型的性能至关重要,ReLU函数在隐藏层中能有效缓解梯度消失问题,Sigmoid函数常用于二分类问题的输出层。
8. 模型编译
模型构建完成后,需要对其进行编译,指定损失函数、优化器和评估指标。
# 编译模型
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
-
优化器
:这里选择了
adam优化器,它结合了Adagrad和RMSProp的优点,能自适应调整学习率,在大多数情况下都有较好的表现。 -
损失函数
:对于二分类问题,
binary_crossentropy是常用的损失函数,它衡量了模型预测的概率分布与真实标签之间的差异。 -
评估指标
:使用
accuracy作为评估指标,即模型预测正确的样本占总样本的比例。
9. 模型训练
模型编译完成后,就可以使用训练数据对其进行训练。
# 假设我们已经有了训练特征和标签
# data_features 和 data_labels 是之前从CSV文件中提取的张量
history = model.fit(data_features, data_labels,
epochs=100, # 训练的轮数,即整个数据集被训练的次数
batch_size=32, # 每次训练使用的样本数量
validation_split=0.2) # 划分20%的数据作为验证集
在训练过程中,
fit
方法会返回一个
history
对象,其中包含了训练过程中的损失值和评估指标的变化情况。通过观察这些指标,我们可以判断模型是否过拟合或欠拟合。
10. 模型测试
训练完成后,需要使用测试数据对模型进行评估,以检验模型在未见过的数据上的性能。
# 假设我们有测试特征和标签
test_features = ...
test_labels = ...
# 评估模型
test_loss, test_acc = model.evaluate(test_features, test_labels)
print(f"Test accuracy: {test_acc}")
11. 进行预测
模型通过测试后,就可以使用它对新的数据进行预测。
# 假设我们有新的数据需要预测
new_data = ...
# 进行预测
predictions = model.predict(new_data)
print(predictions)
12. 总结与注意事项
通过以上步骤,我们完成了一个完整的深度学习模型的开发、训练、测试和预测过程。在实际应用中,还需要注意以下几点:
- 数据预处理 :在将数据输入模型之前,通常需要进行归一化、标准化等预处理操作,以提高模型的训练效果。
- 超参数调整 :模型的性能很大程度上取决于超参数的选择,如学习率、神经元数量、训练轮数等。可以使用网格搜索、随机搜索等方法来寻找最优的超参数组合。
- 模型保存与加载 :训练好的模型可以保存到磁盘上,以便后续使用。
# 保存模型
model.save('my_model.h5')
# 加载模型
loaded_model = tf.keras.models.load_model('my_model.h5')
以下是一个表格总结TensorFlow开发深度学习模型的关键步骤及相关代码:
|步骤|操作|代码示例|
| ---- | ---- | ---- |
|定义张量|从不同数据源加载数据并转换为张量|
data_features = tf.convert_to_tensor(df_features)
|
|模型构建|使用Keras预定义层构建神经网络模型|
model = models.Sequential([layers.Dense(...)])
|
|模型编译|指定损失函数、优化器和评估指标|
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
|
|模型训练|使用训练数据对模型进行训练|
model.fit(data_features, data_labels, epochs=100, batch_size=32, validation_split=0.2)
|
|模型测试|使用测试数据评估模型性能|
test_loss, test_acc = model.evaluate(test_features, test_labels)
|
|进行预测|对新的数据进行预测|
predictions = model.predict(new_data)
|
以下是一个更详细的mermaid流程图,展示了从数据准备到模型预测的完整过程:
graph LR
A[数据准备] --> B[定义张量]
B --> C[模型构建]
C --> D[模型编译]
D --> E[模型训练]
E --> F{训练是否完成}
F -- 否 --> E
F -- 是 --> G[模型测试]
G --> H{测试结果是否满意}
H -- 否 --> I[调整超参数]
I --> C
H -- 是 --> J[进行预测]
通过深入理解和掌握TensorFlow的使用方法,我们可以利用其强大的功能开发出高效、准确的深度学习模型,解决各种实际问题。
超级会员免费看
281

被折叠的 条评论
为什么被折叠?



