3-张量API-下

75 篇文章 2 订阅

1. torch.take

torch.take(input, index) → Tensor

返回一个新的张量,其输入元素为给定指标。输入张量被看成是一维张量。结果与指标的形状相同。
分两步:

  • 将输入input展开成一个一维张量
  • 根据index序号进行索引input里面的值
import torch 
input = torch.tensor([[4, 3, 5], [6, 7, 8]])
index = torch.tensor([0, 2, 5])
output = torch.take(input,index)
print(f"input={input}")
# input=tensor([[4, 3, 5],
#         [6, 7, 8]])
print(f"index={index}")
# index=tensor([0, 2, 5])
print(f"output={output}")
# output=tensor([4, 5, 8])

2. torch.tile

torch.tile(input, dims) → Tensor

通过重复输入的元素构造一个张量。dims参数指定每个维度的重复次数

import torch

x = torch.tensor([1,2,3])

# 将x的行复制2倍,列复制3倍
x_tile = x.tile((2,3))
print(f"x={x}")
# x=tensor([1, 2, 3])
print(f"x_tile={x_tile}")
# x_tile=tensor([[1, 2, 3, 1, 2, 3, 1, 2, 3],
#         [1, 2, 3, 1, 2, 3, 1, 2, 3]])

3. torch.transpose

torch.transpose(input, dim0, dim1) → Tensor

返回一个张量,它是输入的转置版本。给定尺寸的dim0和dim1交换。

import torch
x = torch.ones(2,3,4)
# 将第0维和第1维互换;(2,3,4) -> (3,2,4)
x_transpose_0_1 = torch.transpose(x,0,1)
# 将第0维和第2维互换;(2,3,4) -> (4,3,2)
x_transpose_0_2 = torch.transpose(x,0,2)
# 将第1维和第2维互换;(2,3,4) -> (2,4,3)
x_transpose_1_2 = torch.transpose(x,1,2)
print(f"x.shape={x.shape}")
print(f"x_transpose_0_1.shape={x_transpose_0_1.shape}")
print(f"x_transpose_0_2.shape={x_transpose_0_2.shape}")
print(f"x_transpose_1_2.shape={x_transpose_1_2.shape}")
x.shape=torch.Size([2, 3, 4])
x_transpose_0_1.shape=torch.Size([3, 2, 4])
x_transpose_0_2.shape=torch.Size([4, 3, 2])
x_transpose_1_2.shape=torch.Size([2, 4, 3])

4. torch.unblind

torch.unbind(input, dim=0) → seq

将输入的张量删除指定的维度;比如输入大小为(2,3,4)

  • unblind;dim=0 得到(3,4);(3,4)
  • unblind;dim=1 得到(2,4);(2,4);(2,4)
  • unblind;dim=2 得到(2,3);(2,3);(2,3);(2,3)
import torch

x = torch.arange(24).reshape(2,3,4)
x_unbind_0 = torch.unbind(x,dim=0)
x_unbind_1 = torch.unbind(x,dim=1)
x_unbind_2 = torch.unbind(x,dim=2)
print(f"x={x}")
print(f"x_unbind_0={x_unbind_0}")
print(f"x_unbind_0[0].shape={x_unbind_0[0].shape}")
print(f"x_unbind_0[1].shape={x_unbind_0[1].shape}")
print(f"x_unbind_1={x_unbind_1}")
print(f"x_unbind_1[0].shape={x_unbind_1[0].shape}")
print(f"x_unbind_1[1].shape={x_unbind_1[1].shape}")
print(f"x_unbind_1[2].shape={x_unbind_1[2].shape}")
print(f"x_unbind_2={x_unbind_2}")
print(f"x_unbind_2[0].shape={x_unbind_2[0].shape}")
print(f"x_unbind_2[1].shape={x_unbind_2[1].shape}")
print(f"x_unbind_2[2].shape={x_unbind_2[2].shape}")
print(f"x_unbind_2[3].shape={x_unbind_2[3].shape}")
x=tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]])
x_unbind_0=(tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]), tensor([[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]))
x_unbind_0[0].shape=torch.Size([3, 4])
x_unbind_0[1].shape=torch.Size([3, 4])
x_unbind_1=(tensor([[ 0,  1,  2,  3],
        [12, 13, 14, 15]]), tensor([[ 4,  5,  6,  7],
        [16, 17, 18, 19]]), tensor([[ 8,  9, 10, 11],
        [20, 21, 22, 23]]))
x_unbind_1[0].shape=torch.Size([2, 4])
x_unbind_1[1].shape=torch.Size([2, 4])
x_unbind_1[2].shape=torch.Size([2, 4])
x_unbind_2=(tensor([[ 0,  4,  8],
        [12, 16, 20]]), tensor([[ 1,  5,  9],
        [13, 17, 21]]), tensor([[ 2,  6, 10],
        [14, 18, 22]]), tensor([[ 3,  7, 11],
        [15, 19, 23]]))
x_unbind_2[0].shape=torch.Size([2, 3])
x_unbind_2[1].shape=torch.Size([2, 3])
x_unbind_2[2].shape=torch.Size([2, 3])
x_unbind_2[3].shape=torch.Size([2, 3])

5. torch.unsqueeze

torch.unsqueeze(input, dim) → Tensor

将大小为1的维度插入到指定的输入input张量中

import torch

input = torch.arange(24).reshape(2, 3, 4)
input_unsqueeze_0 = torch.unsqueeze(input, dim=0)
input_unsqueeze_1 = torch.unsqueeze(input, dim=1)
input_unsqueeze_2 = torch.unsqueeze(input, dim=2)
print(f"input.shape={input.shape}")
# input.shape=torch.Size([2, 3, 4])
print(f"input_unsqueeze_0.shape={input_unsqueeze_0.shape}")
# input_unsqueeze_0.shape=torch.Size([1, 2, 3, 4])
print(f"input_unsqueeze_1.shape={input_unsqueeze_1.shape}")
# input_unsqueeze_1.shape=torch.Size([2, 1, 3, 4])
print(f"input_unsqueeze_2.shape={input_unsqueeze_2.shape}")
# input_unsqueeze_2.shape=torch.Size([2, 3, 1, 4])

6. torch.where

torch.where(condition, x, y) → Tensor

根据条件condition 来选择x,y ;condition 成立选择x,condition不成立,选择y

import torch
# 从正太分布中抽取数据组成3行4列矩阵
x = torch.randn(3, 4)
# 创建一个全为1的3行4列矩阵
y = torch.ones(3, 4)
# 如果x中的元素大于0,那么保留,如果小于等于0则用1替换
# 起到一个mask掩码的作用
# 作用:将x中所有的负数用1来填充
z = torch.where(x > 0, x, y)
print(f"x={x}")
print(f"y={y}")
print(f"z={z}")
x=tensor([[ 1.8641,  1.5247,  1.2949,  0.1723],
        [ 0.3793, -0.4579,  0.0565, -0.8108],
        [-0.5820,  0.1716,  0.5962, -0.3010]])
y=tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
z=tensor([[1.8641, 1.5247, 1.2949, 0.1723],
        [0.3793, 1.0000, 0.0565, 1.0000],
        [1.0000, 0.1716, 0.5962, 1.0000]])

7. torch.rand&torch.randn

  • torch.rand:返回一个张量,里面填满了均匀分布在区间[0,1)[0,1)上的随机数。
  • torch.randn : 返回一个张量,里面填满了均值为0、方差为1的正态分布(也称为标准正态分布)中的随机数。
# 创建一个张量,张量的元素从均匀分布[0,1)中采样
x = torch.rand(3, 4)
# 创建一个张量,张量的元素从正太分布N(0,1)中采样
y = torch.randn(3, 4)
print(f"x={x}")
print(f"y={y}")
# x=tensor([[0.0086, 0.5198, 0.0839, 0.4737],
#         [0.2102, 0.9172, 0.5795, 0.3595],
#         [0.0384, 0.4539, 0.5219, 0.1834]])
# y=tensor([[ 1.2129, -0.2365,  1.3958, -1.3845],
#         [-0.9289, -0.3948, -0.6431,  0.4673],
#         [ 0.4783, -0.0453, -1.8524,  1.1195]])

8. torch.manual_seed

设置生成随机数的种子。返回一个tensor,生成器对象。为了论文复现,经常要设置固定随机种子;

torch.manual_seed(seed)

9. torch.bernoulli

从伯努利分布中绘制二进制随机数(0或1)。基于输入的张量的概率生成0或1;

# 创建一个3X3的张量,用均匀[0,1]分布填充元素值,其值表示为概率大小
input_probablity = torch.empty(3, 3).uniform_(0, 1)
print(f"input_probablity={input_probablity}")
# 以输入的概率值生成0或1值
output_bernoulli = torch.bernoulli(input_probablity)
print(f"output_bernoulli={output_bernoulli}")
input_probablity=tensor([[0.9762, 0.5216, 0.8038],
        [0.8500, 0.3650, 0.5082],
        [0.6399, 0.1677, 0.4346]])
output_bernoulli=tensor([[1., 1., 1.],
        [1., 0., 0.],
        [1., 1., 1.]])

10. torch.normal

torch.normal(mean, std, *, generator=None, out=None) → Tensor
  • 注:可以指定mean均值,std方差
    返回一个由不同正态分布的随机数组成的张量,其均值和标准差已给出。
# 从一个正太分布中采样,均值为2,方差为3,采样的元素组成3行4列矩阵
output_normal = torch.normal(2,3,size=(3,4))
print(f"output_normal={output_normal}")
output_normal=tensor([[-2.2242,  4.8522,  0.9539, -0.9935],
        [ 3.3374, -1.2745, -0.0622,  0.5054],
        [ 7.7920,  3.4281, -1.5371,  1.3780]])

11. torch.randint

返回一个张量,张量由低(包含)和高(不包含)之间均匀生成的随机整数填充。

# 从[3,8)中随机抽取整数填充为3行4列矩阵
output_randint = torch.randint(3,8,size=(3,4))
print(f"output_randint={output_randint}")
#output_randint=tensor([[4, 7, 7, 4],
#       [7, 3, 6, 5],
#        [6, 3, 7, 7]])

12. torch.randperm

返回从0到n - 1的整数的随机排列。

# 创建一个一维张量[0,1,..,11]并随机打乱里面元素
output_randperm = torch.randperm(12)
print(f"output_randperm={output_randperm}")
# output_randperm=tensor([ 6,  1, 10, 11,  5,  9,  8,  2,  7,  3,  0,  4])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 根据您的描述,paddlex报错的原因是GridSampleOp的输入(X)应为4-D张量,但收到了X维度大小为5的张量。这可能是由于您输入的张量维度不符合GridSampleOp的要求导致的。您可以检查一下您输入的张量维度是否正确,并确保它们符合GridSampleOp的要求。如果问题仍然存在,您可以查看PaddlePaddle的文档或者论坛寻求更多的帮助。 ### 回答2: 错误提示显示paddlex报错了,错误原因是输入给GridSampleOp算子的输入X应该为4维张量,但是实际收到的X的维度大小为5。 GridSampleOp算子是一个用于图像处理的操作符,常用于对图像进行几何变换。在使用这个算子时,需要确保输入的X是一个4维张量,即(batch_size, channels, height, width)。然而,报错信息显示收到的X的维度大小为5,意味着它有额外的一个维度,导致无法满足GridSampleOp算子的要求。 解决这个问题的方法是,检查X的维度大小并进行调整。可以使用shape函数查看X的维度大小,例如,使用X.shape函数可以得到X的维度信息。对于维度大小为5的张量X,可以尝试对其进行reshape操作,将其调整为4维张量的形式。具体的调整方法可以根据实际需求来确定,确保得到的张量X满足GridSampleOp算子的输入要求即可。 另外,还需要注意的是,确保张量X包含正确的图像数据,并且其他参数的设置也正确,以避免其他潜在的错误。如果在调整维度后仍有报错,还可以仔细检查输入数据和算子参数是否正确,并查阅paddlex的官方文档或社区提供的相关资料,寻求更多帮助和解决方案。 ### 回答3: paddlex报错的原因是在使用GridSampleOp操作时,期望的输入张量X的维度应为4-D,但实际上传入的X张量的维度大小为5。 4-D张量通常表示为[batch_size, height, width, channels]的形式,其中batch_size表示批大小,height和width表示图像的高度和宽度,channels表示图像的通道数。 而维度大小为5的张量无法满足上述要求,可能意味着传入的张量维度有误或者数据格式不正确。 要解决这个问题,首先需要确认传入GridSampleOp操作的张量X的维度是否正确,确保其为4-D的形式。可以使用paddlex提供的API函数来查看张量的维度,如shape函数。 如果X张量的维度确实是4-D,那么可能是传入的数据格式有误。在传入GridSampleOp操作之前,需要确保数据被正确地处理和准备,可以参考paddlex提供的数据处理文档进行相应的处理。 总之,要解决这个报错问题,首先要确认GridSampleOp操作的输入张量X的维度是否正确,并且确保传入的数据格式和处理流程正确无误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值