【PyTorch】3.张量类型转换

个人主页:Icomi

在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术,能够处理复杂的数据模式。通过 PyTorch,我们可以轻松搭建各类神经网络模型,实现从基础到高级的人工智能应用。接下来,就让我们一同走进 PyTorch 的世界,探索神经网络与人工智能的奥秘。本系列为PyTorch入门文章,若各位大佬想持续跟进,欢迎与我交流互关。

大家好我是一颗米,我们已经了解了张量在 PyTorch 中的核心地位,也知道了它在 CPU 和 GPU 上的运算方式,这些都是搭建我们深度学习知识大厦的重要基石。但这座大厦要盖得又高又稳,还需要更多的 "砖块",接下来我们就来学习其中非常关键的一块 ------ 张量的类型转换。

在实际的深度学习项目中,我们会从各种不同的数据源获取数据,这些数据可能最初是以不同的形式存在的。而我们之前学过,在 PyTorch 里计算数据基本都是以张量形式,所以就经常需要进行数据类型的转换。其中,将 numpy 数组和 PyTorch Tensor 相互转化,就是最常使用的一种操作,这也是大家必须掌握的知识点。

numpy 在 Python 的数据处理领域应用非常广泛,很多经典的数据集和算法库都与 numpy 紧密相关。当我们从这些地方获取数据后,往往就需要把 numpy 数组转化为 PyTorch Tensor,才能在 PyTorch 的深度学习模型中进行运算。反之,当我们在 PyTorch 模型中完成某些计算,需要使用一些 numpy 强大的数据分析和处理工具时,又得把 Tensor 转换回 numpy 数组。

这一节,我们主要就来学习如何在 numpy 数组和 PyTorch Tensor 之间自由 "穿梭",掌握这一关键技能,为我们后续的深度学习扫除障碍。

1. 张量转换为 numpy 数组

使用 Tensor.numpy 函数可以将张量转换为 ndarray 数组,但是共享内存,可以使用 copy 函数避免共享。

python 复制代码
# 1. 将张量转换为 numpy 数组
def tensor_to_numpy():
    # 创建一个 PyTorch 张量
    tensor = torch.tensor([2, 3, 4])
    # 使用张量对象中的 numpy 函数进行转换
    numpy_array = tensor.numpy()

    print(type(tensor))
    print(type(numpy_array))

    # 注意: tensor 和 numpy_array 共享内存
    # 修改其中的一个,另外一个也会发生改变
    # tensor[0] = 100
    numpy_array[0] = 100

    print(tensor)
    print(numpy_array)


# 2. 对象拷贝避免共享内存
def tensor_to_numpy_with_copy():
    # 创建一个 PyTorch 张量
    tensor = torch.tensor([2, 3, 4])
    # 使用张量对象中的 numpy 函数进行转换,先克隆张量避免共享内存
    numpy_array = tensor.clone().numpy()

    print(type(tensor))
    print(type(numpy_array))

    # 修改 numpy 数组,不会影响原张量
    numpy_array[0] = 100

    print(tensor)
    print(numpy_array)


if __name__ == "__main__":
    tensor_to_numpy()
    tensor_to_numpy_with_copy()

2. numpy 转换为张量

  1. 使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享。
  2. 使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存。
python 复制代码
# 1. 使用 from_numpy 函数
def test01():

    data_numpy = np.array([2, 3, 4])
    # 将 numpy 数组转换为张量类型
    # 1. from_numpy
    # 2. torch.tensor(ndarray)

    # 浅拷贝
    data_tensor = torch.from_numpy(data_numpy)

    # nunpy 和 tensor 共享内存
    # data_numpy[0] = 100
    data_tensor[0] = 100

    print(data_tensor)
    print(data_numpy)


# 2. 使用 torch.tensor 函数
def test02():

    data_numpy = np.array([2, 3, 4])

    data_tensor = torch.tensor(data_numpy)

    # nunpy 和 tensor 不共享内存
    # data_numpy[0] = 100
    data_tensor[0] = 100

    print(data_tensor)
    print(data_numpy)

3. 标量张量和数字的转换

对于只有一个元素的张量,使用 item 方法将该值从张量中提取出来。

python 复制代码
# 3. 标量张量和数字的转换
def test03():

    # 当张量只包含一个元素时, 可以通过 item 函数提取出该值
    data = torch.tensor([30,])
    print(data.item())

    data = torch.tensor(30)
    print(data.item())


if __name__ == '__main__':
    test03()

4.总结

本节内容比较简单, 我们主要学习了 numpy 和 tensor 互相转换的规则, 以及标量张量与数值之间的转换规则。

相关推荐
SweetCode几秒前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
Xiaok101812 分钟前
解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案
开发语言·神经网络·php
程序员Linc13 分钟前
写给新人的深度学习扫盲贴:向量与矩阵
人工智能·深度学习·矩阵·向量
CryptoPP13 分钟前
springboot 对接马来西亚数据源API等多个国家的数据源
spring boot·后端·python·金融·区块链
xcLeigh21 分钟前
OpenCV从零开始:30天掌握图像处理基础
图像处理·人工智能·python·opencv
大乔乔布斯21 分钟前
AttributeError: module ‘smtplib‘ has no attribute ‘SMTP_SSL‘ 解决方法
python·bash·ssl
果冻人工智能24 分钟前
如何有效应对 RAG 中的复杂查询?
人工智能
小郝 小郝26 分钟前
【C语言】strstr查找字符串函数
c语言·开发语言
Zhichao_9732 分钟前
【UE5 C++课程系列笔记】33——商业化Json读写
c++·ue5
2305_7978820933 分钟前
AI识图小程序的功能框架设计
人工智能·微信小程序·小程序