reshape和view

reshape 和 view的具体功能和区别就不介绍了,可以直接查看官网,简单来说,就是reshape会改变各个维度在存储中的物理位置,而view的话,只会改变索引。

那么我们在使用的时候,到底是选哪个呢?

先说结论:差不多~

einsum和matmul

具体用法参见官网,当我们想在维度比较高的tensor上做复杂的矩阵乘法的时候,往往会选择用einsum,因为比较清晰简单,但是如果有办法用matmul的时候,是不是会犹豫两个的性能呢?

结论:在有matmul有broadcast的情况下,einsum更快。简单情况没有测试,但是简单情况直接用matmul比较方便。

如果用for循环来实现einsum可以实现的复杂功能的话,会慢很多,所以千万不要用for loop!!!!

代码

import torch
import time
from collections import defaultdictdef generate_tensor(shape, num=1):return [torch.rand(shape).cuda() for _ in range(num)]def bench_view(datas, shape_to, repeat=1):out = []for _ in range(repeat):res = []for d in datas:tmp = d.view(shape_to)res.append(tmp)out.append(torch.cat(res, dim=0)[:2].shape)print(len(out))def bench_reshape(datas, shape_to, repeat=1):out = []for _ in range(repeat):res = []for d in datas:tmp = d.reshape(shape_to)res.append(tmp)out.append(torch.cat(res, dim=0)[:2].shape)print(len(out))def bench_einsum(data1, data2, repeat=1):out = []for _ in range(repeat):res = []for i in range(len(data1)):tmp = torch.einsum('btnf, kfc -> btknc', data1[i], data2[i])res.append(tmp)out.append(torch.cat(res, dim=0)[:2].shape)print(len(out))def bench_matmul(data1, data2, repeat=1):out = []for _ in range(repeat):res = []for i in range(len(data1)):# NOTE: if use for loop the speed is too low.# tmp = []# for j in range(data1[i].shape[1]):#     left = data1[i][:,j,...].unsqueeze(dim=1)#     tmp.append(torch.matmul(left, data2[i]))# tmp = torch.stack(tmp, dim=1)tmp = torch.matmul(data1[i], data2[i])res.append(tmp)out.append(torch.cat(res, dim=0)[:2].shape)print(len(out), out[0])class StopWatch:def __init__(self) -> None:self.times = defaultdict(list)def tk(self, key='default'):tkn = time.time()if key in self.times:print(f'key={key}, elapsed:', tkn - self.times[key][-1])self.times[key].append(tkn)def test_view_and_reshape():datas = generate_tensor(shape=(128, 300,30,10), num=10)sw = StopWatch()sw.tk()bench_view(datas, shape_to=(100, 64, 60, 30), repeat=1000)# bench_reshape(datas, shape_to=(100, 64, 60, 30), repeat=1000)sw.tk()def test_einsum_matmul():data1 = generate_tensor(shape=(128, 1, 300,30), num=5)data2 = generate_tensor(shape=(20, 30, 30), num=5)sw = StopWatch()sw.tk()bench_einsum(data1, data2, repeat=1000)# bench_matmul(data1, data2, repeat=1000)sw.tk()if __name__ == '__main__':# test_view_and_reshape()test_einsum_matmul()

pytorch reshape view性能对比 (以及einsum, matmul)相关推荐

  1. pytorch cpu gpu性能对比

    经过同样的模型预测对比 gpu比cpu快38倍左右. gpu需要16ms 0 863001 1 22000 2 15001 3 16999 4 18000 5 15000 6 17000 7 1699 ...

  2. 科大讯飞/百度/阿里/腾讯(BAT)智能语音识别(ASR)性能对比选择预计价格分享 - pytorch中文网...

    最近在做智能客服的时候需要使用到语音识别,所以了解和对比了各家平台的语音识别对比和分析! 一.科大讯飞 1.语音听写即在线音识别查看Demo 把语音(≤60秒)转换成对应的文字信息,让机器能够&quo ...

  3. Pytorch优化器全总结(四)常用优化器性能对比 含代码

    目录 写在前面 一.优化器介绍 1.SGD+Momentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二.优化器对 ...

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

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

  5. TensorFlow与PyTorch模型部署性能比较

    TensorFlow与PyTorch模型部署性能比较 前言 2022了,选 PyTorch 还是 TensorFlow?之前有一种说法:TensorFlow 适合业界,PyTorch 适合学界.这种说 ...

  6. Java常用消息队列原理介绍及性能对比

    消息队列使用场景 为什么会需要消息队列(MQ)? 解耦  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一 ...

  7. python 速度 memmap_浅析Python 读取图像文件的性能对比

    浅析Python 读取图像文件的性能对比 发布时间:2020-08-30 16:31:06 来源:脚本之家 阅读:57 作者:BriFuture''s Blog 使用 Python 读取一个保存在本地 ...

  8. 各种URL生成方式的性能对比

    在上一篇文章中我们列举了各种URL生成的方式,其中大致可以分为三类: 直接拼接字符串(方法一及方法二) 使用Route规则生成URL(方法三) 使用Lambda表达式生成URL(方法四及方法五) 我们 ...

  9. Struts2、SpringMVC、Servlet(Jsp)性能对比 测试 。 Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照...

    2019独角兽企业重金招聘Python工程师标准>>> Struts2.SpringMVC.Servlet(Jsp)性能对比 测试 . Servlet的性能应该是最好的,可以做为参考 ...

最新文章

  1. linux之sort 命令详解
  2. Exchange Server 2016管理系列课件33.通讯组仲裁
  3. [C++] this指针
  4. Switch语句的参数是什么类型的?
  5. Linux 学习和教训
  6. OpenCV实战【2】HOG+SVM实现行人检测
  7. python dll load failed_python安装MySQLdb的问题 ImportError: DLL load failed
  8. kafka 查看消费者组
  9. [Bug]Superset通过pyhive连接Spark SQL表名获取失败
  10. keil5写c语言的步骤,keil5使用C51的详细操作步骤
  11. 多线程面试题:词频统计
  12. CSS:transform应用之立体魔方案例
  13. 太厉害了!28岁任北大博导的她,再获科学大奖!
  14. vue拼接html并绑定点击事件
  15. 找不到 cl.exe 解决办法
  16. YOLO5 旋转模型图片标注及训练
  17. 并不是越好的院校,考研专业课越难。
  18. linux 禁用IPv 6
  19. 46、linux开发笔记(主线更新)
  20. ORACLE基本使用

热门文章

  1. Docker学习和安装
  2. Docker 系列学习(二) 全面介绍docker
  3. 荣耀鸿蒙系统手机更新名单,华为鸿蒙系统开放升级,荣耀手机公布名单,18款领衔更新...
  4. 定制MFC多文档窗口的主框架背景
  5. ios7版 30天精通iPhone手机编程 第2天 第一个程序“Hello”
  6. vue-cli(vue脚手架)安装 详细教程
  7. python function gamma_Python中使用Gamma函数的累积分布函数
  8. 第十二篇 GoogLeNet——网络实战
  9. Php socket 考勤机,php-socket
  10. ProgressDialog总结