当前位置: 首页 > news >正文

pytorch中一些有关tensor的操作

pytorch官网:https://pytorch.org/tutorials/

pyorch中的tensor译作“张量”,简单理解,就是 多维数组 ,与numpy中的ndarray非常相似。

既然是深度学习的工具,tensor还具有 自动求梯度GPU计算 等强大功能。

常用操作

创建tensor:
torch.tensor([[1,2],[3,4]]) 直接根据数据创建
torch.empty(2, 3) 创建一个 未初始化的tensor
torch.zeros(2, 3, dtype=torch.long) 创建一个long型全0tensor
torch.rand(2, 3) 创建一个随机初始化的tensor

x = x.new_ones(2, 3) 通过现有的tensor创建新tensor,创建的新tensor具有相同的torch.dtype和torch.device
x = torch.randn_like(x, dtype=torch.float) 指定新的数据类型

获取tensor的形状:
x.shape --> tensor属性
x.size() --> tendor方法

其他函数:
在这里插入图片描述

算数操作:

  1. x+y
  2. x.add(y)

有关索引:
支持方括号切片索引:y = x[:,0]
函数:
在这里插入图片描述

改变形状:
1.view()
y = x.view(6)
y = x.view(-1, 2)
注:该方法的返回与原tensor共享data,即view仅仅从观察角度改变了张量,内部数据并未改变。所以当更改其中一个tensor时,另一个tensor也会跟着改变。

2.reshape()
此函数并不能保证返回的是其拷贝,不推荐。

3.clone()+view()
推荐,先使用clone()方法创建一个副本,再用view()改变形状。

一些与线性代数有关的运算函数:
在这里插入图片描述
tensor也有广播机制。

tensor与ndarray相互转换:

  1. tensor转ndarray : x = torch.ones(3); y = x.numpy()
  2. numpy转tensor : torch.from_numpy()
    注意:以上两种方式tensor和ndarray共享内存!! 即,其中一个改变,另一个也会跟着改变。
  3. torch.tensor()也可以将ndarray转换成tensor,但是不共享内存,是产生copy(消耗更多时间和空间)。

CPU与GPU之间移动:
x.to(“cpu”,torch.double)

自动求梯度

pytorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。

在这里插入图片描述
创建一个tensor x,设置其属性requires_grad=True,在接下来关于x的运算中,就会创建计算图,是用grad_fn属性所记录的,这个属性其实就是一个Function对象。

创建完了计算图,就可以求梯度了,需要首先调用y.backward()进行反向传播。然后再获取x的grad属性,就是梯度了。

  • 可以使用方法 .requires_grad(True/False)来修改tensor对象的requires_grad属性。

注意:grad在反向传播的过程中是累加的,意味着每一次运行反向传播,都会累加之前的梯度。所以,一般在反向传播之前需要把梯度清零。 x.grad.data.zero_()
注意:y.backward()时,y只能是标量,否则需要传入一个与y同行的tensor,使其变成标量。无法完成向量对向量的求导。只能完成标量对向量求导。

相关文章:

  • 大数的乘法
  • DQL操作(数据库表数据查询操作)
  • linux共享内存
  • 小波神经网络的基本原理,小波神经网络什么意思
  • 被一位读者赶超,手摸手 Docker 部署 ELK Stack
  • Math类(Java)
  • Android项目中各文件的作用
  • Java比较器(Comparable接口)
  • ESP Insights 支持通过高级筛选进行分组分析
  • 网课答案公众号搭建的题库接口提供
  • 网课答案公众号题库在这里直接搭建使用
  • Elasticsearch: Query string与Simple query string
  • 训练神经网络用什么显卡,cpu可以训练神经网络吗
  • 中秋节到啦!程序媛请大家品尝月饼啊
  • BOM介绍以及应用以及this指向问题
  • 分享的文章《人生如棋》
  • 【技术性】Search知识
  • conda常用的命令
  • MobX
  • Mysql优化
  • PHP 7 修改了什么呢 -- 2
  • scala基础语法(二)
  • spring-boot List转Page
  • v-if和v-for连用出现的问题
  • 闭包--闭包之tab栏切换(四)
  • 产品三维模型在线预览
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 分布式事物理论与实践
  • 给初学者:JavaScript 中数组操作注意点
  • 前端攻城师
  • 以太坊客户端Geth命令参数详解
  • 主流的CSS水平和垂直居中技术大全
  • 自定义函数
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (03)光刻——半导体电路的绘制
  • (11)MSP430F5529 定时器B
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (笔试题)分解质因式
  • (笔试题)合法字符串
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • ***测试-HTTP方法
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net 调用php,php 调用.net com组件 --
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .net反编译工具
  • [20161214]如何确定dbid.txt
  • [C/C++]关于C++11中的std::move和std::forward
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [HDU 3555] Bomb [数位DP]
  • [iOS]-NSTimer与循环引用的理解
  • [JavaScript]_[初级]_[关于forin或for...in循环语句的用法]