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

3-Pytorch张量的运算、形状改变、自动微分

3-Pytorch张量的运算、形状改变、自动微分

    • 1 导入必备库
    • 2 张量的运算
    • 3 张量的算数运算
    • 4 一个元素的张量可以使用tensor.item()方法转成标量
    • 5 torch.from_numpy()和tensor.numpy()
    • 6 张量的变形
    • 7 张量的自动微分
    • 8 使用with torch.no_grad():包含上下文中使其不再跟踪计算
    • 9 使用tensor.detach()分离出张量的值
    • 10 requirs_grad_()方法改变张量的跟踪属性,是否需要追踪计算

1 导入必备库

import torch
import numpy as np

2 张量的运算

张量的运算规则、切片索引规则与numpy类似,运算中遵循广播原则和同形状同位置元素对齐运算原则

t1 = torch.randn(2,3)
t2 = torch.ones(2,3)
print('t1=',t1)
print('t1+3=',t1+3)
print('t1+t2=',t1+t2)        #同位置元素相加
print('t1.add(t2)=',t1.add(t2))   #等价t1+t2print('t1=',t1)
t1.add_(t2)         # add_方法表示就地改变原值,不需要存放在其它变量内
print('t1.add_(t2)=',t1)

输出:

t1= tensor([[-1.1872,  1.4624,  0.1379],[ 1.0701, -2.6139, -1.2106]])
t1+3= tensor([[1.8128, 4.4624, 3.1379],[4.0701, 0.3861, 1.7894]])
t1+t2= tensor([[-0.1872,  2.4624,  1.1379],[ 2.0701, -1.6139, -0.2106]])
t1.add(t2)= tensor([[-0.1872,  2.4624,  1.1379],[ 2.0701, -1.6139, -0.2106]])
t1= tensor([[-1.1872,  1.4624,  0.1379],[ 1.0701, -2.6139, -1.2106]])
t1.add_(t2)= tensor([[-0.1872,  2.4624,  1.1379],[ 2.0701, -1.6139, -0.2106]])

3 张量的算数运算

张量的算数运算包括:abs(绝对值)、cunsum(累加)、divide(除)、floor_divide(整除)、mean(均值)、min(最小值)、max(最大值)、multiply(乘)等,矩阵转置常用(tensor.T)和矩阵乘法用(matmul或@)

print('t1.matmul(t2.T)=',t1.matmul(t2.T))
print('t1 @ (t2.T)=',t1 @ (t2.T))

输出:

t1.matmul(t2.T)= tensor([[3.4131, 3.4131],[0.2456, 0.2456]])
t1 @ (t2.T)= tensor([[3.4131, 3.4131],[0.2456, 0.2456]])

4 一个元素的张量可以使用tensor.item()方法转成标量

t3 = t1.sum()
print('t3=',t3,type(t3))
print('t3.item()=', t3.item(),type(t3.item()))

输出:

t3= tensor(3.6586) <class 'torch.Tensor'>
t3.item()= 3.658644914627075 <class 'float'>

5 torch.from_numpy()和tensor.numpy()

使用torch.from_numpy()方法将ndarray转成张量,使用tensor.numpy()方法得到对应的ndarray数组,它们共用相同内存

a = np.random.randn(2,3)
print('a= ', a)
t = torch.from_numpy(a)
print('t= ', t)
print('t.numpy()=',t.numpy())

输出:

a=  [[-0.17144614  0.03711562 -0.40770295][ 0.64600264 -1.39858095  0.41699902]]
t=  tensor([[-0.1714,  0.0371, -0.4077],[ 0.6460, -1.3986,  0.4170]], dtype=torch.float64)
t.numpy()= [[-0.17144614  0.03711562 -0.40770295][ 0.64600264 -1.39858095  0.41699902]]

6 张量的变形

tensor.size()方法和tensor.shape属性返回张量的形状。

改变张量的形状用tensor.view()方法,相当于numpy中的reshape方法

t = torch.randn(4,6)
print('shape返回张量的形状: t.shape=',t.shape)
t1 = t.view(3,8)
print('view改变形状: t1.shape=',t1.shape)
# 将tensor矩阵展平,-1表示长度自动计算
t1 = t.view(-1,1)
print('view展平: t1.shape=',t1.shape)# 使用view增加维度,总元素个数不变
t1 = t.view(1,4,6)
print('view增加维度: t1.shape=',t1.shape)# 当维度为1时,使用torch.squeeze()去掉长度为1的维度,相应的torch.unsqueeze()增加长度为1的维度
print('t1.shape=',t1.shape)
t2 = torch.squeeze(t1)  # 去掉长度为1的维度
print('squeeze去掉1维度: t2.shape=',t2.shape)
t3 = torch.unsqueeze(t2,0)
print('unsqueeze增加1维度: t2.shape=',t3.shape)

输出;

shape返回张量的形状: t.shape= torch.Size([4, 6])
view改变形状: t1.shape= torch.Size([3, 8])
view展平: t1.shape= torch.Size([24, 1])
view增加维度: t1.shape= torch.Size([1, 4, 6])
t1.shape= torch.Size([1, 4, 6])
squeeze去掉1维度: t2.shape= torch.Size([4, 6])
unsqueeze增加1维度: t2.shape= torch.Size([1, 4, 6])

7 张量的自动微分

requires_grad属性设置为True时,Pytorch会跟踪此张量所有计算,并可调用backward() 计算所有梯度,梯度将累加到grad属性中。
grad_fn属性指向运算生成此张量的方法。

t = torch.ones(2,2,requires_grad= True)
print('是否跟踪计算梯度:', t.requires_grad)
print('输出梯度:', t.grad)
print('生成此张量的方法:', t.grad_fn)y = t + 5
print('y= ', y)
print('y.grad_fn=',y.grad_fn)z = y * 2
out = z.mean()
print('out=',out)# 对out微分:d(out)/d(t)
out.backward()
print('t.grad=',t.grad)

输出:

是否跟踪计算梯度: True
输出梯度: None
生成此张量的方法: None
y=  tensor([[6., 6.],[6., 6.]], grad_fn=<AddBackward0>)
y.grad_fn= <AddBackward0 object at 0x000002A7D34E8248>
out= tensor(12., grad_fn=<MeanBackward0>)
t.grad= tensor([[0.5000, 0.5000],[0.5000, 0.5000]])

8 使用with torch.no_grad():包含上下文中使其不再跟踪计算

print('是否跟踪计算梯度:', t.requires_grad)
print('是否跟踪计算梯度:', (t+2).requires_grad)with torch.no_grad():print('是否跟踪计算梯度:', (t+2).requires_grad)

输出:

是否跟踪计算梯度: True
是否跟踪计算梯度: True
是否跟踪计算梯度: False

9 使用tensor.detach()分离出张量的值

print('是否跟踪计算梯度:', out.requires_grad)
# s1  = out.data()  #获取值
s = out.detach()print('是否跟踪计算梯度:',s.requires_grad)

输出:

是否跟踪计算梯度: True
是否跟踪计算梯度: False

10 requirs_grad_()方法改变张量的跟踪属性,是否需要追踪计算

print('是否跟踪计算梯度:', t.requires_grad)
t.requires_grad_(False)
print('是否跟踪计算梯度:', t.requires_grad)

输出:

是否跟踪计算梯度: True
是否跟踪计算梯度: False

相关文章:

3-Pytorch张量的运算、形状改变、自动微分

3-Pytorch张量的运算、形状改变、自动微分 1 导入必备库2 张量的运算3 张量的算数运算4 一个元素的张量可以使用tensor.item()方法转成标量5 torch.from_numpy()和tensor.numpy()6 张量的变形7 张量的自动微分8 使用with torch.no_grad():包含上下文中使其不再跟踪计算9 使用te…...

用户权限数据转换为用户组列表(3/3) - Excel PY公式

最近Excel圈里的大事情就是微软把PY塞进了Excel单元格&#xff0c;可以作为公式使用&#xff0c;轻松用PY做数据分析。系好安全带&#xff0c;老司机带你玩一把。 实例需求&#xff1a;如下是AD用户的列表,每个用户拥有该应用程序的只读或读写权限&#xff0c;现在需要创建新的…...

VS2022+CMAKE+OPENCV+QT+PCL安装及环境搭建

VS2022安装&#xff1a; Visual Studio 2022安装教程&#xff08;千字图文详解&#xff09;&#xff0c;手把手带你安装运行VS2022以及背景图设置_vs安装教程_我不是大叔丶的博客-CSDN博客 CMAKE配置&#xff1a; win11下配置vscodecmake_心儿痒痒的博客-CSDN博客 OPENCV配…...

JavaScript的内置类

一、认识包装类型 1.原始类型的包装类 JavaScript的原始类型并非对象类型&#xff0c;所以从理论上来说&#xff0c;它们是没有办法获取属性或者调用方法的。 但是&#xff0c;在开发中会看到&#xff0c;我们会经常这样操作&#xff1a; var message "hello world&q…...

6.英语的十六种时态(三面旗):主动、被动、肯定、否定、一般疑问句、特殊疑问句。

目录 一、do句型&#xff08;以动词allow举例&#xff09;。 &#xff08;1&#xff09;主动语态表格。 &#xff08;2&#xff09;被动语态表格。 &#xff08;3&#xff09;否定。 二、be句型&#xff08;表格里的时态可以参考&#xff0c;查不到对应的资料&#xff09;…...

SpringBoot连接Redis与Redisson【代码】

系列文章目录 一、SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】 二、SpringBoot连接Redis与Redisson【代码】 三、SpringBoot整合WebSocket【代码】 四、SpringBoot整合ElasticEearch【代码示例】 文章目录 系列文章目录代码下载地地址一、引入依赖二、修改配…...

ardupilot开发 --- MAVSDK 篇

概述 MAVSDK是各种编程语言的库集合&#xff0c;用于与MAVLink系统&#xff08;如无人机、相机或地面系统&#xff09;接口。这些库提供了一个简单的API&#xff0c;用于管理一个或多个车辆&#xff0c;提供对车辆信息和遥测的程序访问&#xff0c;以及对任务、移动和其他操作…...

腾讯云AI超级底座新升级:训练效率提升幅度达到3倍

大模型推动AI进入新纪元&#xff0c;对计算、存储、网络、数据检索及调度容错等方面提出了更高要求。在9月7日举行的2023腾讯全球数字生态大会“AI超级底座专场”上&#xff0c;腾讯云介绍异构计算全新产品矩阵“AI超级底座”及其新能力。 腾讯云副总裁王亚晨在开场致辞中表示&…...

AB测试结果分析

一、假设检验 根据样本&#xff08;小流量&#xff09;的观测结果&#xff0c;拒绝或接受关于总体&#xff08;全部流量&#xff09;的某个假设&#xff0c;称为假设检验。 假设检验的基本依据是小概率事件原理&#xff08;小概率事件几乎不发生&#xff09;&#xff0c;如果…...

Python模块和包:sys模块、os模块和变量函数的使用

文章目录 模块&#xff08;module&#xff09;引入外部模块引入部分内容包 (package)示例代码开箱即用sys模块sys.argvsys.modulessys.pathsys.platformsys.exit() os模块os.environos.system()os模块中的变量、函数和类 测试代码模块中的变量和函数的使用 总结&#xff1a;pyt…...

计算机软件工程毕业设计题目推荐

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准&#xff1a; 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…...

嵌入式学习笔记(25)串口通信的基本原理

三根通信线&#xff1a;Tx Rx GND &#xff08;1&#xff09;任何通信都要有信息作为传输载体&#xff0c;或者有线的或则无线的。 &#xff08;2&#xff09;串口通信时有线通信&#xff0c;是通过串口线来通信的。 &#xff08;3&#xff09;串口通信最少需要2根&#xff…...

c++学习第十三

1)循环引用的案例及解决办法: #include <iostream> #include <memory> using namespace std; class A;class B { public:B(){cout<<"B constructor---"<<endl;}~B(){cout<<"B deconstructor----"<<endl;}std::weak_…...

java复习-线程的同步和死锁

线程的同步和死锁 同步问题引出 当多个线程访问同一资源时&#xff0c;会出现不同步问题。比如当票贩子A&#xff08;线程A&#xff09;已经通过了“判断”&#xff0c;但由于网络延迟&#xff0c;暂未修改票数的间隔时间内&#xff0c;票贩子B&#xff08;线程B&#xff09;…...

Qt指示器设置

目录 1. 样式设置 2. 行为设置 3. 交互设置 创建一个进度指示器控件 在Qt中设置指示器&#xff08;Indicator&#xff09;的外观和行为通常需要操作相关部件的属性和样式表。以下是如何在Qt中设置指示器的一些常见方式&#xff1a; 1. 样式设置 你可以使用样式表&#xf…...

计算机网络第四节 数据链路层

一&#xff0c;引入数据链路层的目的 1.目的意义 数据链路层是体系结构中的第二层&#xff1b; 从发送端来讲&#xff0c;物理层可以将数据链路层交付下来的数据&#xff0c;装换成光&#xff0c;电信号发送到传输介质上了 从接收端来讲&#xff0c;物理层能将传输介质的光&…...

Vue.js not detected解决方法

扩展程序》管理扩展程序》详情》允许访问文件地址打开...

Window10安装PHP7.4

1. 下载PHP 7 首先需要下载PHP 7的安装包&#xff0c;可以从PHP官网&#xff08;https://www.php.net/downloads.php&#xff09;或者Windows下的PHP官网&#xff08;http://windows.php.net/download/&#xff09;下载Windows版本的PHP 7安装包。根据自己的系统架构&#xff…...

【C++刷题】二叉树进阶刷题

根据二叉树创建字符串 class Solution { public:/** ()的省略有两种情况* 1.左右都为空&#xff0c;省略* 2.左子树不为空&#xff0c;右子树为空&#xff0c;省略*/string tree2str(TreeNode* root){string s;if(root nullptr){return s;}s to_string(root->val);if(root…...

有效的数独

有效的数独 题目: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。示例 1&#xff1a; 输…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...