PyTorch学习笔记之基础函数篇(十)
文章目录
- 6 张量操作
- 6.1 torch.reshape()函数
- 6.1 torch.transpose()函数
- 6.1 torch.permute()函数
- 6.1 torch.unsqueez()函数
- 6.1 torch.squeeze()函数
- 6.1 torch.cat()函数
- 6.1 torch.stack()函数
6 张量操作
6.1 torch.reshape()函数
torch.reshape() 是 PyTorch 中的一个函数,用于改变一个张量(tensor)的形状(shape)。这个函数并不会改变张量中的数据,而是返回一个具有新形状的张量视图。
函数原型如下:
torch.reshape(input, shape)
- input:需要改变形状的张量。
- shape:一个包含新形状大小的整数元组。
注意事项:
- 新的形状必须与原始张量中的元素总数相匹配。换句话说,input.numel()(即张量中的元素总数)必须等于np.prod(shape)(即新形状中所有维度的乘积)。
- 如果原始张量不是连续存储的(例如,它是一个跨步张量),则reshape操作可能会失败或返回意外的结果。
- 返回的张量与原始张量共享数据内存,这意味着对其中一个张量所做的任何更改都会反映到另一个张量上。
示例:
import torch# 创建一个形状为 (2, 3) 的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])# 改变其形状为 (3, 2)
y = x.reshape(3, 2)print(y)
# 输出:
# tensor([[1, 2],
# [3, 4],
# [5, 6]])
在这个例子中,我们有一个形状为 (2, 3) 的张量 x。我们使用 reshape 函数将其改变为形状 (3, 2) 的张量 y。请注意,尽管形状发生了变化,但张量中的元素值保持不变。
6.1 torch.transpose()函数
torch.transpose() 是 PyTorch 中的一个函数,用于交换张量(tensor)的两个维度。这个函数在深度学习中常用于调整张量的形状以适应特定的操作需求。
函数原型如下:
torch.transpose(input, dim0, dim1)
- input:需要进行转置操作的张量。
- dim0:第一个要交换的维度的索引。
- dim1:第二个要交换的维度的索引。
torch.transpose() 函数会返回一个新的张量,其中 dim0 和 dim1 指定的两个维度被交换了位置,而张量中的其他维度保持不变。原始张量不会被改变,因为 PyTorch 中的大多数操作都是惰性的,并且返回的是新张量的视图。
下面是一个使用 torch.transpose() 的例子:
import torch# 创建一个形状为 (2, 3) 的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])# 交换第0和第1维
y = torch.transpose(x, 0, 1)print(y)
# 输出:
# tensor([[1, 4],
# [2, 5],
# [3, 6]])
在这个例子中,我们有一个形状为 (2, 3) 的张量 x。通过调用 torch.transpose(x, 0, 1),我们交换了第0维(行)和第1维(列),得到了一个新的形状为 (3, 2) 的张量 y。
注意,torch.transpose() 和 tensor.transpose()(作为张量方法)是等价的。你也可以使用张量方法来进行转置操作:
y = x.transpose(0, 1)
这种转置操作在深度学习中经常用于调整张量的形状以适应模型的要求,比如在进行矩阵乘法或者在进行某些特定的层操作时。
6.1 torch.permute()函数
torch.permute() 是 PyTorch 中的一个函数,用于对张量(tensor)的维度进行重新排序。这个函数返回一个新的张量,其中维度按照指定的顺序重新排列,而原始张量的数据保持不变。
函数原型如下:
torch.permute(input, dims)
- input:需要进行维度重新排序的张量。
- dims:一个包含新维度顺序的整数列表或元组。
dims 中的每个元素都是原始张量维度的索引,按照这些索引的顺序重新排列维度。例如,如果原始张量有一个形状为 (a, b, c),并且 dims = [2, 0, 1],则新的张量将具有形状 (c, a, b)。
下面是一个使用 torch.permute() 的例子:
import torch# 创建一个形状为 (2, 3, 4) 的张量
x = torch.arange(24).reshape(2, 3, 4)# 打印原始张量的形状
print("Original shape:", x.shape)# 重新排列维度,将最后一个维度移动到第一个位置
y = x.permute(2, 0, 1)# 打印重新排列后的张量的形状
print("Permuted shape:", y.shape)
输出:
Original shape: torch.Size([2, 3, 4])
Permuted shape: torch.Size([4, 2, 3])
在这个例子中,原始张量 x 的形状是 (2, 3, 4)。通过调用 permute(2, 0, 1),我们将最后一个维度(索引为 2)移动到了第一个位置,第二个维度(索引为 0)移动到了第二个位置,而第一个维度(索引为 1)移动到了第三个位置。因此,新的张量 y 的形状变成了 (4, 2, 3)。
torch.permute() 在深度学习中经常用于调整张量的维度顺序,以满足特定操作或模型层的要求。例如,在卷积神经网络中,可能需要将通道维度移动到特定的位置。
6.1 torch.unsqueez()函数
torch.unsqueeze() 是 PyTorch 中的一个函数,用于在张量的指定维度上增加一个大小为 1 的新维度。这通常用于调整张量的维度以满足某些操作的要求。
函数原型如下:
torch.unsqueeze(input, dim)
- input:需要增加维度的张量。
- dim:要在其中增加新维度的位置。
使用 unsqueeze() 时,指定的 dim 位置将在张量的形状中插入一个维度,该维度的大小为 1。
下面是一个使用 torch.unsqueeze() 的例子:
import torch# 创建一个形状为 (3,) 的张量
x = torch.tensor([1, 2, 3])# 在第 0 维(即最前面)增加一个大小为 1 的维度
y = torch.unsqueeze(x, 0)print(y.shape) # 输出:torch.Size([1, 3])# 在第 1 维(即原始形状之后)增加一个大小为 1 的维度
z = torch.unsqueeze(x, 1)print(z.shape) # 输出:torch.Size([3, 1])
在这个例子中,我们首先创建了一个形状为 (3,) 的张量 x。然后,我们使用 torch.unsqueeze(x, 0) 在最前面增加了一个维度,得到了形状为 (1, 3) 的张量 y。接着,我们使用 torch.unsqueeze(x, 1) 在原始形状之后增加了一个维度,得到了形状为 (3, 1) 的张量 z。
torch.unsqueeze() 在深度学习中经常用于调整张量的维度以满足特定操作或模型层的要求。例如,在某些情况下,可能需要将一个形状为 (batch_size, channels, height, width) 的图像张量调整为 (batch_size, 1, channels, height, width),以便能够作为某些模型的输入。
6.1 torch.squeeze()函数
torch.squeeze() 是 PyTorch 中的一个函数,用于移除张量中所有大小为 1 的维度。换句话说,它会“压缩”张量,删除所有单维度条目。
函数原型如下:
torch.squeeze(input, dim=None)
- input:需要压缩维度的张量。
- dim:可选参数,指定要移除的维度的索引。如果提供,则仅移除该维度,即使它的大小不为 1。
如果不指定 dim 参数,torch.squeeze() 会移除所有大小为 1 的维度。如果指定了 dim,则只移除该特定索引的维度,无论它的大小如何。
下面是一个使用 torch.squeeze() 的例子:
import torch# 创建一个形状为 (1, 3, 1, 4) 的张量
x = torch.tensor([[[[1, 2, 3, 4]]])# 移除所有大小为 1 的维度
y = torch.squeeze(x)print(y.shape) # 输出:torch.Size([3, 4])# 只移除第 0 维(索引为 0)
z = torch.squeeze(x, dim=0)print(z.shape) # 输出:torch.Size([1, 3, 1, 4])# 只移除第 2 维(索引为 2)
w = torch.squeeze(x, dim=2)print(w.shape) # 输出:torch.Size([1, 3, 4])
在这个例子中,我们首先创建了一个形状为 (1, 3, 1, 4) 的张量 x。然后,我们使用 torch.squeeze(x) 移除了所有大小为 1 的维度,得到了形状为 (3, 4) 的张量 y。
接下来,我们尝试只移除特定的维度。使用 torch.squeeze(x, dim=0) 时,我们尝试移除第 0 维,但因为这个维度的大小不为 1,所以张量的形状没有变化。使用 torch.squeeze(x, dim=2) 时,我们移除了第 2 维(即使它的大小为 1),得到了形状为 (1, 3, 4) 的张量 w。
torch.squeeze() 在深度学习中通常用于清理张量的形状,以便它们可以用于特定的操作或模型层。例如,某些层可能不接受具有大小为 1 的维度的输入,或者为了计算效率,我们可能希望移除这些维度。
6.1 torch.cat()函数
torch.cat() 是 PyTorch 中的一个函数,用于沿着指定的维度拼接张量序列。这意味着你可以将多个张量按照某个维度连接起来,形成一个更大的张量。
函数原型如下:
torch.cat(tensors, dim=0, *, out=None)
- tensors:一个张量序列,用于拼接的张量列表或元组。
- dim:拼接操作的维度。默认值是 0,表示在第一个维度上进行拼接。
- out:可选参数,指定输出张量。
下面是一个使用 torch.cat() 的例子:
import torch# 创建两个形状为 (2, 3) 的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.tensor([[7, 8, 9], [10, 11, 12]])# 沿着第一个维度(dim=0)拼接张量
z = torch.cat((x, y), dim=0)print(z)
# 输出:
# tensor([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])# 沿着第二个维度(dim=1)拼接张量
w = torch.cat((x, y), dim=1)print(w)
# 输出:
# tensor([[ 1, 2, 3, 7, 8, 9],
# [ 4, 5, 6, 10, 11, 12]])
在这个例子中,我们首先创建了两个形状为 (2, 3) 的张量 x 和 y。然后,我们使用 torch.cat((x, y), dim=0) 沿着第一个维度(dim=0)将它们拼接起来,形成了一个形状为 (4, 3) 的张量 z。接着,我们使用 torch.cat((x, y), dim=1) 沿着第二个维度(dim=1)将它们拼接起来,形成了一个形状为 (2, 6) 的张量 w。
torch.cat() 在深度学习中经常用于组合多个张量,以便能够作为一个整体进行后续的操作或计算。
6.1 torch.stack()函数
torch.stack() 是 PyTorch 中的一个函数,用于沿着新的维度对张量序列进行连接。与 torch.cat() 不同,torch.stack() 会在指定的新维度上增加张量,而不是将它们连接起来。
函数原型如下:
torch.stack(tensors, dim=0, *, out=None)
- tensors:一个张量序列,这些张量将被堆叠起来。
- dim:插入新维度的位置。默认值是 0,意味着新维度将成为最前面的维度。
- out:可选参数,指定输出张量。
torch.stack() 要求所有输入张量具有相同的形状,除了沿着堆叠维度(dim)变化的维度之外。
下面是一个使用 torch.stack() 的例子:
import torch# 创建两个形状为 (3,) 的张量
x = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])# 沿着第 0 维(即最前面)堆叠张量
z = torch.stack((x, y), dim=0)print(z)
# 输出:
# tensor([[1, 2, 3],
# [4, 5, 6]])# 创建一个形状为 (2, 3) 的张量
a = torch.tensor([[1, 2, 3], [4, 5, 6]])# 沿着第 1 维(即列方向)堆叠张量 x 和 a
b = torch.stack((x, a), dim=1)print(b)
# 输出:
# tensor([[1, 1, 2, 3],
# [2, 4, 5, 6],
# [3, 7, 8, 9]])
在这个例子中,我们首先创建了两个形状为 (3,) 的张量 x 和 y。使用 torch.stack((x, y), dim=0),我们在第 0 维(即最前面)堆叠了这两个张量,得到了一个形状为 (2, 3) 的张量 z。
然后,我们创建了一个形状为 (2, 3) 的张量 a。使用 torch.stack((x, a), dim=1),我们在第 1 维(即列方向)堆叠了 x 和 a,得到了一个形状为 (3, 4) 的张量 b。
torch.stack() 在深度学习中通常用于将多个张量组合成一个更高维度的张量,以满足某些操作或模型的要求。
相关文章:
PyTorch学习笔记之基础函数篇(十)
文章目录 6 张量操作6.1 torch.reshape()函数6.1 torch.transpose()函数6.1 torch.permute()函数6.1 torch.unsqueez()函数6.1 torch.squeeze()函数6.1 torch.cat()函数6.1 torch.stack()函数 6 张量操作 6.1 torch.reshape()函数 torch.reshape() 是 PyTorch 中的一个函数&a…...
kubernetes部署集群
kubernetes部署集群 集群部署获取镜像安装docker[集群]阿里仓库下载[集群]集群部署[集群]集群环境配置[集群]关闭系统Swap[集群]安装Kubeadm包[集群]配置启动kubelet[集群]配置master节点[master]配置使用网络插件[master]node加入集群[node]后续检查[master]测试集群 集群部署…...
软件工程师,该偿还一下技术债了
概述 在软件开发领域,有一个特殊的概念——“技术债”,它源于Ward Cunningham的一个比喻,主要用来描述那些为了短期利益而选择的快捷方式、临时解决方案或者未完成的工作,它们会在未来产生额外的技术成本。就像金融债务一样&#…...
HTML5、CSS3面试题(三)
HTML5、CSS3面试题(二) rem 适配方法如何计算 HTML 跟字号及适配方案?(必会) 通用方案 1、设置根 font-size:625%(或其它自定的值,但换算规则 1rem 不能小于 12px) 2…...
pytorch之诗词生成6--eval
先上代码: import tensorflow as tf from dataset import tokenizer import settings import utils# 加载训练好的模型 model tf.keras.models.load_model(r"E:\best_model.h5") # 随机生成一首诗 print(utils.generate_random_poetry(tokenizer, model)…...
Django自定义中间件
自定义中间件 传统方法的的五大钩子函数:(需要调用MiddlewareMixin类) process_request,请求刚到来,执行视图之前;正序 process_view,路由转发到视图,执行视图之前;正序…...
【JavaScript】JavaScript 运算符 ① ( 运算符分类 | 算术运算符 | 浮点数 的 算术运算 精度问题 )
文章目录 一、JavaScript 运算符1、运算符分类2、算术运算符3、浮点数 的 算术运算 精度问题 一、JavaScript 运算符 1、运算符分类 在 JavaScript 中 , 运算符 又称为 " 操作符 " , 可以实现 赋值 , 比较 > < , 算术运算 -*/ 等功能 , 运算符功能主要分为以下…...
掘根宝典之C++迭代器简介
简介 迭代器是一种用于遍历容器元素的对象。它提供了一种统一的访问方式,使程序员可以对容器中的元素进行逐个访问和操作,而不需要了解容器的内部实现细节。 C标准库里每个容器都定义了迭代器 迭代器的作用类似于指针,可以指向容器中的某个…...
DP-力扣 120.三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点: 下标与上一层结点下标相同或者等于上一层结点下标 1 的两个结点。样例: 例如,给定三角形: [ [2], [3,4], [6,5,7], [4…...
【WEEK3】学习目标及总结【SpringMVC】【中文版】
学习目标: 三周完成SpringMVC入门——第三周 感觉这周很难完成任务了,大概率还会有第四周 学习内容: 参考视频教程【狂神说Java】SpringMVC最新教程IDEA版通俗易懂数据处理JSON交互处理 学习时间及产出: 第三周 MON~FRI 2024.…...
peft模型微调--Prompt Tuning
模型微调(Model Fine-Tuning)是指在预训练模型的基础上,针对特定任务进行进一步的训练以优化模型性能的过程。预训练模型通常是在大规模数据集上通过无监督或自监督学习方法预先训练好的,具有捕捉语言或数据特征的强大能力。 PEF…...
【算法训练营】周测1
清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~ 考题11-1 题目描述 有一个初始时为空的序列,你的任务是维护这个…...
PyTorch Dataset、DataLoader长度
pytorch 可以直接对 Dataset 对象用 len() 求数据集大小,而 DataLoader 对象也可以用 len(),不过求得的是用这个 loader 在一个 epoch 能有几多 iteration,容易混淆。本文记录几种情况的对比。 from torch.utils.data import Dataset, DataL…...
动态IP和静态IP
与静态 IP 地址不同,动态 IP 地址会定期更改。让我们来分析一下: 1. IP 地址基础知识: * IP 地址是一个数字标签,用于唯一标识网络上的每个设备。 * 当设备通过网络通信时,数据会在它们之间来回传输。每个数据包都标有…...
中电金信:技术实践|Flink维度表关联方案解析
导语:Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架,主要用来处理流式数据。它既可以处理有界的批量数据集,也可以处理无界的实时流数据,为批处理和流处理提供了统一编程模型。 维度表可以看作是用户来分析数…...
HQL 55 题【持续更新】
前言 今天开始为期一个多月的 HQL 练习,共 55 道 HQL 题,大概每天两道,从初级函数到中级函数。这次的练习不再是基础的 join 那种通用 SQL 语法了,而是引入了更多 Hive 的函数(单行函数、窗口函数等)。 我…...
lqb省赛日志[8/37]-[搜索·DFS·BFS]
一只小蒟蒻备考蓝桥杯的日志 文章目录 笔记DFS记忆化搜索 刷题心得小结 笔记 DFS 参考 深度优先搜索(DFS) 总结(算法剪枝优化总结) DFS的模板框架: function dfs(当前状态){if(当前状态 目的状态){}for(寻找新状态){if(状态合法){vis[访问该点];dfs(新状态);?…...
uni app 钓鱼小游戏
最近姑娘喜欢玩那个餐厅游戏里的钓鱼 ,经常让看广告,然后就点点点... 自己写个吧。小鱼的图片自己搞。 有问题自己改,不要私信我 <template><view class"page_main"><view class"top_linear"><v…...
openssl3.2 - note - Decoders and Encoders with OpenSSL
文章目录 openssl3.2 - note - Decoders and Encoders with OpenSSL概述笔记编码器/解码器的调用链OSSL_STORE 编码器/解码器的名称和属性OSSL_FUNC_decoder_freectx_fnOSSL_FUNC_encoder_encode_fn官方文档END openssl3.2 - note - Decoders and Encoders with OpenSSL 概述 …...
分享几个 Selenium 自动化常用操作
最近工作会用到selenium来自动化操作一些重复的工作,那么在用selenium写代码的过程中,又顺手整理了一些常用的操作,分享给大家。 常用元素定位方法 虽然有关selenium定位元素的方法有很多种,但是对于没有深入学习,尤…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
