功能

均是用于扩展张量的维度

区别

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 的功能和区别的更多相关文章

  1. pytorch中使用cuda扩展

    以下面这个例子作为教程,实现功能是element-wise add: (pytorch中想调用cuda模块,还是用另外使用C编写接口脚本) 第一步:cuda编程的源文件和头文件 // mathutil ...

  2. pytorch中调用C进行扩展

    pytorch中调用C进行扩展,使得某些功能在CPU上运行更快: 第一步:编写头文件 /* src/my_lib.h */ int my_lib_add_forward(THFloatTensor * ...

  3. 详解Pytorch中的网络构造,模型save和load,.pth权重文件解析

    转载:https://zhuanlan.zhihu.com/p/53927068 https://blog.csdn.net/wangdongwei0/article/details/88956527 ...

  4. PyTorch中的C++扩展

    今天要聊聊用 PyTorch 进行 C++ 扩展. 在正式开始前,我们需要了解 PyTorch 如何自定义module.这其中,最常见的就是在 python 中继承torch.nn.Module,用 ...

  5. PyTorch中view的用法

    相当于numpy中resize()的功能,但是用法可能不太一样. 我的理解是: 把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其 ...

  6. 第五章——Pytorch中常用的工具

    2018年07月07日 17:30:40 __矮油不错哟 阅读数:221   1. 数据处理 数据加载 ImageFolder DataLoader加载数据 sampler:采样模块 1. 数据处理 ...

  7. PyTorch 中 weight decay 的设置

    先介绍一下 Caffe 和 TensorFlow 中 weight decay 的设置: 在 Caffe 中, SolverParameter.weight_decay 可以作用于所有的可训练参数, ...

  8. PyTorch中的MIT ADE20K数据集的语义分割

    PyTorch中的MIT ADE20K数据集的语义分割 代码地址:https://github.com/CSAILVision/semantic-segmentation-pytorch Semant ...

  9. PyTorch中的Batch Normalization

    Pytorch中的BatchNorm的API主要有: 1 torch.nn.BatchNorm1d(num_features, 2 3 eps=1e-05, 4 5 momentum=0.1, 6 7 ...

随机推荐

  1. python+pytest接口自动化(13)-token关联登录

    在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示 ...

  2. Spring Boot-使用Spring Initializer快速创建Spring Boot项目

    File->project->Spring Initializer 点击next 点击下一步即可,如果是第一次可能需要下载jar包,如下图 resources文件中的目录结构如上图所示 s ...

  3. pod和容器(容易混淆的地方)

    在Kubenetes中,所有的容器均在 pod 中运行,一个pod可以承载一个或者多个相关的docker容器(或rkt,以及用户自定义容器),同一个Pod中的容器可以部署在同一个物理机器(可以叫宿主机 ...

  4. STL空间分配器源码分析(一)

    一.摘要 STL的空间分配器(allocator)定义于命名空间std内,主要为STL容器提供内存的分配和释放.对象的构造和析构的统一管理.空间分配器的实现细节,对于容器来说完全透明,容器不需关注内存 ...

  5. 阶段性总结linux(1)

    学习安装linux系统 [网络连接方式] 桥接 ,好比所有人都在25期教室,公用这个教室的局域网段 192.168.11.0~192.168.11.255 教室内有60个同学,插上了网线,所有人都是 ...

  6. jsp第二周作业

    1.p39 实验2 显示当前时间,并输出上午(0-12)好,下午好(13-17),晚上好(18-23) <%@ page language="java" import=&qu ...

  7. SMTP协议解读以及如何使用SMTP协议发送电子邮件

    电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件.SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名.   相较于POP3而言 ...

  8. 使用Proftpd支持FTP/SFTP权限管控

    简介 FTP 文件传输协议,FTP由FTP服务器(存储文件)和FTP客户端(通过FTP协议访问FTP服务器上的资源)组成 传输方式 主动模式(Port) 客户端与服务器端的TCP 21端口建立连接 - ...

  9. XCTF练习题---MISC---easycap

    XCTF练习题---MISC---easycap flag:FLAG:385b87afc8671dee07550290d16a8071 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一个流量 ...

  10. 《Streaming Systems》第二章: 数据处理中的 What, Where, When, How

    本章中,我们将通过对 What,Where,When,How 这 4 个问题的回答,逐步揭开流处理过程的全貌. What:计算什么结果? 也就是我们进行数据处理的目的,答案是转换(transforma ...