Tensor基础操作总结

本文详细介绍了PyTorch中的Tensor概念及其基本操作,包括创建、加减乘除、索引切片、广播机制、与NumPy转换以及在GPU上的使用。通过实例展示了如何进行张量计算和数据处理,是初学者理解Tensor的实用指南。
摘要由CSDN通过智能技术生成


前言

提示:这里可以添加本文要记录的大概内容:

本文记录一下,小白学习pytorch的过程。这次文章是第一次学习记录,内容是tensor的基本数据处理和计算操作。


提示:以下是本篇文章正文内容,下面案例可供参考

一、tensor是什么?

在深度学习中,我们通常会频繁地对数据进行操作。而在PyTorch中,torch.Tensor是存储和变换数据的主要工具。Tensor和NumPy的多维数组非常类似。
然而,Tensor提供了GPU计算和自动求梯度等更多功能,这些使Tensor更加适合深度学习。
"tensor"这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是2维张量。

二、tensor的基本操作

1.tensor的创建

代码如下(示例):

import torch
#创建一个未初始化的tensor
x = torch.empty(2,3) 
#初始化一个随机的tensor
x = torch.rand(2,3)
#初始化一个long型全0的tensor
x = torch.zeros(2,3,dtype=torch.long)
#初始化一个确定好数值的tensor
x = torch.tensor([[5,5,2],[1,2,3]])
#默认具有相同的dtype和device
x = x.new_ones(2,3,dtype=torch.float6)
#指定新的tensor y 具有和x一样的形状
y = torch.randn_like(x,dtype=torch.float)
#获取tensor的形状
x.shape 
x.size()

其他创建tensor的函数:
在这里插入图片描述

2.基础操作

a = torch.tensor([[5,5,2],[1,2,3]])
b = torch.tensor([[5,5,2],[1,2,3]])
#1.加法
(a + b)
(torch.add(a,b))
#2.减法
(a - b)
#3.除法
(a / b)
#4.乘法(列数必须统一)
a*b
#5.改变形状
y = x.view(6)
z = x.view(-1, 2)  # -1所指的维度可以根据其他维度的值推出来
print(x.size(), y.size(), z.size())
	#torch.Size([2, 3]) torch.Size([6]) torch.Size([3, 2])
#6.共享内存空间
x += 1
print(x)
print(y) # y也加了1
	#tensor([[2.0910, 2.5265, 2.3833],[1.4564, 1.3117, 1.5181]])
	#tensor([2.0910, 2.5265, 2.3833, 1.4564, 1.3117, 1.5181])
	#view()返回的新Tensor与源Tensor虽然可能有不同的size,但是是共享data的,
也即更改其中的一个,另外一个也会跟着改变。
#7.矩阵乘法
a = torch.ones(2,2) * 3 
b = torch.ones(2,2)
#三种表达方式
torch.mm(a,b)    # 只适用于2维
torch.matmul(a,b)
troch.mul(a,b)
a@b
	#tensor([[6., 6.],[6., 6.]])
#8.unsqueeze 删除纬度
a = torch.tensor([1.2,2.3])
a       
	# tensor([1.2000, 2.3000])
a.shape 
# torch.Size([2])
a.unsqueeze(-1) 
	# tensor([[1.2000],[2.3000]])  shape 是torch.Size([2, 1])
a.unsqueeze(0)  
	# tensor([[1.2000, 2.3000]])   shape 是torch.Size([1, 2])
b = torch.rand(32)
f = torch.rand(4,32,14,14)
b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
b.shape 
	# torch.Size([1, 32, 1, 1])
#9.squeeze 增加纬度
b = torch.rand(32)
b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
b.shape 
	# torch.Size([1, 32, 1, 1])
# 若不填写参数,则把维度shape是1的都给删除掉
# 只能删除维度shape是1的那些维度
b.squeeze().shape 
	# torch.Size([32])
b.squeeze(0).shape 
	# torch.Size([32, 1, 1])

3.索引与切片

# 43通道28*28的图片
a = torch.rand(4,3,28,28)
a[0].shape     # torch.Size([3, 28, 28]) 
a[0,0].shape   # torch.Size([28, 28])
a[0,0,2,4]     # tensor(0.9831) 标量
# 43通道28*28的图片
a = torch.rand(4,3,28,28)
a.shape             # torch.Size([4, 3, 28, 28])
a[:2].shape         # torch.Size([2, 3, 28, 28])
a[:2,:1,:,:].shape  # torch.Size([2, 1, 28, 28])
a[:2,1:,:,:].shape  # torch.Size([2, 2, 28, 28])
a[:2,-1:,:,:].shape # torch.Size([2, 1, 28, 28])
a[:,:,0:28:2,0:28:2].shape  # torch.Size([4, 3, 14, 14])
a[:,:,::2,::2].shape        # torch.Size([4, 3, 14, 14])
————————————————
版权声明:本文为CSDN博主「错错莫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bit452/article/details/115278139

4.广播机制

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

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

5.tensor和numpy的互相转换

我们可以使用numpy()和from_numpy()将Tensor和NumPy中的数组相互转换。但是需要注意的一点是: 这两个函数所产生的的Tensor和NumPy中的数组共享相同的内存(所以他们之间的转换很快),改变其中一个时另一个也会改变!
还有一个常用的将NumPy中的array转换成Tensor的方法就是torch.tensor(), 需要注意的是,此方法总是会进行数据拷贝(就会消耗更多的时间和空间),所以返回的Tensor和原来的数据不再共享内存。

#np转tensor
a = np.ones(3)
b = torch.from_numpy(a)
print(a, b)
a += 1
print(a, b)
b += 1
print(a, b)
    #[1. 1. 1.] tensor([1., 1., 1.], dtype=torch.float64) 
    #[2. 2. 2.] tensor([2., 2., 2.], dtype=torch.float64) 
    #[3. 3. 3.] tensor([3., 3., 3.], dtype=torch.float64)
#使用torch.tensor()将NumPy数组转换成Tensor(不再共享内存)
c = torch.tensor(a)
a += 1
print(a, c)
[4. 4. 4.] tensor([3., 3., 3.], dtype=torch.float64)
#tensor转np
a = torch.ones(5)
b = a.numpy()

6.在GPU上使用tensor

用方法to()可以将Tensor在CPU和GPU(需要硬件支持)之间相互移动。

# 以下代码只有在PyTorch GPU版本上才会执行
if torch.cuda.is_available():
    device = torch.device("cuda")          # GPU
    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()还可以同时更改数据类型
    
    #tensor([[2, 3]], device='cuda:0) 
    #tensor([[2., 3.]], dtype=torch.float64)

总结

以上就是今天要讲的内容,本文简单介绍了tensor的一些基础使用方法。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值