pytorch 中 repeat 和 expend 的功能和区别
功能
均是用于扩展张量的维度
区别
tensor.expand(*sizes)
将张量中单维度(singleton dimensions,即张量在某个维度上为1的维度,exp(1,2,3),其中在第一个维度上就是单维度)扩展到指定的size大小(size为扩展后的张量在单维度处的维度),而张量中其他的非单维度的位置,可以填写原始维度的大小或者-1,exp: tensor.expand(size,2,3),或者tensor.expand(size,-1,-1)。注意,expand只作用于张量的单维度上。--> 类似于数据的复制,在batch维度上的扩展。
同时,expand不会为扩展维度后的整个张量重新分配内存,而仅仅是原始张量上的一个视图(view)
exp:(采用CSDN博客的例子)
import torch
a = torch.tensor([1, 0, 2])
b = a.expand(2, -1) # 第一个维度为升维,第二个维度保持
# b为 tensor([[1, 0, 2], [1, 0, 2]])
a = torch.tensor([[1], [0], [2]])
b = a.expand(-1, 2) # 保持第一个维度,第二个维度只有一个元素,可扩展
# b为 tensor([[1, 1],
# [0, 0],
# [2, 2]])
此外,tensor.expand_as(tensor) 函数可以将tensor作为一种size传入,并进行指定的扩展。
exp:(采用CSDN博客的例子)
import torch
a = torch.tensor([1, 0, 2])
b = torch.zeros(2, 3)
c = a.expand_as(b) # a照着b的维度大小进行拓展
# c为 tensor([[1, 0, 2],[1, 0, 2]])
tensor.repeat(*sizes)
可以对于张量的非单维度进行扩展。size为原始的张量在各个维度上的复制次数。且其复制有先后顺序之分,按照原始张量的各个维度依次进行size指定大小的复制。与expand不同的是不需要复制的维度的地方用1表示,而不是-1或者原维度。
其复制后返回的张量会重新拥有一个独立存储区。
exp:
import torch
x = torch.tensor([1, 2, 3])
print(x)
y = x.repeat(2, 2) # 先在行的维度扩展2倍 再在列的维度扩展2倍
print(y)
z = x.repeat(1, 2) # 先在行的维度扩展2倍 再在列的维度扩展2倍
print(z)
>> tensor([1, 2, 3])
>> tensor([[1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3]])
>> tensor([1, 2, 3, 1, 2, 3])
此外 torch.repeat_interleave(tensor, repeats, dim=None) 可以只对指定维度进行复制, 不是把整个待复制张量当作一个整体,而是按张量元素进行操作。
tensor: 传入的数据为tensor
repeats: 复制的份数。可以是单个数,或者一个tensor形式的数组(必须为一维数组,且数组的长度要和dim对应的维度的大小相同)。
dim: 要复制的维度,可设定为0/1/2....., 若不指定dim参数,则dim默认为None ,即将输入tensor扁平化。也就是将把给定的输入张量展平(flatten)为向量,然后将每个元素重复repeats次,并返回重复后的张量(此时的repeats只能是个数而不能是数组)。
exp:
import torch
a=torch.arange(10).view(2,5)
## 常规 ##
b=torch.repeat_interleave(a,3,dim=0)
c=torch.repeat_interleave(a,3,dim=1)
## 不指定dim,默认为None ##
d=torch.repeat_interleave(a,2)
## repeats 为tensor数组 dim对应的维度大小和数组大小匹配 ##
e=torch.repeat_interleave(a,torch.tensor([2,3]),dim=0)
## repeats 为tensor数组 dim对应的维度大小和数组大小不匹配 ##
f=torch.repeat_interleave(a,torch.tensor([2,3]),dim=1)
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
>>
# 原数组 --> a
tensor([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
# 沿第一维度重复后的数组 --> b -> 按元素操作,对应维度的元素都复制repeats后,再进行后面维度的元素的复制
tensor([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[5, 6, 7, 8, 9],
[5, 6, 7, 8, 9]])
# 沿第二维度重复后的数组 --> c
tensor([[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
[5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9]])
>>
# 不指定dim时,扁平化且重复两次 --> d
tensor([0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9])
>>
# 第一行重复两次,第二行重复三次 --> e
tensor([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[5, 6, 7, 8, 9],
[5, 6, 7, 8, 9]])
>>
# dim=1的原tensor的维度的大小为5,而repeats数组大小为2,不匹配,报错
RuntimeError: repeats must have the same size as input along dim
TIPS:矩阵的维度的判断
从最外层的[ ] 依次向里的[ ] 进行分析,其中 在一个[ ] 的元素是位于同一行,行里面有几个元素一共就会有几列(在不存在空行的情况下)
或者说 从外往里进行计数,比如np.array([[[1,1,1],[1,2,1]]]) ,其去除最外面的 [ ] 后 为[[1,1,1],[1,2,1]],此时只有一个最大的 [ ],再去除一层 [ ]后为[1,1,1],[1,2,1],此时有两个 [ ] 元素, 在对于其中一个[ ]元素 再去除 一层 [ ] 后为 1,1,1,此时还剩3个最内层的元素。所有其shape为 (1, 2, 3)
下面是一些实际的计算的例子:
import numpy as np
c = np.array([1,1,1])
print(c.shape)
c = np.array([[1],[1],[1]])
print(c.shape)
c = np.array([[1,1,1],[1,2,1]])
print(c.shape)
c = np.array([[[1,1,1],[1,2,1]]])
print(c.shape)
c = np.array([[1,1,1],[],[1,2,1]])
print(c.shape)
>> (3,)
>> (3, 1)
>> (2, 3)
>> (1, 2, 3)
>> (3,)
pytorch 中 repeat 和 expend 的功能和区别的更多相关文章
- pytorch中使用cuda扩展
以下面这个例子作为教程,实现功能是element-wise add: (pytorch中想调用cuda模块,还是用另外使用C编写接口脚本) 第一步:cuda编程的源文件和头文件 // mathutil ...
- pytorch中调用C进行扩展
pytorch中调用C进行扩展,使得某些功能在CPU上运行更快: 第一步:编写头文件 /* src/my_lib.h */ int my_lib_add_forward(THFloatTensor * ...
- 详解Pytorch中的网络构造,模型save和load,.pth权重文件解析
转载:https://zhuanlan.zhihu.com/p/53927068 https://blog.csdn.net/wangdongwei0/article/details/88956527 ...
- PyTorch中的C++扩展
今天要聊聊用 PyTorch 进行 C++ 扩展. 在正式开始前,我们需要了解 PyTorch 如何自定义module.这其中,最常见的就是在 python 中继承torch.nn.Module,用 ...
- PyTorch中view的用法
相当于numpy中resize()的功能,但是用法可能不太一样. 我的理解是: 把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其 ...
- 第五章——Pytorch中常用的工具
2018年07月07日 17:30:40 __矮油不错哟 阅读数:221 1. 数据处理 数据加载 ImageFolder DataLoader加载数据 sampler:采样模块 1. 数据处理 ...
- PyTorch 中 weight decay 的设置
先介绍一下 Caffe 和 TensorFlow 中 weight decay 的设置: 在 Caffe 中, SolverParameter.weight_decay 可以作用于所有的可训练参数, ...
- PyTorch中的MIT ADE20K数据集的语义分割
PyTorch中的MIT ADE20K数据集的语义分割 代码地址:https://github.com/CSAILVision/semantic-segmentation-pytorch Semant ...
- PyTorch中的Batch Normalization
Pytorch中的BatchNorm的API主要有: 1 torch.nn.BatchNorm1d(num_features, 2 3 eps=1e-05, 4 5 momentum=0.1, 6 7 ...
随机推荐
- python解释器安装与使用
Python解释器安装与使用 首先了解下python是由'龟叔' 也就是右边这位和蔼的大叔叔 全名'Guido van Rossum'在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. ...
- eclipse 下 SpringBoot 工程使用Maven打包
eclipse 下 SpringBoot 工程使用Maven打包 1. pom.xml 添加打包配置 点击查看代码 <!-- 打包使用 --> <build> <plug ...
- swagger不再是第一选择了
一.前言 工欲善其事,必先利其器 最近对 API 接口协作的软件研究了好久,市面上的软件都下载用了一轮,下面给大家介绍其中的最强「神器」 Apifox. Apifox 官网:apifox.cn 在 ...
- Go xmas2020 学习笔记 08、Functions, Parameters & Defer
08-Functions, Parameters. functions. first class. function signatures. parameter. pass by value. pas ...
- 2021.08.09 P6225 抑或橙子(树状数组)
2021.08.09 P6225 抑或橙子(树状数组) 重点: 1.异或用法 题意: Janez 喜欢橙子!他制造了一个橙子扫描仪,但是这个扫描仪对于扫描的每个橙子的图像只能输出一个 3232 位整数 ...
- XCTF练习题---MISC---再见李华
XCTF练习题---MISC---再见李华 flag:Stay hungry, Stay foolish. 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一张图片,其中有MD5,破解一下没有 ...
- php 迭代器的学习
在PHP中有一些预定义的类,比如迭代器类,有SPL提供.常用的几个类: Iterator------最基本的迭代器 IteratorAggregate --------可以提供一个迭代器的对象,但它本 ...
- R树判断点在多边形内-Java版本
1.什么是RTree 待补充 2.RTree java依赖 rtree的java开源版本在GitHub上:https://github.com/davidmoten/rtree 上面有详细的使用说明 ...
- 程序员不得不知道的 API 接口常识
说实话,我非常希望两年前刚准备找实习的自己能看到本篇文章,那个时候懵懵懂懂,跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写. 至今我仍清晰地记得,那个电商教程是怎么定义接口的: 管它是增加.修 ...
- java高级用法之:绑定CPU的线程Thread-Affinity
目录 简介 Java Thread Affinity简介 AffinityLock的使用 使用API直接分配CPU 总结 简介 在现代计算机系统中,可以有多个CPU,每个CPU又可以有多核.为了充分利 ...