【PyTorch】torch.Tensor详解和常用操作

学习教材:
动手学深度学习 PYTORCH 版(DEMO)

(https://github.com/ShusenTang/Dive-into-DL-PyTorch)
PDF 制作by [Marcus Yang](https://github.com/chenyang1999)

1.tensor简介

在PyTorch中,torch.Tensor是存储和变换数据的主要工具。

Tensor与Numpy的多维数组非常相似。

Tensor还提供了GPU计算和自动求梯度等更多功能,这些使Tensor更适合深度学习。

2.创建Tensor

2.1 直接创建一个5*3的未初始化的Tensor:

x = torch.empty(5,3)

2.2 创建一个5*3的随机初始化的Tensor

torch.rand:返回一个张量,包含了从区间[0,1)的均匀分布中抽取一组随机数,形状由可变参数size定义。

原型:

torch.rand(size,out=None,dtype=None,layout=torch.strided,device=None,
requires_grad=False)->Tensor

举例:

x = torch.rand(5,3)

torch.randn:返回一个张量,包含了从标准正态分布(Normal distribution)(均值为0,方差为1,即高斯白噪声)中抽取一组随机数,形状由可变参数sizes定义。

x = torch.randn(2,3)

2.3 创建全为0的Tensor(指定数据类型)

x = torch.zeros(5,3,dtype=long)

2.4 根据数据直接创建

x = torch.tensor([5.5,3])

2.5 tensor.new_ones:返回一个与size大小相同的用1填充的张量;

默认情况下,返回的Tensor具有与此张量相同的torch.dtype和torch.device;

>>> tensor = torch.tensor((), dtype=torch.int32)
>>> tensor.new_ones((2, 3))
tensor([[ 1,  1,  1],
        [ 1,  1,  1]], dtype=torch.int32)

2.6 torch.rand_like:返回与输入相同大小的张量,该张量由区间[0,1)上均匀的随机数填充。

原型:

torch.rand_like(input,dtype=None,layout=None,device=None,requires_grad=False,
memory_format=torch.preserve_format)->tensor

torch.rand_like(input)相当于

torch.rand(input.size(),dtype=input.dtype,layout=input.layout,device=input.device)

举例:

x = torch.rand_like(x,dtype=torch.float)

2.7 torch.arange:根据(首,尾,步长)生成tensor

2.8 其余tensor的构造函数

Tensor(*sizes)    基础构造函数
ones(*sizes)      全1Tensor
zeros(*sizes)     全0Tensor
eye(*sizes)	  对角线为1,其他为0
arange(s,e,step)  从s到e,步长为step
linespace(s,e,steps)  从s到e,均匀切分成steps份
normal(mean,std)/uniform(from,to)  正态分布/均匀分布
randperm(m)	随机排列

这些创建方法都可以在创建的时候指定数据类型dtype和存放device(cpu/gpu)

3.Tensor的操作

3.1 Tensor的加法操作:

加法形式一:

x = torch.rand(5, 3)
y = torch.rand(5, 3)
z = x + y

加法形式二:

z=torch.add(x,y)

result = torch.empty(5, 3)
torch.add(x, y, out=result)

加法形式三:

y.add_(x)

2.2 Tensor的索引操作:

我们还可以使用类似Numpy的索引操作来访问Tensor的一部分。需要注意的是:索引出来的结果与原数据共享内存,也即修改一个,另一个也会跟着修改。

y = x[0,:]
y += 1
print(y)
print(x[0,:])

除了常用的索引选择数据之外,PyTorch还提供了一些高级的选择函数:

index_select(input,dim,index)   在指定维度dim上选取过,比如选取某些行,某些列
masked_select(input,mask)       例子如上,a(a>0),使用ByteTensor进行选取
non_zero(input)                 非0元素的下标
gather(input,dim,index)         根据index,在dim维度上选取数据,输出的size与index一样的

4.Tensor数据类型的转换

使用独立的函数如 int(),float()等进行转换

long_tensor = tensor.long()
features = features.float()

使用torch.type()函数

t2=t1.type(torch.FloatTensor)

使用type_as()函数

t3=t1.type_as(t2)

5. Tensor的形状修改

5.1 view()

用view()来改变Tensor的形状:

y = x.view(15)

-1所指的维度可以根据其他的维度推出来

注意:
view()返回的新tensor与源tensor共享内存,实际上就是同一个tensor,也就是更改一个,另一个也会跟着改变。
(顾名思义,view()仅仅改变了对这个张量的观察角度)

Pytorch中的Tensor支持包含一百多种操作,包含转置,索引,切片,数学运算,线性代数,随机数等。


6. Tensor的数据转换

6.1 item()

作用:它可以将一个标量Tensor转换为一个Python number:

x = torch.randn(1)
x.item()

6.2 Tensor 转 NumPy

使用numpy()将Tensor转换成NumPy数组:
注意,这样产生的NumPy数组与Tensor共享相同的内存,改变其中一个另一个也会改变!

a = torch.ones(5)
b = a.numpy() # 转为numpy

6.3 NumPy数组转Tensor

使用from_numpy()将NumPy数组转换为Tensor:
注意,这样产生的NumPy数组与Tensor共享相同的内存,改变其中一个另一个也会改变!

a = np.ones(5) 
b = torch.from_numpy(a)

7. Tensor的广播机制

当对两个形状不同的Tensor按元素运算时,可能会触发广播机制(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。

x = torch.arange(1, 3).view(1,2) #[1,2]
y =torch.arange(1, 4).view(3,1)
print(x+y)

结果:

tensor([[2, 3],
 [3, 4],
 [4, 5]])

8.tensor运算的内存开销

索引,view()是不会开辟新的内存的,而像y=x+y这样的运算是会开辟新的内存的,然后y指向新的内存。

9. Tensor ON GPU

用方法to()可以将Tensor在CPU和GPU之间相互移动。

# 以下代码只有在PyTorch GPU版本上才会执⾏
if torch.cuda.is_available():	
	device = torch.device("cuda")  # GPU
	x = torch.arange(1, 3).view(1,2)
	y = torch.ones_like(x,device=device)  #直接创建一个在GPU上的Tensor
 	x = x.to(device) # 等价于 .to("cuda")
	z = x + y
 	print(z)
 	print(z.to("cpu", torch.double)) # to()还可以同时更改数据类型

转载:【PyTorch系例】torch.Tensor详解和常用操作_torch.tensor函数_大黑山修道的博客-CSDN博客

<think>好的,我现在需要回答用户关于`torch.LongTensor()`的问题。用户之前已经问过`enumerate()`,现在转向PyTorch的张量类型。首先,我得确认用户对PyTorch的基础知识是否了解,可能需要从基础讲起。 首先,`torch.LongTensor()`是PyTorch中的一个函数,用于创建Long类型的张量。张量是PyTorch的核心数据结构,类似于NumPy的数组,但可以在GPU上运行。不同的数据类型在深度学习中用途不同,比如Float用于模型参数,Long用于整数标签或索引。 接下来,我需要解释LongTensor的具体用途。通常在处理分类任务的标签时,标签是整数,所以用LongTensor。此外,索引操作(如gather)也需要LongTensor类型的索引。 然后,应该对比其他数据类型,比如FloatTensor,说明为什么需要区分类型。可能涉及内存计算效率,以及类型不匹配时的错误。 用户可能需要示例代码,展示如何创建LongTensor,如何转换类型,以及常见错误场景。比如,如果用户不小心用FloatTensor作为索引,PyTorch会报错,这时需要转换为LongTensor。 还要注意,PyTorch的版本更新可能会影响某些用法。例如,较早的版本中`torch.LongTensor()`是默认的构造函数,但现在推荐使用`torch.tensor(data, dtype=torch.long)`,更明确。 需要检查是否有常见误区,比如数据类型转换的遗漏,或者在GPU上使用时的注意事项。例如,确保张量在同一个设备上(CPU或GPU)。 最后,总结关键点,强调LongTensor的适用场景,类型转换的重要性,以及如何避免相关错误。确保结构清晰,逐步引导用户理解。</think>--- ### `torch.LongTensor()` 的作用 `torch.LongTensor()` 是 PyTorch 中用于创建 **64位整数类型(int64)张量** 的函数,主要处理需要**整数索引或离散值**的场景(如分类标签、索引操作)。它是 PyTorch 张量(Tensor)的一种特定数据类型。 --- ### 1. 核心特性 - **数据类型**:默认存储 `int64`(64位长整型),取值范围为 $-2^{63}$ 到 $2^{63}-1$。 - **典型用途**: - 存储分类任务的标签(如类别编号 `0, 1, 2`)。 - 张量的索引切片操作(如 `torch.gather()`)。 - 需要整数计算的场景(如离散数学运算)。 --- ### 2. 基础用法 #### 创建 `LongTensor` ```python import torch # 从列表直接创建 labels = torch.LongTensor([0, 2, 1, 3]) print(labels) # 输出:tensor([0, 2, 1, 3]) # 指定形状创建未初始化的 LongTensor empty_tensor = torch.LongTensor(2, 3) # 2行3列,值为随机内存残留值 print(empty_tensor) # 示例输出:tensor([[ 140734799798272, 0, 0], # [ 0, 0, 0]]) ``` #### 类型检查 ```python print(labels.dtype) # 输出:torch.int64 ``` --- ### 3. 与其他数据类型的对比 | 数据类型 | 对应函数 | 典型用途 | |-----------------------|-----------------------|------------------------------| | `torch.LongTensor` | `torch.LongTensor()` | 整数标签、索引操作 | | `torch.FloatTensor` | `torch.FloatTensor()` | 浮点计算(模型参数、输入数据)| | `torch.DoubleTensor` | `torch.DoubleTensor()`| 高精度浮点计算(科学计算) | | `torch.IntTensor` | `torch.IntTensor()` | 较小范围整数(节省内存) | --- ### 4. 常见场景示例 #### 场景 1:分类任务标签 ```python # 假设有3个样本的标签(类别编号) y_true = torch.LongTensor([2, 0, 1]) loss = torch.nn.CrossEntropyLoss()(model_output, y_true) # 损失函数需要LongTensor类型标签 ``` #### 场景 2:张量索引 ```python data = torch.randn(5, 4) # 5个样本,每个样本4维特征 indices = torch.LongTensor([0, 2, 4]) # 选择第0、2、4行 selected_data = data[indices] # 输出形状:torch.Size([3, 4]) ``` --- ### 5. 类型转换 #### 转换为其他类型 ```python # LongTensor → FloatTensor float_labels = labels.float() # 输出:tensor([0., 2., 1., 3.]) # LongTensor → NumPy数组 np_labels = labels.numpy() # 输出:array([0, 2, 1, 3], dtype=int64) ``` #### 从其他类型转换 ```python # 从FloatTensor转换(小数部分会被截断) float_tensor = torch.FloatTensor([1.9, 2.5, 3.1]) long_tensor = float_tensor.long() # 输出:tensor([1, 2, 3]) ``` --- ### 6. 注意事项 - **类型匹配错误**:若将 `FloatTensor` 用于需要整数的操作(如索引),会报错: ```python indices = torch.FloatTensor([0, 1]) # 错误类型 # data[indices] 会触发 TypeError: tensors used as indices must be long, byte or bool tensors ``` 解决方法是显式转换类型: ```python indices = indices.long() # 或使用 torch.LongTensor([0, 1]) ``` - **默认设备一致性**:如果张量在 GPU 上,需确保所有操作涉及的张量在同一设备: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") labels = torch.LongTensor([0, 1]).to(device) ``` --- ### 7. 替代写法(推荐) PyTorch 推荐使用 `dtype` 参数明确指定类型,增强可读性: ```python # 更规范的写法 labels = torch.tensor([0, 2, 1, 3], dtype=torch.long) ``` --- ### 总结 `torch.LongTensor()` 的核心价值在于**高效处理整数数据**,尤其在以下场景必不可少: 1. 分类模型的标签输入(如交叉熵损失函数)。 2. 张量的索引、切片或维度变换操作。 3. 需要精确整数运算的任务(如计数、位置编码)。 使用时需注意**数据类型匹配****设备一致性**,避免因类型错误导致程序中断。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值