【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 互相转换的规则, 以及标量张量与数值之间的转换规则。

相关推荐
fanstuck2 分钟前
2025MCM美国大学生数学建模竞赛B题-可持续旅游管理思路详解+建模论文+源代码
人工智能·python·数学建模·数据挖掘·美赛
智能汽车人6 分钟前
自动驾驶---苏箐对智驾产品的思考
人工智能·机器学习·自动驾驶
艺杯羹8 分钟前
二级C语言题解:统计奇偶个数以及和与差、拼接字符串中数字并计算差值、提取字符串数组中单词尾部字母
c语言·数据结构·算法
艺杯羹8 分钟前
二级C语言题解:孤独数、找最长子串、返回两数组交集
c语言·开发语言·数据结构·算法
比特在路上11 分钟前
ListOJ13:环形链表(判断是否为环形链表)
c语言·开发语言·数据结构·链表
LuiChun13 分钟前
Django-Admin WebView 集成项目技术规范文档 v2.1
后端·python·django
xianwu54324 分钟前
反向代理模块。。
开发语言·网络·数据库·c++·mysql
Winston-Tao25 分钟前
skynet 源码阅读 -- 「揭秘 Skynet 网络通讯」
c语言·网络编程·epoll·skynet
Wyyyyy_m32 分钟前
2025寒假训练——天梯赛训练(1)
c++·算法
Chatopera 研发团队41 分钟前
Tensor 基本操作5 device 管理,使用 GPU 设备 | PyTorch 深度学习实战
人工智能·pytorch·深度学习