前言
提示:这里可以添加本文要记录的大概内容:
本文记录一下,小白学习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.索引与切片
# 4张3通道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) 标量
# 4张3通道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的一些基础使用方法。