【AI 和机器学习】PyTorch BASIC 基础知识(节1):张量 Tensor
【AI 和机器学习】PyTorch BASIC 基础知识:节1
—— 张量 Tensor
前言
—— 哪个更适合初学者?
想要学习并掌握 AI,最直接的办法就是自己动手进行实操。有一些流行的来源可供练习 AI 技能,例如:
- Kaggle:一个托管各种数据集和机器学习竞赛的平台。
- UCI 机器学习存储库:用于机器学习研究的数据集集合。
- TensorFlow 教程:TensorFlow 团队提供的教程和示例。
- PyTorch 教程:PyTorch 团队提供的教程和示例。
其中PyTorch和TensorFlow的AI教程资源非常丰富。但对于初学者来说,哪个更合适,可能还得取决于您的特定目标(研究与生产)以及您的偏好等:
- PyTorch 因其简单、易读和易于调试而通常被认为更适合初学者。PyTorch 的动态特性使新手可以学习概念而不会被复杂的语法所困扰。
- TensorFlow 随着 TensorFlow 2.x 和 Keras 的推出变得更加适合初学者,但它仍可能对初学者构成挑战。
本文先选择PyTorch来和大家一起学习,学习它的一些基础内容。其中所有素材均取自其教程。对于每一节内容,我们都将先给出摘要,然后把译文稍作整理后附在后面,供参考。
目录
【续前文】
本节摘要
什么是张量?
- 定义:张量是类似于数组和矩阵的专用数据结构,在 PyTorch 中用于模型输入、输出和参数。
- 比较:它们类似于 NumPy 的 ndarrays,但可以在 GPU 上运行,从而实现高效的计算。
- 内存共享:张量和 NumPy 数组可以共享内存,从而最大限度地减少数据复制。
初始化张量
可以通过多种方式初始化张量:
- 来自数据:
- 来自 NumPy 数组:
- 来自另一个 Tensor:
- 使用随机或常量值:
张量属性
- 张量具有描述以下属性:Shape形状:张量的维度。Datatype数据类型:存储的数据类型。Device设备:张量的存储位置(CPU 或 GPU)。
张量操作
- 超过 100 种运算:包括算术、线性代数等。
- GPU 使用:可以使用 '.to()' 将张量移动到 GPU,从而提高计算速度。
- 索引和切片:类似于 NumPy,支持轻松进行数据操作。
- 连接张量:使用 'torch.cat()' 沿指定维度连接张量。
算术运算
- 矩阵乘法:
- 元素级乘法:
单元素张量
- 使用 '.item()' 转换为 Python 数值:
就地操作
- 直接修改张量的操作(例如,'tensor.add_(5)')可以节省内存,但会使导数计算复杂化。
使用 NumPy 桥接
- 共享内存:张量中的更改会反映在 NumPy 数组中,反之亦然。
张量是 PyTorch 中的强大工具,可提供灵活性、效率以及与 NumPy 的无缝集成来进行数值计算。
本节正文
张量是一种专门的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。
张量类似于 NumPy 的 ndarrays,不同之处在于张量可以在 GPU 或其他硬件加速器上运行。事实上,张量和 NumPy 数组通常可以共享相同的底层内存,无需复制数据(请参阅使用 NumPy 桥接)。张量还针对自动微分进行了优化(我们稍后将在 Autograd 自动微分部分看到更多相关信息)。如果您熟悉 ndarrays,那么您将熟悉 Tensor API。如果没有,请继续关注!
初始化张量
可以通过多种方式初始化张量。请看以下示例:
直接来自数据
可以直接从数据创建张量。数据类型是自动推断的。
来自 NumPy 数组
可以从 NumPy 数组创建张量(反之亦然 - 请参阅 Bridge with NumPy)。
来自另一个张量:
新张量保留参数张量的属性(形状、数据类型),除非显式覆盖。
输出:
使用随机值或常量值:
shape 是张量维度的元组。在下面的函数中,它确定输出张量的维数。
输出:
张量属性
张量属性描述其形状、数据类型和存储它们的设备。
输出:
张量操作
有100 多种张量运算,包括算术、线性代数、矩阵操作(转置、索引、切片)、采样等。
这些操作中的每一个都可以在 GPU 上运行(通常比在 CPU 上更高的速度)。如果您使用的是 Colab,请在 Runtime > Change runtime type > GPU 中分配 GPU。
默认情况下,张量是在 CPU 上创建的。我们需要使用 .to 方法将张量显式移动到 GPU(在检查 GPU 可用性之后)。请记住,跨设备复制大型张量在时间和内存方面可能很昂贵!
尝试列表中的一些操作。如果您熟悉 NumPy API,您会发现 Tensor API 使用起来轻而易举。
标准的类似 numpy 的索引和切片:
输出:
联接张量
您可以使用 torch.cat 沿给定维度连接一系列张量。另请参阅 torch.stack,这是另一个与 torch.cat 略有不同的张量连接运算符。
输出:
算术运算
输出:
单元素张量
如果你有一个单元素张量,例如通过将张量的所有值聚合为一个值,你可以使用 item() 将其转换为 Python 数值:
输出:
就地操作
将结果存储到操作数中的操作称为就地操作。它们由 _ 后缀表示。例如:x.copy_(y)、x.t_() 将更改 x。
输出:
注意
就地操作可以节省一些内存,但在计算导数时可能会出现问题,因为会立即丢失历史记录。因此,不鼓励使用它们。
使用 NumPy 桥接
CPU 和 NumPy 数组上的张量可以共享其底层内存位置,更改一个张量将更改另一个张量。
从 Tensor 到 NumPy 数组
输出:
张量的变化反映在 NumPy 数组中。
输出:
从 NumPy 数组到 Tensor
NumPy 数组中的更改反映在张量中。
输出:
【未完待续】
农历甲辰十月廿四
2024.11.24
【部分图片来源网络,侵删】