Pytorch 中的 dim

Pytorch 中对 tensor 的很多操作如 sumargmaxunsqueeze 等都可以设置 dim 参数用来指定操作在哪一维进行。Pytorch 中的 dim 类似于 numpy 中的 axis,这篇文章来总结一下 Pytorch 中的 dim 操作。

dim 与方括号的关系

创建一个矩阵

a = torch.tensor([[1, 2], [3, 4]])
print(a)

输出

tensor([[1, 2],
        [3, 4]])

因为a是一个矩阵,所以a的左边有 2 个括号

括号之间是嵌套关系,代表了不同的维度。从左往右数,两个括号代表的维度分别是 0 和 1 ,在第 0 维遍历得到向量,在第 1 维遍历得到标量

同样地,对于 3 维 tensor

b = torch.tensor([[[3, 2], [1, 4]], [[5, 6], [7, 8]]])
print(b)

输出

tensor([[[3, 2],
         [1, 4]],

        [[5, 6],
         [7, 8]]])

则 3 个括号代表的维度从左往右分别为 0, 1, 2,在第 0 维遍历得到矩阵,在第 1 维遍历得到向量,在第 2 维遍历得到标量

更详细一点

在指定的维度上进行操作

在某一维度求和(或者进行其他操作)就是对该维度中的元素进行求和。
对于矩阵 a

a = torch.tensor([[1, 2], [3, 4]])
print(a)

输出

tensor([[1, 2],
        [3, 4]])

求 a 在第 0 维的和,因为第 0 维代表最外边的括号,括号中的元素为向量[1, 2][3, 4],第 0 维的和就是第 0 维中的元素相加,也就是两个向量[1, 2][3, 4]相加,所以结果为
\[
[1, 2] + [3, 4] = [4, 6]
\]

s = torch.sum(a, dim=0)
print(s)

输出

tensor([4, 6])

可以看到,a 是 2 维矩阵,而相加的结果为 1 维向量,可以使用参数keepdim=True来保证形状不变

s = torch.sum(a, dim=0, keepdim=True)
print(s)

输出

tensor([[4, 6]])

在 a 的第 0 维求和,就是对第 0 维中的元素(向量)进行相加。同样的,对 a 第 1 维求和,就是对 a 第 1 维中的元素(标量)进行相加,a 的第 1 维元素为标量 1,2 和 3,4,则结果为
\[
[1+2]=[3], ~ [3+4]=[7]
\]

s = torch.sum(a, dim=1)
print(s)

输出

tensor([3, 7])

保持维度不变

s = torch.sum(a, dim=1, keepdim=True)
print(s)

输出

tensor([[3],
        [7]])

对 3 维 tensor 的操作也是这样

b = torch.tensor([[[3, 2], [1, 4]], [[5, 6], [7, 8]]])
print(b)

输出

tensor([[[3, 2],
         [1, 4]],

        [[5, 6],
         [7, 8]]])

将 b 在第 0 维相加,第 0 维为最外层括号,最外层括号中的元素为矩阵[[3, 2], [1, 4]][[5, 6], [7, 8]]。在第 0 维求和,就是将第 0 维中的元素(矩阵)相加
\[
\left[
\begin{matrix}
3 & 2 \ 1 & 4 \ \end{matrix}
\right]
+
\left[
\begin{matrix}
5 & 6 \ 7 & 8 \ \end{matrix}
\right]
=
\left[
\begin{matrix}
8 & 8 \ 8 & 12 \ \end{matrix}
\right]
\]

s = torch.sum(b, dim=0)
print(s)

输出

tensor([[ 8,  8],
        [ 8, 12]])

求 b 在第 1 维的和,就是将 b 第 1 维中的元素[3, 2][1, 4], [5, 6][7, 8]相加,所以
\[
[3,2]+[1,4]=[4,6], [5,6]+[7,8]=[12,14]
\]

s = torch.sum(b, dim=1)
print(s)

输出

tensor([[ 4,  6],
        [12, 14]])

则在 b 的第 2 维求和,就是对标量 3 和 2, 1 和 4, 5 和 6 , 7 和 8 求和

s = torch.sum(b, dim=2)
print(s)

结果为

tensor([[ 5,  5],
        [11, 15]])

除了求和,其他操作也是类似的,如求 b 在指定维度上的最大值

m = torch.max(b, dim=0)
print(m)

b 在第 0 维的最大值是第 0 维中的元素(两个矩阵[[3, 2], [1, 4]][[5, 6], [7, 8]])的最大值,取矩阵对应位置最大值即可
结果为

torch.return_types.max(
values=tensor([[5, 6],
        [7, 8]]),
indices=tensor([[1, 1],
        [1, 1]]))

b 在第 1 维的最大值就是第 1 维元素(4 个(2对)向量)的最大值

m = torch.max(b, dim=1)
print(m)

输出为

torch.return_types.max(
values=tensor([[3, 4],
        [7, 8]]),
indices=tensor([[0, 1],
        [1, 1]]))

b 在第 0 维的最大值就是第 0 为元素(8 个(4 对)标量)的最大值

m = torch.max(b, dim=2)
print(m)

输出

torch.return_types.max(
values=tensor([[3, 4],
        [6, 8]]),
indices=tensor([[0, 1],
        [1, 1]]))

总结

在 tensor 的指定维度操作就是对指定维度包含的元素进行操作,如果想要保持结果的维度不变,设计参数keepdim=True即可。

原文地址:https://www.cnblogs.com/flix/p/11262606.html

时间: 2024-10-08 16:45:28

Pytorch 中的 dim的相关文章

[Pytorch]Pytorch中tensor常用语法

原文地址:https://zhuanlan.zhihu.com/p/31494491 上次我总结了在PyTorch中建立随机数Tensor的多种方法的区别. 这次我把常用的Tensor的数学运算总结到这里,以防自己在使用PyTorch做实验时,忘记这些方法应该传什么参数. 总结的方法包括: Tensor求和以及按索引求和:torch.sum() torch.Tensor.indexadd() Tensor元素乘积:torch.prod(input) 对Tensor求均值.方差.极值: torch

关于Pytorch中accuracy和loss的计算

这几天关于accuracy和loss的计算有一些疑惑,原来是自己还没有弄清楚. 给出实例 def train(train_loader, model, criteon, optimizer, epoch): train_loss = 0 train_acc = 0 num_correct= 0 for step, (x,y) in enumerate(train_loader): # x: [b, 3, 224, 224], y: [b] x, y = x.to(device), y.to(de

PyTorch中scatter和gather的用法

PyTorch中scatter和gather的用法 闲扯 许久没有更新博客了,2019年总体上看是荒废的,没有做出什么东西,明年春天就要开始准备实习了,虽然不找算法岗的工作,但是还是准备在2019年的最后一个半月认真整理一下自己学习的机器学习和深度学习的知识. scatter的用法 scatter中文翻译为散射,首先看一个例子来直观感受一下这个API的功能,使用pytorch官网提供的例子. import torch import torch.nn as nn x = torch.rand(2,

(原)CNN中的卷积、1x1卷积及在pytorch中的验证

转载请注明处处: http://www.cnblogs.com/darkknightzh/p/9017854.html 参考网址: https://pytorch.org/docs/stable/nn.html?highlight=conv2d#torch.nn.Conv2d https://www.cnblogs.com/chuantingSDU/p/8120065.html https://blog.csdn.net/chaolei3/article/details/79374563 1x1

[PyTorch]PyTorch中反卷积的用法

文章来源:https://www.jianshu.com/p/01577e86e506 pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True) class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_si

pytorch中如何处理RNN输入变长序列padding

一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练样例长度不同的情况,这样我们就会很自然的进行padding,将短句子padding为跟最长的句子一样. 比如向下图这样: 但是这会有一个问题,什么问题呢?比如上图,句子“Yes”只有一个单词,但是padding了5的pad符号,这样会导致LSTM对它的表示通过了非常多无用的字符,这样得到的句子表示就

Pytorch中的自编码(autoencoder)

Pytorch中的自编码(autoencoder) 本文资料来源:https://www.bilibili.com/video/av15997678/?p=25 什么是自编码 先压缩原数据.提取出最有代表性的信息.然后处理后再进行解压.减少处理压力 通过对比白色X和黑色X的区别(cost函数),从而不断提升自编码模型的能力(也就是还原的准确度) 由于这里只是使用了数据本身,没有使用label,所以可以说autoencoder是一种无监督学习模型. 实际在使用中,我们先训练好一个autoencod

PyTorch中Tensor的维度变换实现

对于 PyTorch 的基本数据对象 Tensor (张量),在处理问题时,需要经常改变数据的维度,以便于后期的计算和进一步处理,本文旨在列举一些维度变换的方法并举例,方便大家查看. 维度查看:torch.Tensor.size() 查看当前 tensor 的维度 举个例子: >>> import torch >>> a = torch.Tensor([[[1, 2], [3, 4], [5, 6]]]) >>> a.size() torch.Size

pytorch中的scatter_()函数

最近在学习pytorch函数时需要做独热码,然后遇到了scatter_()函数,不太明白意思,现在懂了记录一下以免以后忘记. 这个函数是用一个src的源张量或者标量以及索引来修改另一个张量.这个函数主要有三个参数scatter_(dim,index,src) dim:沿着哪个维度来进行索引(一会儿举个例子就明白了) index:用来进行索引的张量 src:源张量或者标量 self[index[i][j][k]][j][k] = src[i][j][k] # if dim == 0 self[i]