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

yizhihongxing

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采用getopt解析命令行输入参数实例

    Python中解析命令行参数常用的库有argparse和getopt。本文将详细讲解如何使用getopt解析命令行输入参数的完整攻略。 安装getopt 在Python中,getopt是标准库中的一部分,因此无需额外安装,可以直接使用。 使用示例 例子一 下面是一个简单的示例,演示如何使用getopt来解析命令行参数。 import getopt impor…

    python 2023年6月3日
    00
  • 使用Python的Scrapy框架编写web爬虫的简单示例

    首先我们来介绍下Scrapy框架和web爬虫的概念。Scrapy是Python语言下的一个高级网络爬虫框架,用于快速、高效的定义可重用的爬取方法,从网站上收集数据。 接下来我们来讲解下如何使用Scrapy框架编写web爬虫的简单示例。 安装Scrapy框架 首先,我们需要安装Scrapy框架。在命令行中输入以下命令: pip install scrapy 若…

    python 2023年5月14日
    00
  • python 使用OpenCV进行简单的人像分割与合成

    下面我将详细讲解如何使用Python和OpenCV进行简单的人像分割与合成。 什么是OpenCV? OpenCV是一个开源的跨平台计算机视觉库,可用于开发实时图像处理、计算机视觉、人机交互、物体识别等应用。OpenCV支持多种编程语言,包括C++、Python和Java等。 人像分割 人像分割是指将一张图片中的人像从背景中分离出来。在OpenCV中,我们可以…

    python 2023年6月6日
    00
  • Python+OpenCV实现车牌字符分割和识别

    以下是“Python+OpenCV实现车牌字符分割和识别”的完整攻略以及两个示例说明。 一、背景概述 车牌字符分割和识别技术是计算机视觉领域的热门研究方向之一。当前,这项技术已经广泛应用于智能交通、安防监控、智能车联等领域中。本文主要介绍如何通过Python和OpenCV库实现车牌字符分割和识别功能,让读者了解到其中实现原理和技术难点。 二、实现思路 车牌字…

    python 2023年6月6日
    00
  • Python通过字典映射函数实现switch

    Python 中没有类似于其他编程语言中的 switch-case 语句,但可以通过字典映射函数来实现类似的功能。以下是通过字典映射函数实现 Python switch 的完整攻略: 步骤1:使用字典来实现 switch 在 Python 中,我们可以通过字典将函数和某个值关联起来: def zero(): print("Zero") d…

    python 2023年5月13日
    00
  • 13个简便高效的Python脚本分享

    13个简便高效的Python脚本分享 Python是一种高效而又易于上手的编程语言。在日常的开发中,Python脚本可以帮助我们节省大量时间和精力。本文将分享13个简便高效的Python脚本,帮助你更好地应对日常工作和开发中遇到的问题。 1. 自动发送邮件 你是否曾经遇到过需要定时给许多人群发邮件的情况?这时,使用Python可以帮助你自动化这个过程。下面是…

    python 2023年5月14日
    00
  • Python中的布尔类型bool

    当我们需要进行判断时,布尔类型(bool)就显得尤为重要。Python 中的布尔类型是 True 和 False,可以理解为真和假。 布尔类型的基本使用 在 Python 中,可以用 bool() 把一个值转换为布尔类型。 >>> bool(1) True >>> bool(0) False >>> bo…

    python 2023年5月14日
    00
  • Python3中zip()函数知识点小结

    当然,这是我的荣幸。下面是关于Python3中zip()函数的知识点小结: 简介 zip()函数是Python的内置函数之一,用于将多个可迭代对象打包成一个元素对,然后返回一个可迭代的zip对象。 注意:Python2中也有zip()函数,但在Python3中,zip()函数的返回类型改变为zip对象,即不再返回列表,与map()函数一样。 语法 zip()…

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