PyTorch 笔记(10)— Tensor 与 NumPy 相互转换、两种共享内存以及两者的广播法则
Tensor
与 NumPy
有很高的相似性,彼此之间的互操作也非常简单有效,需要注意的是 Tensor
与 NumPy
共享内存,由于 NumPy
历史悠久,所以遇到 Tensor
不支持的操作时,可以先转换成 NumPy
,处理后再转换成 Tensor
,转换开销很小。
1. Tensor 转化为 NumPy
In [1]: import torch as tIn [2]: a = t.ones(5)In [3]: a
Out[3]: tensor([1., 1., 1., 1., 1.])In [4]: b = a.numpy()In [5]: b
Out[5]: array([1., 1., 1., 1., 1.], dtype=float32)
2. NumPy 转化为 Tensor
In [6]: import numpy as npIn [7]: a = np.ones(5)In [8]: a
Out[8]: array([1., 1., 1., 1., 1.])In [9]: b =t.from_numpy(a)In [10]: b
Out[10]: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
值得注意的是,Torch
中的 Tensor
和 NumPy
中的 Array
共享内存位置,一个改变,另一个也同样改变。注意使用的是 b.add_()
。
In [10]: b
Out[10]: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)In [11]: b.add_(1)
Out[11]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)In [12]: a
Out[12]: array([2., 2., 2., 2., 2.])In [13]: b
Out[13]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
下面看使用 b.add()
发现 b 并没有改变。
In [13]: b
Out[13]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)In [14]: b.add(2)
Out[14]: tensor([4., 4., 4., 4., 4.], dtype=torch.float64)In [15]: a
Out[15]: array([2., 2., 2., 2., 2.])In [16]: b
Out[16]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
b.add_()
和 b.add()
的区别:
任何操作符都固定地在前面加上 _
来表示替换。例如:y.copy_(x)
,y.t_()
,都将改变 y
。
3. PyTorch 广播法则
当输入数组的某个维度的长度为 1 时,计算时沿此维度复制扩充成一样的形状。
可以通过以下两个函数组合手动实现广播法则:
unsqueeze
或者view
: 为数据的某一维的形状补 1,实现法则 1expand
或者expand_as
,重复数组,实现法则 3;该操作不会复制数组,所以不会占用额外空间
注意: repeat
实现和 expand
相类似的功能,但是 repeat
会把形同的数据复制多份,因此会占用额外的空间。
3.1 自动广播法则
In [17]: a = t.ones(3,2)In [18]: a
Out[18]:
tensor([[1., 1.],[1., 1.],[1., 1.]])In [19]: b = t.zeros(2,3,1)In [20]: b
Out[20]:
tensor([[[0.],[0.],[0.]],[[0.],[0.],[0.]]])
可以看到 a
是二维的,而 b
是三维的,但是可以通过广播法则直接进行相加计算。
In [23]: a + b
Out[23]:
tensor([[[1., 1.],[1., 1.],[1., 1.]],[[1., 1.],[1., 1.],[1., 1.]]])In [24]:
3.2 手动广播法则
In [24]: a.unsqueeze(0).expand(2,3,2) + b.expand(2,3,2)
Out[24]:
tensor([[[1., 1.],[1., 1.],[1., 1.]],[[1., 1.],[1., 1.],[1., 1.]]])In [25]:
4. Numpy 广播法则
- 让所有输入数组都向其中
shape
最长的数组看齐,shape
中不足的部分可通过在前面加 1 补齐; - 两个数组要么在某一维度的长度一致,要么其中一个为 1,否则不能计算;
PyTorch 笔记(10)— Tensor 与 NumPy 相互转换、两种共享内存以及两者的广播法则相关推荐
- Tensor 和 NumPy 相互转换
Tensor 和 NumPy 相互转换 我们很容易用numpy()和from_numpy()将Tensor和NumPy中的数组相互转换.但是需要注意的一点是: 这两个函数所产生的Tensor和NumP ...
- python把矩阵存为文件_python 读取文件并把矩阵转成numpy的两种方法
在当前目录下: 方法1: file = open('filename') a =file.read() b =a.split('\n')#使用换行 len(b) #统计有多少行 for i in ra ...
- python numpy读取数据_大神教你python 读取文件并把矩阵转成numpy的两种方法
导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...
- python大神读取_大神教你python 读取文件并把矩阵转成numpy的两种方法
导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...
- 在Windows 10上观看DVD的两种简便方法
在Windows 10上观看DVD的两种简便方法 - Win 10学院 - win10系统之家 (ghost580.com) 工具1: 5KPlayer 工具2: WinX DVD Ripper Pl ...
- pyqt5笔记 — 重写窗口方法closeEvent()的两种方式
@[TOC](pyqt5笔记 - 重写窗口方法closeEvent()的两种方式) 一.重写的作用 在开发过程中,经常会遇到一种需求:服务器端在主动发出一些信息给客户端,而在用户端关闭UI的时候,需要 ...
- (笔记)堆和栈的区别-两种不同的数据结构
堆栈其实是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 要点:堆:顺序随意. 栈:后进先出(Last-In/First-Out) 堆和栈 ...
- pytorch 语义分割loss_关于pytorch语义分割二分类问题的两种做法
形式1:输出为单通道 分析 即网络的输出 output 为 [batch_size, 1, height, width] 形状.其中 batch_szie 为批量大小,1 表示输出一个通道,heigh ...
- Android开发笔记(一百二十)两种侧滑布局
SlidingPaneLayout SlidingPaneLayout是Android在android-support-v4.jar中推出的一个可滑动面板的布局,在前面< Android开发笔记 ...
最新文章
- float js 正则 验证_使用HTML和Vuejs进行表单验证
- python glob 模块 map函数
- 第一个问题就难倒我了!
- 1.18.2.10 解释表:Table.explain、物理执行计划等
- supervisor nginx_Supervisor 的使用和进阶 (3)
- Java中反射机制(Reflection)学习
- 容器中Java RAM的使用:不会丢失内存的5大技巧
- UCI机器学习数据集
- go语言os.exit(1)_Go语言os包用法简述
- 第四:Python发送邮件时实现生成测试报告/邮件自动发送
- 多媒体计算机主机有哪些硬件,现在市场上多媒体电脑主要有哪些硬件部分组成?...
- 有关计算机学的心得体会,关于计算机学习心得体会大全
- java两个日期相减_java将两个日期相减得到天数
- 网约车定价策略:手机越贵打车越贵?
- PCIE实现PIO模式寄存器读写调试记录
- pytorch:线性回归实战
- 2019年秋季校招前端面经
- 【Celery】Celery的简易部署和应用
- css3切角文本框_CSS3如何实现4个切角
- 图像识别教程(百度AI开放平台)