热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pytorch换版本_自用Pytorch学习笔记(六:Tensor变换)(基于1.1版本)

1、view用来改变shape。调整Tensor的shape(通过返回一个新的Tensor),在老版本中这个函数是view(),功能上都是一样的。ato

1、view用来改变shape。

调整Tensor的shape(通过返回一个新的Tensor),在老版本中这个函数是view(),功能上都是一样的。

a=torch.rand(4,1,28,28)

print(a.shape)#torch.Size([4, 1, 28, 28])

#将后3维合并

print(a.view(4,28*28))#

print(a.view(4,28*28).shape)#torch.Size([4, 784])

#将前3维合并

print(a.view(4*28,28).shape)

#将前2维合并

print(a.view(4*1,28,28).shape)

2、unsqueeze增加维度

正的索引是在那个维度原本的位置前面插入这个新增加的维度,负的索引是在那个位置之后插入。a=torch.rand(4,1,28,28)

print(a.shape)

print(a.unsqueeze(0).shape) # 在0号维度位置插入一个维度

print(a.unsqueeze(-1).shape) # 在最后插入一个维度

print(a.unsqueeze(3).shape) # 在3号维度位置插入一个维度

输出:torch.Size([4, 1, 28, 28])

torch.Size([1, 4, 1, 28, 28])

torch.Size([4, 1, 28, 28, 1])

torch.Size([4, 1, 28, 1, 28])

3、squeeze用来删减维度

删减维度实际上是一个压榨的过程,直观地看是把那些多余的[]给去掉,也就是只是去删除那些size=1的维度。import torch

a = torch.Tensor(1, 4, 1, 9)

print(a.shape)

print(a.squeeze().shape) # 能删除的都删除掉

print(a.squeeze(0).shape) # 尝试删除0号维度,ok

print(a.squeeze(2).shape) # 尝试删除2号维度,ok

print(a.squeeze(3).shape) # 尝试删除3号维度,3号维度是9不是1,删除失败

输出:

torch.Size([1, 4, 1, 9])

torch.Size([4, 9])

torch.Size([4, 1, 9])

torch.Size([1, 4, 9])

torch.Size([1, 4, 1, 9])

4、expand用来维度扩展

expand就是在某个size=1的维度上改变size,改成更大的一个大小,实际就是在每个size=1的维度上的标量的广播操作。

import torch

b = torch.rand(32)

f = torch.rand(4, 32, 14, 14)

# 想要把b加到f上面去

# 先进行维度增加

b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)

print(b.shape)#torch.Size([1, 32, 1, 1])

# 再进行维度扩展

b = b.expand(4, -1, 14, 14) # -1表示这个维度保持不变,这里写32也可以

print(b.shape)

运行结果:

torch.Size([1, 32, 1, 1])

torch.Size([4, 32, 14, 14])

针对评论区的补充:input = torch.randn(4, 3)

input.size()#(4,3)

input = input.expand(2, -1, -1)#后面的两个-1表示原来input的后两维不动,只在第一维扩充

#但是这种做法仅限于要扩展的tensor和原来的tensor只差一个维度,且在第一维扩充,如果需要在其它维度扩展,需要先用unsqueeze增加维度,然后再扩展。

5、repeat维度重复

repeat就是将每个位置的维度都重复至指定的次数,以形成新的Tensor。repeat会重新申请内存空间。# 维度增加...

print(b.shape)

# 维度重复,32这里不想进行重复,所以就相当于"重复至1次"

b = b.repeat(4, 1, 14, 14)

print(b.shape)

结果:

torch.Size([1, 32, 1, 1])

torch.Size([4, 32, 14, 14])

6、转置:只适用于dim=2的Tensor。c = torch.Tensor(2, 4)

print(c.t().shape)#torch.Size([4, 2])

7、维度交换

注意这种交换使得存储不再连续,再执行一些reshape的操作肯定是执行不了的,所以要调用一下contiguous()使其变成连续的维度。d = torch.Tensor(6, 3, 1, 2)

print(d.transpose(1, 3).contiguous().shape) # 1号维度和3号维度交换

结果:torch.Size([6, 2, 1, 3])

下面这个例子比较一下每个位置上的元素都是一致的,来验证一下这个交换->压缩shape->展开shape->交换回去是没有问题的。

e = torch.rand(4, 3, 6, 7)

e2 = e.transpose(1, 3).contiguous().reshape(4, 7 * 6 * 3).reshape(4, 7, 6, 3).transpose(1, 3)

print(e2.shape)

# 比较下两个Tensor所有位置上的元素是否都相等

print(torch.all(torch.eq(e, e2)))

运行结果:

torch.Size([4, 3, 6, 7])

tensor(1, dtype=torch.uint8)

8、permute

如果四个维度表示上节的[batch,channel,h,w] ,如果想把channel 放到最后去,形成[batch,h,w,channel] ,那么如果使用前面的维度交换,至少要交换两次(先13交换再12交换)。而使用permute可以直接指定维度新的所处位置,方便很多。

h = torch.rand(4, 3, 6, 7)

print(h.permute(0, 2, 3, 1).shape)

结果:torch.Size([4, 6, 7, 3])



推荐阅读
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • Python实现Redis订阅发布功能
    本文介绍了使用Python实现Redis订阅发布功能的方法,包括创建RedisHelper类、发布消息和订阅消息的操作。通过该功能,可以实现消息的发布和订阅,并在程序中进行相应的处理。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 语义分割系列3SegNet(pytorch实现)
    SegNet手稿最早是在2015年12月投出,和FCN属于同时期作品。稍晚于FCN,既然属于后来者,又是与FCN同属于语义分割网络 ... [详细]
author-avatar
短暂的幸福2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有