基于PyTorch的深度学习2——Numpy与Tensor

Tensor自称为神经网络界的Numpy,它与Numpy相似,二者可以共享内存,且之间的转换非常方便和高效。不过它们也有不同之处,最大的区别就是Numpy会把ndarray放在CPU中进行加速运算,而由Torch产生的Tensor会放在GPU中进行加速运算。

1.创建

创建Tensor的方法有很多,可以从列表或ndarray等类型进行构建,也可根据指定的形状构建。

python 复制代码
import torch

# 根据list数据创建Tensor
torch.Tensor([1,2,3,4,5,6])

# 根据指定形状生成Tensor
torch.Tensor(2,3)

# 给定的Tensor的形状
t=torch.Tensor([[1,2,3],[4,5,6]])

# 查看Tensor的形状
t.size()
t.shape()

# 根据已有形状创建Tensor
torch.Tensor(t.size())

注意torch.Tensor与torch.tensor的几点区别:

1)torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor),而torch.tensor是从数据中推断数据类型。

2)torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,它是随机初始化的值

下面是根据一定规则,自动生成Tensor的一些例子。

python 复制代码
import torch

#生成一个单位矩阵
torch.eye(2,2)

#自动生成全是0的矩阵
torch.zeros(2,3)

#根据规则生成数据
torch.linspace(1,10,4)

#生成满足均匀分布随机数
torch.rand(2,3)

#生成满足标准分布随机数
torch.randn(2,3)

#返回所给数据形状相同,值全为0的张量
torch.zeros_like(torch.rand(2,3))

2.修改Tensor形状

python 复制代码
import torch

# 生成一个形状为2x3的矩阵
x=torch.randn(2,3)

# 查看矩阵的形状
x.size()

# 查看x的维度
x.dim()

# 把x变为3x2的矩阵
x.view(3,2)

# 把x压平为1维向量
y=x.view(-1)
y.shape

# 添加一个维度
z=torch.unsqueeze(y,0)

# 查看z的形状
z.shape() # 结果为torch.Size([1,6])

# 计算Z的元素个数
z.numl() #结果为6

torch.view与torch.reshpae的异同

1)reshape()可以由torch.reshape(),也可torch.Tensor.reshape()调用。但view()只可由torch.Tensor.view()来调用。

2)对于一个将要被view的Tensor,新的size必须与原来的size与stride兼容。否则,在view之前必须调用contiguous()方法。

3)同样也是返回与input数据量相同,但形状不同的Tensor。若满足view的条件,则不会copy,若不满足,则会copy。

4)如果只想重塑张量,请使用torch.reshape。如果你还关注内存使用情况并希望确保两个张量共享相同的数据,请使用torch.view。

3.索引

Tensor的索引操作与Numpy类似

python 复制代码
import torch

# 设置随机种子
torch.manual_seed(100)

# 生成一个形状为2x3的矩阵
x=torch.randn(2,3)

# 根据索引获取第一行所有数据
x[0,:]

# 获取最后一列数据
x[:,-1]

# 生成是否大于0的Byter张量
mask=x>0
# 获取>0的值
torch.masked_select(x,mask)
# 获取非0下标:即行,列索引
torch.nonzero(mask)

接下来,演示如何用PyTorch 中的 torch.gathertorch.scatter_ 函数来根据索引选择和分配值。

  1. torch.gather(input, dim, index, out=None) → Tensor

    • 根据 index 指定的位置从 input 张量中收集数据。

    • 如果 dim == 0,则沿第一个维度(行)进行索引;如果 dim == 1,则沿第二个维度(列)进行索引。

  2. torch.scatter_(dim, index, src) → Tensor

    • 根据 index 指定的位置将 src 的值分散到目标张量中。

    • dim 参数决定了沿着哪个维度进行散射操作

假设我们有一个输入张量 x,并且想要按照给定规则使用 torch.gather 获取指定索引对应的值,并使用 torch.scatter_ 将这些值返回到一个 2x3 的零矩阵中。

输入张量 x

首先,定义一个示例输入张量 x

python 复制代码
import x

# 定义输入张量x
x=torch.LongTensor([[10,20,30],[40,50,60]])

# 接下来,使用torch.gather根据索引获取值

# 索引张量index
index_dim0=torch.LongTensor([[0,1,1]]) # 对应dim==0的情况
index_dim1=torch.LongTensor([[0,1,1],[1,1,1]])  # 对应dim==1的情况

# 沿第一个维度进行gather
a_dim0=torch.gather(x,0,index_dim0)

# 沿第二个维度进行gather
a_dim1=torch.gather(x,1,index_dim1)

#把a_dim1的值返回到2x3的0矩阵中
z=torch.zeros(2,3)
z.scatter_(1,index,a_dim1)
相关推荐
Narrastory3 小时前
明日香 - Pytorch 快速入门保姆级教程(一)
人工智能·pytorch·深度学习
Narrastory4 小时前
明日香 - Pytorch 快速入门保姆级教程(二)
人工智能·pytorch·深度学习
程序员打怪兽1 天前
详解Visual Transformer (ViT)网络模型
深度学习
CoovallyAIHub3 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
用户1474853079744 天前
AI-动手深度学习环境搭建-d2l
深度学习
OpenBayes贝式计算4 天前
解决视频模型痛点,TurboDiffusion 高效视频扩散生成系统;Google Streetview 涵盖多个国家的街景图像数据集
人工智能·深度学习·机器学习