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

PyTorch张量运算与自动微分

PyTorch张量运算与自动微分

PyTorch由Facebook人工智能研究院于2017年推出,具有强大的GPU加速张量计算功能,并且能够自动进行微分计算,从而可以使用基于梯度的方法对模型参数进行优化,大部分研究人员、公司机构、数据比赛都使用PyTorch。

张量创建

在深度学习领域你会经常看到张量(Tensor)的表述,张量是深度学习的基础,所以谷歌会把他的深度学习框架叫做TensorFlow。深度学习中的张量可以理解成数组,类似numpy的array。例如:

  • 单个数字就是0维张量,称为标量(scalar);
  • 1维张量称为向量(vector);
  • 2维张量称为矩阵(matrix);
  • 再多点维度就统一称作张量了。

高等代数中学习过矩阵运算,就是最基本的张量运算。

在用Transformers时最常见的是二维和三维张量。二维张量一般是权重矩阵W等,三维张量一般是原数据处理成序列长度模型维度batchsize×序列长度×模型维度。

在描述张量维度时,或者创建多维张量时,你会经常看到 W ∈ R d m × d k × d h W\in\mathbb{R}^{d_m \times d_k \times d_h} WRdm×dk×dh这种类似表述,用几行几列这样的方式去理解的话,相当不直观。

一种直观理解就是用类似多维数组的思想,用“框的数量”来理解。

d m × d k × d h d_m \times d_k \times d_h dm×dk×dh代表最大一个框包着m个框、再下一层有k个,最里层有h个。

第零维m个框:

m 个 [ [ . . . ] , [ . . . ] , . . . , [ . . . ] ⏞ ] \begin{array}{c} m个 \\ [\overbrace{[...],[...],...,[...]}] \end{array} m[[...],[...],...,[...] ]

第一维k个框

k 个 [ [ [ . . . ] , . . . , [ . . . ] ⏞ ] , . . . , ] \begin{array}{} k个 \\ [[\overbrace{[...],...,[...]}],...,] \end{array} k[[[...],...,[...] ],...,]

第二维h个框

h 个 [ [ [ [ . . . ] , . . . , [ . . . ] ⏞ ] , . . . ] , . . . ] \begin{array}{} h个 \\ [[[\overbrace{[...],...,[...]}],...],...] \end{array} h[[[[...],...,[...] ],...],...]

Pytorch张量操作

PyTorch提供了多种方式来创建张量,以创建一个2×3的矩阵为例:

import torch
# empty作用就是初始化一块内存放着,里面数据不重要,根本不会用
t = torch.empty(2, 3)
# 随机初始化张量,范围是[0,1)
t = torch.rand(2, 3)
# 随机初始化张量,服从标准正态分布
t = torch.randn(2, 3)
# 全0矩阵,其中的0是长整型,也可以换成torch.double、torch.float64
t = torch.zeros(2, 3, dtype=torch.long)
# 同理有全1矩阵
t = torch.ones(2, 3, dtype=torch.long)

上面比较常用的是全0和全1,对判断真假很有用。也可以从一个张量创造维度相同的张量:

import torch
t = torch.empty(2, 3)
x = torch.rand_like(a)
x = torch.randn_like(a)
x = torch.zeros_like(a)
x = torch.ones_like(a)

也可以通过基于已有的数组创建张量:

# 从列表
_list = [[1.0, 3.8, 2.1], [8.6, 4.0, 2.4]]
t = torch.tensor(_list)
# 从ndarray
import numpy as np
array = np.array([[1.0, 3.8, 2.1], [8.6, 4.0, 2.4]])
t = torch.from_numpy(array)

这样创建的张量默认在CPU,将其调入GPU有如下方式:

t = torch.empty(2, 3).cuda()
t = torch.empty(2, 3, device="cuda")
t = torch.empty(2, 3).to("cuda")

默认是使用当前第0张卡,指定用第1张卡:

t= torch.empty(2, 3).cuda(1)
t= torch.empty(2, 3, device="cuda:1")
t= torch.empty(2, 3).to("cuda:1")

对应的可以调入CPU

t = torch.empty(2, 3).cpu()
t = torch.empty(2, 3, device="cpu")
t = torch.empty(2, 3).to("cpu")

张量运算

张量的加减乘除、拆拼换调、特殊函数,都能在PyTorch找到快速方法。

加减乘除

x = torch.rand(2, 3)
y = torch.rand(2, 3)
# 等价于x + y
z = torch.add(x, y)
# torch没有减方法,但是可以x - y
# 矩阵点乘,multiplication,Hadamard积,等价于x * y
z = torch.mul(x, y)
# 矩阵叉乘,矩阵乘法,matrix multiplication,等价于x @ y
z = torch.mm(x, y)
# 会报错,因为两者的维度不能做叉乘,需要如下转置
z = torch.mm(x, y.T)
# 三维对应矩阵乘法,batch matrix multiplication
x = torch.rand(2, 3, 4)
y = torch.rand(2, 4, 3)
z = torch.bmm(x, y)
# 更普遍的矩阵叉乘
z = torch.matmul(x, y)
# 除法不常用,但也可以x / y

广播机制

前面我们都是假设参与运算的两个张量形状相同,但是PyTorch同样可以处理不相同形状的张量。

x = torch.ones(2, 3, 4)
y = torch.ones(1, 3, 4)
z = x + y

PyTorch会使得最外面的框维度相同,做法是复制,如上例的y复制一份变成2×3×4,然后以此类推使得前面的框框都相同,最后可以做相同维度运算。再来个更极端的例子:

import torch
x = torch.ones(2, 1, 3, 4)
y = torch.ones(5, 4, 3)
z = torch.matmul(x, y)
print(z)

这么乱都能乘?耶斯。

  1. 首先来看,不乱的是最后两位的3×4和4×3和,刚好能做叉乘,好,所以结果的最后两位是3×3。
  2. 再看前面的维度,y少了框,先补最外面y变成2×5×4×3
  3. 这时第二维1的少了,复制成2×5×3×4,这样就可以乘了。

聪明的你要问,如果x第二维是3,复制不成5啊,那怎么办?怎么办?难办就别办了!答案就是会报错。

拆拼换调

这些方法几乎是最常用的,跟着我好好理解一遍哦。首先是拼接cat方法:

x = torch.tensor([[1, 2, 3], [ 4,  5,  6]], dtype=torch.double)
y = torch.tensor([[7, 8, 9], [10, 11, 12]], dtype=torch.double)
z = torch.cat((x, y), dim=0)

看到dim=0了吗,根据框框理论,这是把第0维的几个框框拼起来,得到:

tensor([[ 1.,  2.,  3.],[ 4.,  5.,  6.],[ 7.,  8.,  9.],[10., 11., 12.]], dtype=torch.float64)

dim=1,则是把第一个框框里的拼起来,得到:

tensor([[ 1.,  2.,  3.,  7.,  8.,  9.],[ 4.,  5.,  6., 10., 11., 12.]], dtype=torch.float64)

拆分就用索引与切片,操作如同list

# 取第0维第1个框里的第2位,注意第X是从0开始
t = torch.randn(3, 4)
x = t[1, 2]
# 取第0维的前两项
x = t[0:2]

相关文章:

PyTorch张量运算与自动微分

PyTorch张量运算与自动微分 PyTorch由Facebook人工智能研究院于2017年推出,具有强大的GPU加速张量计算功能,并且能够自动进行微分计算,从而可以使用基于梯度的方法对模型参数进行优化,大部分研究人员、公司机构、数据比赛都使用P…...

【从零开始的LeetCode-算法】3264. K 次乘运算后的最终数组 I

给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作,每次操作中: 找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。将 x 替换为 x * multiplier 。 请你…...

【Linux】gdb / cgdb 调试 + 进度条

🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、Linux调试器-gdb 🌟开始使用 🌠小贴士: 🌟gdb指令 🌠小贴士: ✨watch 监视 ✨打条件断点 二、小程序----进…...

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置(构建后发送邮件) 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …...

视频汇聚平台Liveweb国标GB28181视频平台监控中心设计

在现代安防视频监控领域,Liveweb视频汇聚平台以其卓越的兼容性和灵活的拓展能力,为用户提供了一套全面的解决方案。该平台不仅能够实现视频的远程监控、录像、存储与回放等基础功能,还涵盖了视频转码、视频快照、告警、云台控制、语音对讲以及…...

文件比较和文件流

文件比较和文件流 一、文本比较工具 diff1.基本用法1.1输出格式 2.常用选项 二、文件流1.文件的打开模式2.文件流的分类ifstreamofstreamfstrem区别 3.文件流的函数1. 构造函数2. is_open 用于判断文件是否打开3. open4. getline5. close6. get()7. read8. write9. put10. gcou…...

【2024最新】基于Springboot+Vue的就业信息管理系统Lw+PPT

作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…...

PySide6 QSS(Qt Style Sheets) Reference: PySide6 QSS参考指南

Qt官网参考资料: QSS介绍: Styling the Widgets Application - Qt for Pythonhttps://doc.qt.io/qtforpython-6/tutorials/basictutorial/widgetstyling.html#tutorial-widgetstyling QSS 参考手册: Qt Style Sheets Reference | Qt Widge…...

【笔记】成为雍正

观古代历史,不过帝王一家一姓之家史 时间 1662年,田文镜出生。1672年,张廷玉出生。1674年,胤礽出生。1678年,胤禛出生。1679年,年羹尧出生。1680年,鄂尔泰出生。1700年,索额图被赐死…...

Codeforces Round 913 (Div. 3)

题目链接 B. YetnotherrokenKeoard 题意 输入 输出 思路 用两个栈分别维护小写字母下标和大写字母下标&#xff0c;用一个vis数组标记字母是否删除 示例代码 void solve() {string s;cin >> s;int n s.size();vector<bool> vis(n, false);stack<int>sk…...

斐波那契数

C语言实现斐波那契数列的多种方法_斐波那契数列c语言-CSDN博客 题目描述 斐波那契数列为&#xff1a;1,1,2,3,5,8,13.....&#xff0c;常规递推公式f(n)f(n-1)f(n-2); 输入描述 输入一个整数n(0<n<50),为多组数据。 输出描述 输出第n个斐波那契数 样例输入 1 2 4样例输出…...

Redis高阶集群搭建+集群读写

问题 容量不够&#xff0c;redis 如何进行扩容&#xff1f;并发写操作&#xff0c; redis 如何分摊&#xff1f;另外&#xff0c;主从模式&#xff0c;薪火相传模式&#xff0c;主机宕机&#xff0c;导致 ip 地址发生变化&#xff0c;应用程序中配置需要修改对应的主机地址、端…...

Vision Transformer(vit)的主干

图解&#xff1a; 代码&#xff1a; class VisionTransformer(nn.Module):def __init__(self, img_size224, patch_size16, in_c3, num_classes1000,embed_dim768, depth12, num_heads12, mlp_ratio4.0, qkv_biasTrue,qk_scaleNone, representation_sizeNone, distilledFalse,…...

手撸了一个文件传输工具

在日常的开发与运维中&#xff0c;文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件&#xff0c;还是快速从一台机器下载日志文件&#xff0c;一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天&#xff0c;我想分享我自己手撸一个文件传输工具的全过程…...

Java程序调kubernetes(k8s1.30.7)core API简单示例,并解决403权限验证问题,即何进行进行权限授权以及验证

简单记录问题 一、问题描述 希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用&#xff0c;但是在高版本上遇见权限验证问题4xx。 <dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifact…...

java八股-Redis Stream和RocketMQ实现的解决方案

文章目录 Redis Stream方案&#xff1a;ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java RocketMQ方案ShortLinkStatsSaveProducer.javaShortLinkStatsSaveConsumer.java Redis Stream方案&#xff1a; ShortLinkStatsSaveProducer.java package com.nageoff…...

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…...

【Python网络爬虫笔记】6- 网络爬虫中的Requests库

一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用&#xff0c;无论是简单的网页数…...

Linux网络_网络协议_网络传输_网络字节序

一.协议 1.概念 协议&#xff08;Protocol&#xff09; 是一组规则和约定&#xff0c;用于定义计算机网络中不同设备之间如何进行通信和数据交换。协议规定了数据的格式、传输方式、传输顺序等详细规则&#xff0c;确保不同设备和系统能够有效地互联互通。 在网络通信中&#…...

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女&#xff1f;RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络&#xff08;DHT&#xff09;哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火&#xff0c;…...

css vue vxe-text-ellipsis table 实现多行文本超出隐藏省略

分享 vxe-text-ellipsis table grid 多行文本溢出省略的用法 正常情况下如果需要使用文本超出隐藏&#xff0c;通过 css 就可以完成 overflow: hidden; text-overflow: ellipsis; white-space: nowrap;但是如果需要实现多行文本溢出&#xff0c;就很难实现里&#xff0c;谷歌…...

基于hexo框架的博客搭建流程

这篇博文讲一讲hexo博客的搭建及文章管理&#xff0c;也算是我对于暑假的一个交代 &#xff01;&#xff01;&#xff01;注意&#xff1a;下面的操作是基于你已经安装了node.js和git的前提下进行的&#xff0c;并且拥有github账号 创建一个blog目录 在磁盘任意位置创建一个…...

数据结构-简单排序

一.前提 二.冒泡排序 三.插入排序 #include<iostream> using namespace std; typedef int ElemengType; void Bubble_Sort(ElemengType A[], int N) {for (int p N - 1; p > 0; p--) {int flag 0;for (int i 0; i < p; i) {if (A[i] > A[i 1]) {swap(A[i], …...

三十一:HTTP多种重定向跳转方式的差异

在现代网站开发中&#xff0c;HTTP 重定向是一种常见的技术&#xff0c;用于将用户的请求从一个 URL 跳转到另一个 URL。重定向机制广泛应用于网站迁移、SEO 优化、以及内容管理系统中。不同的 HTTP 状态码代表不同的重定向方式&#xff0c;每种方式的行为和适用场景各有不同。…...

利用Python爬虫精准获取淘宝商品详情的深度解析

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电子商务领域。淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品数据&#xff0c;对于研究市场趋势、分析消费者行为等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;精准获取…...

架构师的英文:Architect

中文版 软件架构师 的英文是 “Software Architect”。 Software: 软件Architect: 架构师&#xff0c;通常指的是设计和规划某种系统或结构的人。 Software Architect 通常负责软件系统的整体设计、技术选型、架构规划&#xff0c;确保系统的可扩展性、可维护性和高效性等。…...

数据结构 ——— 计数排序算法的实现

目录 计数排序算法的思想 计数排序算法的实现 计数排序算法的思想 遍历数组&#xff0c;找出数组中的最大值 max 和 最小值 min 最大值 max 减去最小值 min 再加 1 得出数组元素的范围 range 利用 range 的大小 malloc 一个 count 数组用来计数 再对 count 数组进行初始化…...

k8s搭建Istio环境,案例pod一直处在Init:CrashLoopBackOff

1 部署calico网络环境&#xff0c;网上去找k8s版本对应的calico的配置文件&#xff0c;k8s2.8.0我用的3.28 2 安装istio环境 curl -L https://istio.io/downloadIstio | sh - # 省略istioctl生效的步骤 source <(istioctl completion zsh) istioctl install --set profile…...

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后&#xff0c;后台无法启动jenkins服务&#xff0c;服务状态如下&#xff1a; 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…...

用户界面创建一个新的运动类型

● 现在我们需要根据我们之前规划的架构步骤来实现在用户界面创建一个运动类型 ● 首先我们在要获取用户在表单中输入的数据 //从表单中获取数据const type inputType.value;const distance inputDistance.value;const duration inputDuration.value;● 然后针对与不同的运动…...

顺义企业建站/如何线上推广自己产品

什么是waf Web应用防护系统 &#xff08;也称&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a; WAF&#xff09;。也叫Web防火墙&#xff0c;主要是对Web特有入侵方式的加强防护&#xff0c;如DDOS防护、SQL注入、X…...

虹口门户网站建设/揭阳百度快照优化排名

一、Python 使用 Mysql1、Python 代码&#xff1a;2、Python 输出结果&#xff1a;3、分析① 当用户名和密码正确时&#xff0c;发现可以正常打印字段数据② 当用户名或密码错误时&#xff0c;输出“账号或密码错误”③ 当用户名输入"python -- Python大星到此一游"&…...

软件开发公司职位/石家庄seo外包的公司

蒙特卡洛算法应用 — 估算圆周率 写在前面 Monte Carlo method&#xff0c;也称为统计模拟方法&#xff0c;是一个针对计算机处理能力设计的利用概率统计理论解决一些较为复杂的计算问题的巧妙算法&#xff0c;是解决某些问题的唯一可行算法&#xff0c;下面将利用蒙特卡洛算法…...

wordpress 定向次数过多/成人教育培训机构

1.一个人的好天气---青山七惠 2.嫌疑人X的献身---东野圭吾 3.活着---余华 4.最漫长的旅行---Nicholas Sparks 5.解忧杂货店---东野圭吾 6.追风筝的人---卡勒德胡赛尼 7.断舍离---山下英子 8.白夜行---东野圭吾 9.放学后---东野圭吾 10.如何成为一个有趣的人---王小圈 11.金色梦…...

建公司网站需要哪些资料/河北seo网络推广

因为同一个电脑上安装多个VS&#xff0c;有多个cvtres.exe。按照下面的操作如果还是不行就在C盘搜索cvtres.exe&#xff0c;然后挨个重命名&#xff0c;看看是调用的哪个&#xff0c;然后修改就可以了。 用VS2010编译C项目时出现这样的错误&#xff1a; LNK1123: 转换到 COFF …...

中职 网站建设与管理/链接买卖

我的一位同事曾经问过我这样一个问题&#xff1a;在 Linux 下&#xff0c;如何 删除目录中除某些文件之外的所有文件&#xff1f;当时&#xff0c;我告诉他可 以通过模式匹配的方法解决。但其实&#xff0c;除此之外&#xff0c;还有其他 的方法&#xff0c;正所谓“条条大路通…...