【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 函数避免共享。
# 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 转换为张量
- 使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享。
- 使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存。
# 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 方法将该值从张量中提取出来。
# 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 互相转换的规则, 以及标量张量与数值之间的转换规则。