59、TensorFlow 2与数据可视化入门

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[模型应用]

列表总结关键知识点

  1. TensorFlow 2 tf.data.Dataset
    • 基本概念:区分“数据集”和 TF 2 Dataset。
    • 创建数据管道:使用 from_tensors() from_tensor_slices() 等方法。
    • 处理步骤:创建或导入数据、定义生成器、消费数据。
    • Lambda 表达式和生成器的使用。
  2. 数据可视化
    • 工具:Matplotlib、Seaborn、Sklearn 等。
    • 类型:条形图、折线图、散点图等。
    • 示例代码:包括绘制水平线、散点图、直方图、箱线图等。

通过掌握这些知识和技能,我们可以更高效地处理和分析数据,为机器学习和深度学习项目打下坚实的基础。

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑用户体验的优化,从而提升整体开发效率软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值