功能

均是用于扩展张量的维度

区别

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. springboot+mybatis实现数据分页(三种方式)

    项目准备 1.创建用户表 2.使用spring初始化向导快速创建项目,勾选mybatis,web,jdbc,driver 添加lombok插件 <?xml version="1.0&q ...

  2. Java学习day30

    线程分为用户线程和守护线程,虚拟机必须确保用户线程执行完毕,虚拟机不用等待守护线程执完毕 并发:同一个对象被多个线程同时操作,例如上万了同时抢100张票,手机银行和柜台同时取同一张卡里的钱 处理多线程 ...

  3. Java语言学习day09--7月08日

    今日内容介绍 1.方法基础知识 2.方法高级内容 3.方法案例      ###01方法的概述     * A: 为什么要有方法         * 提高代码的复用性      * B: 什么是方法 ...

  4. UML的三项基础

    UML的定义 UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号和文本语法提供标准. 五类模型图 用例视图:用例图 逻辑视图:类图.对象图.包图(我把包放在一起的图) 静态视图 ...

  5. 登录口爆破之ldap的md5加密、验证码认证

    ldap的md5加密配合autoDecoder插件.captcha-killer-modified插件 autoDecoder例 需要传入的数据包为: {"username":&q ...

  6. 推荐系统 TOP K 评价指标

    目录 符号说明 示例数据 一.Hit Rate 二.Recall 三.NDCG 符号说明 \(top\_k\): 当前用户预测分最高的k个items,预测分由高到低排序 $pos$: 当前用户实际点击 ...

  7. XSS攻击&CSRF攻击 ----Django解决方案

    XSS攻击: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执 ...

  8. 团队Arpha5

    队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 服务器网络 ...

  9. css自定义省略实例2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Centos 7以上安装Docker (亲测有效)

    一.安装前的准备 我的环境是VMware15虚拟机安装的Centos7,Linux内核是3.10.0-1062.4.1.e17.x86_64 1. 用root账户登录查看操作系统内核版本及相关信息 [ ...