PyTorch中torch.tensor与torch.Tensor的区别详解

PyTorch中torch.tensor与torch.Tensor的区别详解

在PyTorch中,有两种不同的Tensor类型,它们分别是torch.tensortorch.Tensor。这两种Tensor类型总体而言非常相似,用法也十分相似,但在细节与某些用法上有些许差别。本文将对这两种Tensor进行详细的区别与说明,帮助大家更好的理解和使用它们。

1. torch.tensortorch.Tensor的定义与用法

1.1 定义

首先我们来看这两种Tensor的定义:

  • torch.tensor: torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)
  • torch.Tensor: Class torch.Tensor([data, dtype, device, requires_grad])

我们可以看到,torch.tensor是一个函数,它接收一些数据,并返回一个对应的tensor;而torch.Tensor则是一个类(Class),返回一个新的Tensor实例,实例的属性和方法与普通的Python类实例一样。

1.2 用法

我们来看看这两种Tensor的用法:

import torch

a = torch.Tensor(3, 5)     # 创建一个3x5的未初始化的torch.Tensor
b = torch.tensor([[1, 2], [3, 4]])   # 创建一个2x2的tensor,并从Python List中初始化

从上面的例子中我们可以看到:使用torch.Tensor创建的Tensor可以设定其形状,但tensor内部的数据并不会被初始化,需要手动填充数据;而使用torch.tensor创建的Tensor则可以直接从Python List等数据类型中自动初始化。

除了上述例子中的初始化方式,还可以通过其他方式初始化Tensor,例如:

x = torch.randn((3,3), requires_grad=True)   # 从随机分布初始化
y = torch.zeros((2,2))   # 全0的Tensor
z = torch.ones((4,4))    # 全1的Tensor

不管是哪种初始化方式,torch.tensortorch.Tensor的用法都非常相似,每种方式都拥有两种不同的创建方式。

2. torch.tensortorch.Tensor的区别

在大多数情况下,torch.tensortorch.Tensor的区别并不大,它们可以互换使用。然而,在一些细节和某些特殊场景下,它们还是有一些差别的。以下将列举一些这样的情况:

2.1 首字母大小写

首先,我们可以看到torch.Tensor的首字母是大写的,而torch.tensor的首字母是小写的。这并不仅仅是大小写的不同,同时它也意味着这两种Tensor在Python中的本质区别:

  • torch.Tensor是一个Python类,而torch.tensor仅是一个函数的名称。
  • torch.tensor函数返回的是torch.Tensor的实例。

因此,在创建Tensor时需要注意使用大写和小写方式。

2.2 多维度数据

在多维度Tensor的初始化中,两种Tensor的行为有些差异。

例如,使用torch.tensor初始化时,你需要保证每一个元素都是相同的数据类型。如果你提供了不同类型的数据,torch.tensor会强制把它们转换为相同类型的数据:

x = torch.tensor([[1, 2], [3.0, 4]])    # 注意这里是浮点数3.0而不是整数3

在上面的例子中,原本的输入应该是一个int Tensor,但因为输入中混入了一个浮点数,在转换时Tensor会自动将整个Tensor转换为浮点类型的Tensor。

而对于torch.Tensor来说,它可以接受并分别处理不同类型的数据:

y = torch.Tensor([[1, 2], [3.0, 4]])     # 同样的输入,但不会报错

在Tensor初始化时对于数据类型的处理,在两种Tensor中是不同的,这也是两种Tensor的差异之一。

2.3 其他差异

除了上述两种场景外,两种Tensor之间的差异并不多,值得注意的是,它们拥有相同的属性和方法,例如对Tensor进行形变的方法:

x = torch.rand(5, 4)
y = torch.Tensor.view(x, 1, 20)

在上面的代码中,我们使用torch.Tensor.view来对一个Tensor进行形变操作。需要注意的是,在这个view方法中, 形参x120均为torch.Tensor的实例,也就是说tensor.view调用的是torch.Tensor实例的方法。

3. 示例说明

接下来,我们通过两个Tensor初始化的示例来展示torch.tensortorch.Tensor之间的区别。

3.1 示例1

import torch
import numpy as np

a = np.ones(3)
b = torch.Tensor(a)
c = torch.tensor(a)

print(a, "\n", b, "\n", c)

在上面的代码中,我们创建了一个长度为3、元素全为1的numpy数组$a$,然后分别使用torch.Tensortorch.tensor来初始化Tensor $b$ 和 $c$。输出结果为:

[1. 1. 1.] 
 tensor([1., 1., 1.]) 
 tensor([1., 1., 1.], dtype=torch.float64)

可以看到,$b$ 和 $c$ 的数据完全相同,但是 $c$ 的数据类型为浮点类型(dtype=torch.float64)。也就是说,在使用torch.tensor时,输入数组的数据类型如果不为浮点类型,则会自动转换为浮点类型。而使用torch.Tensor初始化时,并没有进行类似的操作。

3.2 示例2

import torch
import numpy as np

a = np.ones(3)
b = torch.Tensor(a)
c = torch.tensor(a)

a[0] = 2

print(a, "\n", b, "\n", c)

在上面的代码中,我们创建了一个长度为3、元素全为1的numpy数组$a$,然后分别使用torch.Tensortorch.tensor来初始化Tensor $b$ 和 $c$。接下来,我们修改了$a$的第一个元素为2。输出结果为:

[2. 1. 1.] 
 tensor([1., 1., 1.]) 
 tensor([1., 1., 1.], dtype=torch.float64)

可以看到,在修改$a$的元素后,仅有使用torch.Tensor初始化的Tensor $b$ 的数据没有发生变化,而使用torch.tensor初始化的Tensor $c$ 的数据仍然与原始数组$a$相同。

4. 总结

在本文中,我们介绍了PyTorch中torch.tensortorch.Tensor这两种Tensor类型的定义和用法,并对其差异进行了详细的讲解。同时,我们还给出了两个示例进行了示范,在使用这两种Tensor类型时需要特别注意两种Tensor在多维度初始化和数据类型处理上的差异。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch中torch.tensor与torch.Tensor的区别详解 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python中使用第三方库xlrd来读取Excel示例

    下面我为您讲解“Python中使用第三方库xlrd来读取Excel示例”的完整实例教程。 一、xlrd库简介 xlrd是一个Python模块,用于从Excel文件读取数据。它可以读取Excel文件,其中可能包含多个工作表。使用xlrd可以读取单元格数据、格式、公式和一些其他属性。 二、xlrd库的安装 在使用xlrd库之前,需要先安装它。可以使用pip命令进…

    python 2023年5月13日
    00
  • Python 从文件中读取字符串,保留要打印的变量

    【问题标题】:Python read strings from file, preserving variables to be printedPython 从文件中读取字符串,保留要打印的变量 【发布时间】:2023-04-04 02:46:02 【问题描述】: 我正在制作一个 Python 脚本,它将从列表中随机选择一个响应。 为了填充这个列表,我想从文…

    Python开发 2023年4月6日
    00
  • Python 使用实数参数计数

    使用Python实数参数计数主要可以使用Python内置函数range(),该函数可以生成一个整数序列。range函数可以使用三种参数,分别是起始值、终止值和步长。其中起始值和步长参数是可选的。如果只传入一个参数,则默认起始值为0,步长为1。 下面是Python使用实数参数的计数使用方法的完整攻略: 1.使用实数参数计数的基础语法 range(start, …

    python-answer 2023年3月25日
    00
  • Python 2.7 发布,并从网站获取结果

    【问题标题】:Python 2.7 posting, and getting result from web sitePython 2.7 发布,并从网站获取结果 【发布时间】:2023-04-06 05:29:01 【问题描述】: 提前感谢您的帮助。我正在尝试编写一个 python 脚本,将 IP 地址发布到下面引用的站点,并在终端或文件中打印出结果,然后…

    Python开发 2023年4月7日
    00
  • python beautiful soup库入门安装教程

    Python BeautifulSoup库入门安装教程 BeautifulSoup是Python中一个非常流行的HTML和XML解析库,可以帮助我们更方便地解析网页。本文将介绍如何安装BeautifulSoup,并提供两个示例。 安装BeautifulSoup 在使用BeautifulSoup之前,需要安装它。以下是一个示例代码,演示如何使用pip安装Bea…

    python 2023年5月15日
    00
  • Python简单计算文件夹大小的方法

    本文将介绍如何使用Python对文件夹大小进行简单计算。该方法适用于文件保存在本地硬盘中。 步骤一:导入模块 首先,我们需要导入Python中的 os 模块。该模块提供了许多函数,可以获取文件系统的相关信息。 import os 步骤二:定义计算文件夹大小的函数 接下来,我们定义一个用于计算文件夹大小的函数 get_folder_size。该函数使用深度优先…

    python 2023年6月3日
    00
  • Python 第三方库 Pandas 数据分析教程

    Pandas是一个用于数据分析和处理的强大Python第三方库。本教程将介绍Pandas的使用方法,以便您可以开始使用Pandas进行数据分析和处理工作。下面是一个完整实例教程,包括两个示例。 选择适当的数据结构 在使用Pandas进行数据分析和处理之前,需要选择适当的数据结构。Pandas提供了两种主要的数据结构:Series和DataFrame。 Ser…

    python 2023年5月13日
    00
  • Jacobi迭代算法的Python实现详解

    Jacobi迭代算法的Python实现详解 算法原理 Jacobi迭代算法是一种常用的线性方程组求解方法,它可以用于求解如$Ax=b$的线性方程组,其中$A$是系数矩阵,$b$是常数向量。Jacobi迭代算法的实现过程如下: 将系数矩阵$A$分解为对角矩阵$D$、上三角矩阵$U$和下三角矩阵$L$,即$A=D+U+L$。 将线性方程组$Ax=b$转化为$Dx…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部