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

pytorch张量创建、变换

张量基本概念张量是一个高维数组在pytorch0.4.0之前,torch.autograd包中存在Variable这种数据类型,主要是用于封装Ten

张量基本概念

张量是一个高维数组

在 pytorch0.4.0之前,torch.autograd 包中存在 Variable 这种数据类型,主要是用于封装 Tensor,进行自动求导 。

构建神经网络的计算图时,需用torch.autograd.Variable将Tensor包装起来,形成计算图中的节点。backward()自动计算出所有需要的梯度。来针对某个变量执行grad获得想要的梯度值。

import torch
from torch.autograd import Variablex=Variable(torch.randn(2,2),requires_grad=True)
y=x+3
z=y*y*3out=z.mean()
out.backward()print(x.grad)

 Variable具有以下几个属性。

 在 PyTorch 0.4.0 之后,Variable 并入了 Tensor。在之后版本的 Tensor 中,除了具有上面 Variable的5个属性,还有另外3个属性。


张量的创建


直接创建


torch.tensor()

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False) -> Tensor

  • data:数据,可以是list,也可以是numpy
  • dtype:数据类型,默认和data一致
  • device:tensor所在的设备
  • requires_grad:是否需要梯度,默认False,在搭建神经网络时需要将求导的参数设为True

torch.from_numpy()

将ndarray转换成tensor,两者共享内存,当修改一个数据时另一个也会被修改

import torch
import numpy as np
array_b = np.array([1, 2, 3, 4])
tensor_b = torch.from_numpy(array_b)
print(array_b,tensor_b)
###两者共用内存,其中一个改变另一个也会改变
array_b[0]=111
print(array_b,tensor_b)

依数值创建


torch.zeros()依size创建全0的张量

torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) -> Tensor

其他,例如torch.ones(),torch.eyes(),torch.arange()


依概率创建

torch.normal()生成正态分布

torch.randn()生成标准正态分布

torch.rand()生成均匀分布

torch.randperm()生成0-n-1的随机排列,常用于生成索引

torch.bernoulli()以input为概率生成伯努利分布


张量的操作


张量的拼接

● torch.cat()将tensor序列按维度进行拼接,不会扩张张量的维度
● torch.stack()将tensor序列在新建的维度上进行拼接,会扩张张量的维度

import torcha = torch.rand((2,3))
print(a.shape)b=torch.cat([a,a],dim=1)
#b=torch.stack([a,a],dim=0)print(b.shape)

张量的切分

torch.chunk():将张量按维度进行平均切分,返回值是张量列表

import torcha = torch.rand((2, 6))
a_chunk = torch.chunk(a, dim=1, chunks=6)for idx, t in enumerate(a_chunk):print('第{}个张量:{},shape is {}'.format(idx, t, t.shape))

torch.split() 按维度dim将张量进行切分

import torcha = torch.rand((2, 6))
a_chunk = torch.split(a, [2,2,1,1],dim=1)for idx, t in enumerate(a_chunk):print('第{}个张量:{},shape is {}'.format(idx, t, t.shape))

张量变换

.transpose()交换张量的两个维度。常用于图像的变换,比如把chw变换为hwc
.permute:可以对多个维度进行变换
.squeeze()压缩长度为1的维度,dim若为None,移除所有长度为1的轴,若指定维度,当且仅当该轴的长度为1时,可以被移除
.unsqueeze():依据dim扩张维度

.reshape()变换张量的形状,当张量在内存中是连续时,新张量和input共享数据内存

.view()只能改变连续的(contiguous)张量,返回的张量和原张量共享基础数据


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了一个编程问题,要求求解一个给定n阶方阵的鞍点个数。通过输入格式的描述,可以了解到输入的是一个n阶方阵,每个元素都是整数。通过输出格式的描述,可以了解到输出的是鞍点的个数。通过题目集全集传送门,可以了解到提供了两个函数is_line_max和is_rank_min,用于判断一个元素是否为鞍点。本文还提供了三个样例,分别展示了不同情况下的输入和输出。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • 今日份分享:Flutter自定义之旋转木马
    今日份分享:Flutter自定义之旋转木马-先上图,带你回到童年时光:效果分析子布局按照圆形顺序放置且平分角度子布局旋转、支持手势滑动旋转、快速滑动抬手继续旋转、自动旋转支持X轴旋 ... [详细]
author-avatar
捕风的默小墨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有