Pytorch中view, transpose, permute等方法的区别

  • transpose与permute的区别与联系
  • view 与transpose与permute的区别与联系

transpose与permute的区别与联系

这两个操作比较相似, transpose每次将任意两个指定的dim进行交换,相当于是2D array的转置操作,而permute可以一次将Tensor变换到任意的dimensions sequence的排列Permute操作可以有1至多步的Transpose操作实现
例子:

data = th.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
data_t = data.transpose(1, 2)
data_p = data.permute(2, 0, 1)
data_t_t = data_t.transpose(0, 1)
print('data_t', data_t)
print('data_p', data_p)
print(data_t_t == data_p)
print(data_t.data_ptr() == data.data_ptr() and data_t.is_contiguous() != data.is_contiguous())
print(data_t.stride()[1] == data.stride()[2] and data_t.stride()[2] == data.stride()[1])

Output:

注: transpose操作产生的新的Tensor与原始Tensor相比,除了stride属性发生变化(相关的dims的strides信息同样进行transpose)外并无区别,这两个Tensor只想同一个memory。


view 与transpose与permute的区别与联系

transpose与permute会实实在在的根据需求(要交换的dim)把相应的Tensor元素的位置进行调整, 而view 会将Tensor所有维度拉平成一维 (即按行,这也是为什么view操作要求Tensor是contiguous的原因),然后再根据传入的的维度(只要保证各维度的乘积=总元素个数即可)信息重构出一个Tensor

# -*- coding: utf-8 -*-
import numpy as np
import torch as thdata_t = data.transpose(1, 2)
data_view = data.view(2, 3, 2)print('data_t', data_t)
print('data_view', data_view)
print(data_t.shape == data_view.shape)
print(data_t.is_contiguous())
# data_t_view = data_t.view(2, 2, 3)

Output:

当Tensor不是contiguous时,会报如下错误

Pytorch中view, transpose, permute等方法的区别相关推荐

  1. Pytorch中view()方法和resize()方法的区别

    1.view() 通过tensor.view方法可以调整tensor的形状,但必须保证调整前后元素总数一致.view不会修改自身的数据,返回的新tensor与源tensor共享内存,即更改其中一个,另 ...

  2. **Pytorch 中view函数和reshape函数的区别*

    Pytorch 中view函数和reshape函数的区别(我是一名大一刚学计算机的学生 希望我的说法对你有帮助) 首先:要了解这个问题我们要先了解一个基本知识 张量的储存方式 跟据图片我们可以清楚的看 ...

  3. android add fragment,fragment中的add和replace方法的区别浅析

    使用 FragmentTransaction 的时候,它提供了这样两个方法,一个 add , 一个 replace ,对这两个方法的区别一直有点疑惑. 我觉得使用 add 的话,在按返回键应该是回退到 ...

  4. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...

  5. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  6. java——Scanner中nextLine()方法和next()方法的区别

    遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...

  7. pytorch:深入理解 reshape(), view(), transpose(), permute() 函数

    文章目录 前言 1. reshape() 2. view() ① 1 阶变高阶 1 阶变 2 阶 1 阶变 3 阶 1 阶变 4 阶 1 阶变 m 阶 ② 2 阶变 m 阶 ③ 3 阶变 m 阶 ④ ...

  8. Cesium 中两种添加 model 方法的区别

    概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...

  9. jquery中prop()方法和attr()方法的区别浅析

    引用:http://www.jb51.net/article/41170.htm 官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了prop()这个新方法,不可能没用吧,那什么时候该 ...

  10. ExtJS中listener方法和handler方法的区别

    listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...

最新文章

  1. LeetCode Algorithm 剑指 Offer 06. 从尾到头打印链表
  2. Error No matching provisioning profiles found
  3. Lind.DDD.RedisClient~对StackExchange.Redis调用者的封装及多路复用技术
  4. pb怎么设置 allow editing_Deno TCP Echo Server 是怎么运行的?
  5. 通过CImageList加载图标 报错
  6. rt-thread驱动篇(02)---STM32F429板卡外设驱动添加
  7. matlab 图像处理之Refined Lee滤波
  8. Hive数据仓库中历史拉链表实践
  9. redis和zk实现分布式锁的优缺点
  10. Maven项目 混合编译Java和Scala
  11. Android存储空间总结
  12. 一步一步学RenderMonkey
  13. 项目集锦 | 易基因DNA羟甲基化5hmC测序研究成果
  14. 风影ASP.NET基础教学 4 验证控件
  15. 前端基础知识学习之-ShadowDOMLightDOM
  16. 可视化—三维图的绘制
  17. mysql分数占百分比查询
  18. 中国人寿张青南:中国人寿如何基于容器构建PaaS平台
  19. Java基础|一图总结Java File类(与IO密切相关)
  20. 2022-2028年中国高速铁路行业投资分析及前景预测报告

热门文章

  1. jQuery jQuery on()方法
  2. 并查集基础 模板题 hdu1232 畅通工程
  3. ubuntu14.04中mysql的安裝及utf8编码集配置
  4. HDU-2036 改革春风吹满地 (多边形面积求解)
  5. Jquery—对$()的总结
  6. 运行uiautomatorviewer.bat报错No suitable Java found
  7. 将两个数组首尾相连c语言,一个百度笔试中的首尾相连的珠子问题解法
  8. linux查看python安装库_linux下怎么查看python的包
  9. python中的超类_Python中的抽象超类
  10. ROS踩坑日记(2)----ERROR: cannot download default sources list from: