Python|张量创建操作[5]

2020-05-27 23:49:08 浏览数 (1)

创建操作续3

torch.quantizeperchannel(input, scales, zero_points, axis, dtype) → Tensor

根据给定的scale和zero points,把每个通道量化,返回张量 参数

  • input(Tensor):需要量化的浮点张量
  • scales(Tensor):一维张量,给每个通道指定scale,大小是input.size(axis)
  • zero_points(Tensor):size是input.size(axis)
  • dtype

例子

代码语言:javascript复制
    >>> x = torch.tensor([[-1.0, 0.0], [1.0, 2.0]])

    >>> torch.quantize_per_channel(x, torch.tensor([0.1, 0.01]), torch.tensor([10, 0]), 0, torch.quint8)

    tensor([[-1.,  0.],

            [ 1.,  2.]], size=(2, 2), dtype=torch.quint8,

           quantization_scheme=torch.per_channel_affine,

           scale=tensor([0.1000, 0.0100], dtype=torch.float64),

           zero_point=tensor([10,  0]), axis=0)

    >>> torch.quantize_per_channel(x, torch.tensor([0.1, 0.01]), torch.tensor([10, 0]), 0, torch.quint8).int_repr()

    tensor([[  0,  10],

            [100, 200]], dtype=torch.uint8)

索引,切片,连接和转换操作

torch.cat(tensors, dim=0, out=None) → Tensor

指定维度,连接给定的张量,张量需要有相同的形状,或者为空也可以 参数

  • Tensors(Tensor序列):需要连接的张量序列
  • dim(int,可选参数):张量连接的维度
  • out:输出张量

例子

代码语言:javascript复制
        >>> x = torch.randn(2, 3)

    >>> x

    tensor([[ 0.6580, -1.0969, -0.4614],

            [-0.1034, -0.5790,  0.1497]])

    >>> torch.cat((x, x, x), 0)

    tensor([[ 0.6580, -1.0969, -0.4614],

            [-0.1034, -0.5790,  0.1497],

            [ 0.6580, -1.0969, -0.4614],

            [-0.1034, -0.5790,  0.1497],

            [ 0.6580, -1.0969, -0.4614],

            [-0.1034, -0.5790,  0.1497]])

    >>> torch.cat((x, x, x), 1)

    tensor([[ 0.6580, -1.0969, -0.4614,  0.6580, -1.0969, -0.4614,  0.6580,

             -1.0969, -0.4614],

            [-0.1034, -0.5790,  0.1497, -0.1034, -0.5790,  0.1497, -0.1034,

             -0.5790,  0.1497]])

torch.chunk(input, chunks, dim=0) → List of Tensors

把张量分割成指定数量的块,每个块是输入张量的view 最后一个块如果张量沿着指定的维度不可分割成指定形状的块,那么最后一个块形状更小 参数

  • input(Tensor):需要分割的张量
  • chunks(int):需要返回的块数量
  • dim(int):沿分割的维度

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

沿给定的维度轴,收集值 对于一个三维张量:

代码语言:javascript复制
    out[i][j][k] = input[index[i][j][k]][j][k]  # 如果 dim == 0

    out[i][j][k] = input[i][index[i][j][k]][k]  # 如果 dim == 1

    out[i][j][k] = input[i][j][index[i][j][k]]  # 如果 dim == 2

如果输入张量是n维,大小为(x0,x1,x2,...,xn-1),指定的dim为i,那么index必须是n维张量,在y>=1的地方,其大小为(x0,x1,...,xn-1),输出张量out则和index一样的size 参数

  • input(Tensor):源张量
  • dim(int):索引的轴
  • index:需要收集元素的索引
  • out
  • sparse_grad(bool,可选参数):如果是True,那么输入input是一个稀疏张量

例子

代码语言:javascript复制
    >>> t = torch.tensor([[1,2],[3,4]])

    >>> torch.gather(t, 1, torch.tensor([[0,0],[1,0]]))

    tensor([[ 1,  1],

            [ 4,  3]])torch.index_select(input, dim, index, out=None) → Tensor

返回一个新的张量,沿input指定的dim索引,index是一个长张量 返回的张量和源张量维度相同,指定dim的这个维度和index一样长度,其他的维度和源张量一样 返回张量开辟新的内存,如果输出张量out的shape不适合,会自动纠正,并且必要时重新开辟内存 参数

  • input(Tensor):输入张量
  • dim(int):我们需要索引的维度
  • index(LongTensor):包含需要索引的序列
  • out

例子

代码语言:javascript复制
    >>> x = torch.randn(3, 4)

    >>> x

    tensor([[ 0.1427,  0.0231, -0.5414, -1.0009],

            [-0.4664,  0.2647, -0.1228, -1.1068],

            [-1.1734, -0.6571,  0.7230, -0.6004]])

    >>> indices = torch.tensor([0, 2])

    >>> torch.index_select(x, 0, indices)

    tensor([[ 0.1427,  0.0231, -0.5414, -1.0009],

            [-1.1734, -0.6571,  0.7230, -0.6004]])

    >>> torch.index_select(x, 1, indices)

    tensor([[ 0.1427, -0.5414],

            [-0.4664, -0.1228],

            [-1.1734,  0.7230]])

0 人点赞