Tensor维度变换
有点意思
1 view/reshape
先来个4维tensor,实际意义是一个4张图片,通道一个,就是灰度图片,然后长宽都是28的图片
它的shape这个样子
这个直接给怼成了2维的,一个 4 x 784
reshape和view一个功能
其实完全随意可以升降维,但是要还原的话,shape的顺序要对,不然就不是原来的数据, 看看c和d就明白了
还有最好是用这种,size()的方式,或者你自己记得住也行,view或者reshape的shape要满足一个条件,就是元素要一样多就是numel(),多了,少了,都会报错的
2 squeeze vs unsqueeze
挤压和增加。。减少维度和增加维度, 基本的原则就是numel不能变
unsqueeze,这个就是在什么维度加1维,但是不能超过本身得维度限制,也是左闭又开[-a.dim()-1, a.dim() ]
比如 你有4维 变量dim得值只能是[-5, 4], -5->4 正值就在之前插入,负值就是在之后
其实view 和 shape 可以达到同样得效果,就是得多写点东东
下面就能明白unsqueeze的赋值的对应关系,就是在哪个位置加维,一次1维, reshape也行,就是写起来有点长,估计是怕维数很大,就有的unsqueeze和squeeze
squeeze 压缩饼干,干掉一个维度
这里只能干掉存在的维度,4维的维度索引就是[-4,3],而且必须这个维度的值为1才能干掉,
3 expand / repeat
expand , 扩展,只能扩展原来维度的size为1的东东,,不让你会报错的,不想写可以写-1
只能扩展原来维度的size为1的东东,,不让你会报错的,不想写可以写-1
这个是 expand的用法
repeat
慎用,小心把自己搞懵了
这个函数其实是重复当前的维度里面的数据几次的意思,看例子
4 .t
转换,2d的转置,就是这个样子的,其他维会直接报错
5 transpose
交换是好的,就是要记住自己都干了啥子,transpose之后需要再view的话,记得用下contiguous(),不要就报错了,一定要记得维度信息,不然,自己一通变之后数据就回不去了,b就是变异了,c回去了,保持清醒
6 permute
这个是transpose的加强版
输入的必须是所有的索引,不能多,不能少,不能重复
有点晕