TensorFlow 2与数据可视化入门
一、TF 2 tf.data.Dataset 介绍
1.1 基本概念
在深入探讨之前,需要明确两个概念的区别。“数据集(dataset)”通常指包含多行数据的集合(常存储在平面文件中),其中列被称为“特征”,行代表数据集的一个“实例”。而 TF 2 Dataset 是 tf.data.Dataset 命名空间下的一个类,它就像一个“包装器”,包裹着包含多行数据的“常规”数据集。可以将 TF 2 Dataset 类比为 Pandas 数据框。如果你熟悉 Angular 中的 Observables,在学习 TF 2 Datasets 时可以进行快速的知识迁移。
TF 2 tf.data.Datasets 非常适合创建异步且优化的数据管道。简单来说,TF 2 Dataset API 可以从磁盘加载数据(包括图像和文本),应用优化的转换操作,创建批量数据,并将这些批量数据发送到 GPU。实际上,TF 2 Dataset API 有助于更好地利用 GPU。此外,在 TF 2.0 中使用 tf.functions 可以充分利用数据集的异步预取/流式传输功能。
1.2 创建数据管道
可以将数据集看作一个从数据源开始的管道,数据源可以是 NumPy 数组、内存中的张量或其他来源。创建数据管道的步骤如下:
1. 创建或导入数据 :根据数据源的不同,选择不同的方法创建数据集。
- 如果数据源涉及张量,使用 tf.data.Dataset.from_tensors() 来组合输入。
- 如果希望每个输入张量都有单独的行,则使用 tf.data.Dataset.from_tensor_slices() 。
- 如果输入数据以 TFRecord 格式存储在磁盘上(推荐方式),则构建 tf.data.TFRecordDataset 。
下面通过代码示例展示 from_tensors() 和 from_tensor_slices() 的区别:
import tensorflow as tf
# combine the input into one element => [[1, 2], [3, 4]]
t1 = tf.constant([[1, 2], [3, 4]])
ds1 = tf.data.Dataset.from_tensors(t1)
# a separate element for each item: [1, 2], [3, 4]
t2 = tf.constant([[1, 2], [3, 4]])
ds2 = tf.data.Dataset.from_tensor_slices(t2)
for item in ds1:
print("1item:", item)
print("--------------")
for item in ds2:
print("2item:", item)
输出结果:
1item: tf.Tensor(
[[1 2]
[3 4]], shape=(2, 2), dtype=int32)
--------------
2item: tf.Tensor([1 2], shape=(2,), dtype=int32)
2item: tf.Tensor([3 4], shape=(2,), dtype=int32)
TF 2 from_tensors() API 要求输入的维度兼容,否则会引发错误,例如:
# exception: ValueError: Dimensions 10 and 9 are not compatible
ds1 = tf.data.Dataset.from_tensor_slices(
(tf.random_uniform([10, 4]), tf.random_uniform([9])))
而 TF 2 from_tensor_slices() API 没有维度兼容性限制,以下代码可以正常工作:
ds2 = tf.data.Dataset.from_tensors(
(tf.random_uniform([10, 4]), tf.random_uniform([9])))
当使用列表时,这两个 API 也存在差异:
ds1 = tf.data.Dataset.from_tensor_slices(
[tf.random_uniform([2, 3]), tf.random_uniform([2, 3])])
ds2 = tf.data.Dataset.from_tensors(
[tf.random_uniform([2, 3]), tf.random_uniform([2, 3])])
print(ds1) # shapes: (2, 3)
print(ds2) # shapes: (2, 2, 3)
在上述代码中, TF 2 from_tensors() API 创建了一个形状为 (2, 2, 3) 的 3D 张量,而 TF 2 from_tensor_slices() API 合并输入张量,生成形状为 (2, 3) 的张量。
1.3 创建和处理 TF 2 Dataset 的步骤
创建和处理 TF 2 Dataset 可以按以下三个步骤进行:
1. 创建或导入数据 :可以使用多种方式从多个源填充 TF 2 Dataset。为简单起见,可以先使用初始化的 NumPy 数组数据创建 TF 2 Dataset 实例。
2. 定义生成器(Python 函数) :TF 2 在处理数据集时使用生成器,因为即时执行(TF 2 的默认执行模式)不支持迭代器。
3. 消费数据 :通过迭代数据集来访问其中的元素,在某些情况下,将这些元素提供给 TF 2 模型。
1.4 简单的 TF 2 tf.data.Dataset 示例
以下是一个从 NumPy 数组创建基本 TF 2 tf.data.Dataset 的示例:
import tensorflow as tf
import numpy as np
x = np.arange(0, 10)
# make a dataset from a numpy array
ds = tf.data.Dataset.from_tensor_slices(x)
这个示例只是简单地创建了一个基于 NumPy 数组的 TF 2 Dataset,没有产生任何输出。后续会看到更有意义的代码示例。
1.5 Lambda 表达式
Lambda 表达式是一种匿名函数,可用于定义局部函数,这些函数可以作为参数传递、作为函数调用的值返回,或用作一次性的函数定义。简单来说,lambda 表达式接受一个输入变量,并对该变量执行某种操作。例如:
# 给输入变量加 1
lambda x: x + 1
# 将输入参数的值翻倍
lambda x: 2 * x
在有效的 TF 2 代码片段中也可以定义 lambda 表达式,例如:
# ds 是一个在其他地方定义的 TF 2 Dataset
ds.map(lambda x: x + 1)
1.6 TF 2 中使用生成器
以下代码示例展示了如何使用 lambda 表达式将 TF 2 Dataset 中的元素加 1:
import tensorflow as tf
import numpy as np
x = np.arange(0, 10)
def gener():
for i in x:
yield (i + 1)
ds = tf.data.Dataset.from_generator(gener, (tf.int64))
# for value in ds.take(len(x)):
for value in ds:
print("1value:", value)
for value in ds.take(2 * len(x)):
print("2value:", value)
在这个示例中,变量 x 被初始化为包含从 0 到 9 的整数的 NumPy 数组。变量 ds 是一个 TF 2 Dataset,它由 Python 函数 gener() 创建,该函数返回输入值加 1 的结果。需要注意的是,TF 2 中的生成器每次被调用时只发出一个值。
二、数据可视化介绍
2.1 数据可视化的概念
数据可视化是指以图形方式呈现数据,如条形图、折线图、热力图等多种专业表示形式。大数据包含大量数据,利用数据可视化工具可以帮助做出更好的决策。好的数据可视化的关键作用是讲述一个有意义的故事,聚焦于数据集中的有用信息,同时其有效性体现在能否很好地传达数据集中可能存在的趋势。
2.2 数据可视化工具
有许多开源的数据可视化工具,以下是一些常见的工具:
| 工具名称 | 简介 |
| ---- | ---- |
| Matplotlib | 一个模仿 MatLab 的开源 Python 库,支持 NumPy、SciPy 等,是一个多平台库,基于 NumPy 数组构建。 |
| Seaborn | 构建在 Matplotlib 之上的一层,虽然没有 Matplotlib 的所有功能,但提供了更简单的 API 来绘制图表和图形。 |
| Bokeh | 用于创建交互式可视化的 Python 库。 |
| YellowBrick | 用于机器学习模型可视化的 Python 库。 |
| Tableau | 一款强大的商业数据可视化工具。 |
| D3.js | 基于 JavaScript 和 SVG 的数据可视化库。 |
在运行相关代码示例之前,需要确保在计算机上安装了以下 Sklearn 库(使用 pip3 安装):
pip3 install matplotlib
pip3 install seaborn
pip3 install bokeh
pip3 install yellowbrick
2.3 数据可视化类型
常见的数据可视化类型包括:
- 2D/3D 面积图
- 条形图
- 甘特图
- 热力图
- 直方图
- 极地区域图
- 散点图(2D 或 3D)
- 时间线
2.4 Matplotlib 简介
Matplotlib 是一个模仿 MatLab 的开源 Python 库,支持 NumPy、SciPy 等。它只支持 Python 3 版本,是一个基于 NumPy 数组的多平台库。可以使用 plt.style 指令指定图形的样式,例如指定经典样式:
import matplotlib.pyplot as plt
plt.style.use('classic')
以下是一个使用 pyplot 绘制基于欧拉常数 e 的负幂的平滑曲线的示例:
import matplotlib.pyplot as plt
import numpy as np
num_list = np.linspace(0, 10, 100)
exp_num_list = np.exp(-num_list)
plt.plot(num_list, exp_num_list)
plt.show()
2.5 Matplotlib 中绘制水平线
以下代码示例展示了如何使用 Matplotlib 绘制水平线:
import numpy as np
import matplotlib.pyplot as plt
# 顶线
x1 = np.linspace(-5, 5, num=200)
y1 = 4 + 0 * x1
# 中线
x2 = np.linspace(-5, 5, num=200)
y2 = 0 + 0 * x2
# 底线
x3 = np.linspace(-5, 5, num=200)
y3 = -3 + 0 * x3
plt.axis([-5, 5, -5, 5])
plt.plot(x1, y1)
plt.plot(x2, y2)
plt.plot(x3, y3)
plt.show()
这个示例使用 np.linspace() API 生成 200 个在 -5 到 5 之间均匀分布的数字作为水平轴的值,然后绘制三条水平线。
三、使用 Sklearn 进行数据可视化与机器学习基础
3.1 Sklearn 简介
Sklearn 是一个功能强大的 Python 库,支持多种机器学习算法,同时也具备可视化功能。对于机器学习新手来说,无需机器学习背景也能理解相关的 Python 代码示例。
3.2 Sklearn 结合可视化示例
以下通过示例展示如何结合 Sklearn 的内置数据集和 Matplotlib 进行简单的数据可视化。
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, :2] # 只取前两个特征
y = iris.target
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k')
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Iris Dataset - Sepal length vs Sepal width')
plt.show()
在这个示例中,我们加载了鸢尾花数据集,提取了前两个特征,并根据不同的类别对数据点进行着色,绘制了散点图。通过这个图可以直观地看到不同类别鸢尾花在萼片长度和宽度上的分布情况。
3.3 Sklearn 与数据预处理
Sklearn 还提供了丰富的数据预处理功能,例如标准化数据。以下是一个简单的示例:
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import numpy as np
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print("Original mean:", np.mean(X, axis=0))
print("Scaled mean:", np.mean(X_scaled, axis=0))
print("Original std:", np.std(X, axis=0))
print("Scaled std:", np.std(X_scaled, axis=0))
通过 StandardScaler 对数据进行标准化处理后,数据的均值接近 0,标准差接近 1,这有助于提高某些机器学习算法的性能。
四、使用 Seaborn 进行数据可视化
4.1 Seaborn 简介
Seaborn 是构建在 Matplotlib 之上的一层,它提供了更高级的统计图形接口,使得创建美观且信息丰富的可视化变得更加容易。虽然它没有 Matplotlib 的所有功能,但对于常见的统计可视化任务,Seaborn 提供了更简洁的 API。
4.2 Seaborn 绘制直方图和核密度估计图
以下是一个使用 Seaborn 绘制直方图和核密度估计图的示例:
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, 0] # 取第一个特征
# 绘制直方图和核密度估计图
sns.distplot(X, kde=True, hist=True)
plt.xlabel('Sepal length')
plt.ylabel('Density')
plt.title('Sepal length distribution')
plt.show()
这个示例中,我们使用 seaborn 的 distplot 函数绘制了鸢尾花数据集第一个特征(萼片长度)的直方图和核密度估计图,能够直观地看到数据的分布情况。
4.3 Seaborn 绘制箱线图
箱线图可以展示数据的四分位数、异常值等信息。以下是使用 Seaborn 绘制箱线图的示例:
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 绘制箱线图
sns.boxplot(x=y, y=X[:, 0])
plt.xlabel('Iris class')
plt.ylabel('Sepal length')
plt.title('Sepal length boxplot by Iris class')
plt.show()
通过这个箱线图,我们可以比较不同类别鸢尾花在萼片长度上的分布差异,包括中位数、上下四分位数以及是否存在异常值。
五、总结与展望
5.1 总结
本文介绍了 TensorFlow 2 的 tf.data.Dataset 相关知识,包括其基本概念、创建数据管道的方法、使用生成器和 Lambda 表达式处理数据集等内容。同时,还深入探讨了数据可视化,介绍了多种数据可视化工具(如 Matplotlib、Seaborn、Sklearn 等)及其使用方法,展示了不同类型的数据可视化示例,如水平线绘制、散点图、直方图、箱线图等。
5.2 展望
在实际应用中,我们可以将 TensorFlow 2 的数据处理能力与数据可视化相结合,更好地理解和分析数据,为机器学习和深度学习模型的训练和优化提供有力支持。例如,在训练模型之前,通过数据可视化可以发现数据中的异常值、分布特征等,从而进行更有效的数据预处理;在模型训练过程中,可以可视化损失函数的变化、模型的性能指标等,帮助我们调整模型参数。未来,随着数据量的不断增加和机器学习技术的不断发展,数据处理和可视化的重要性将更加凸显,我们可以进一步探索更多高级的数据处理和可视化技术,以应对更复杂的数据分析任务。
流程图:数据处理与可视化流程
graph LR
A[数据收集] --> B[数据预处理]
B --> C[数据可视化]
C --> D{分析结果}
D -->|有问题| B
D -->|没问题| E[模型训练]
E --> F[模型评估]
F -->|不满意| E
F -->|满意| G[模型应用]
列表总结关键知识点
- TensorFlow 2 tf.data.Dataset
- 基本概念:区分“数据集”和 TF 2 Dataset。
- 创建数据管道:使用
from_tensors()、from_tensor_slices()等方法。 - 处理步骤:创建或导入数据、定义生成器、消费数据。
- Lambda 表达式和生成器的使用。
- 数据可视化
- 工具:Matplotlib、Seaborn、Sklearn 等。
- 类型:条形图、折线图、散点图等。
- 示例代码:包括绘制水平线、散点图、直方图、箱线图等。
通过掌握这些知识和技能,我们可以更高效地处理和分析数据,为机器学习和深度学习项目打下坚实的基础。
超级会员免费看

7799

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



