transformer代码学习及pytorch函数学习

news2024/11/11 8:03:10

torch.randint(low, high, size, dtype=torch.int64, device='cpu', **kwargs)

        

  • low 和 high 如上所述。
  • size 是一个元组,表示张量的形状。
  • dtype 是数据类型,默认为 torch.int64,表示生成的整数是64位整数。
  • device 指定了生成张量所在的设备,可以是CPU或GPU等。

一般写成torch.randint(1, 10, (2, 3)),这将生成一个2行3列的张量,其中每个元素是1到9之间的随机整数。

认识张量维度:(即 以数组为一个层面, n为分割数组的逗号个数,张量的行数 = n+1;

张量的列数 就是每个数组中的列数。

        tensor([[1, 2, 3],
        [4, 5, 6]])  这是2行3列的张量

        tensor([1,2,3])这是1行3列的张量

注意!这也可以说成是二维数组,但是一般不这么表示,一般还是说成张量。

张量和向量,矩阵的区别,可以参见:Transformer论文理解-CSDN博客

而数组是一个其他概念,应该是和元组,列表等并列的,一维数组可看成向量,二维数组可以看成矩阵,三维,四维,n维,可近似看成 n维张量。

函数语句解释:

torch.Tensor([2,4]).to(torch.int32)#创建一个包含2和4两个元素的张量(默认为float),并转化成32位整数

src_seq = torch.cat([torch.unsqueeze(F.pad(torch.randint(1,max_num_src_words,(L,)), (0,max_src_seq_len-L)),0) for L in src_len])

torch.randint(a, b, (L,))在a(包含)~b(不包含)的范围内,生成一个形状为L的张量

F.pad(...)是torch.nn.functional.pad 的别名,用于对张量进行填充。

F.pad(input,pad,[mode],[value])

        input(tensor):是要被扩充的元组

        pad(tuple):是指明对该tensor各方位扩充的元素个数(这个元组中的每个数字对应于输入张量的一个维度的填充大小),(pad_left, pad_right, pad_top, pad_bottom, ...)

import torch
input = torch.tensor([[[[1, 2, 3],
                        [4, 5, 6],
                        [7, 8, 9]]]])
padded_input = torch.nn.functional.pad(input, (1, 1, 1, 1), mode='constant', value=0)

扩充后:形状变为(1,1,5,5)。

tensor([[[[0, 0, 0, 0, 0],
          [0, 1, 2, 3, 0],
          [0, 4, 5, 6, 0],
          [0, 7, 8, 9, 0],
          [0, 0, 0, 0, 0]]]])

mode :默认为constant,即常数。可省略

value:指填充元素的数值,一般填充0.

-----------------

torch.unsqueeze(input,dim,[*],[out=None])用于对张量扩充一个维度。

        一般只用前两个参数,Input:要被扩充的张量,

                                             dim:是要被扩充维数的位置

Q1:dim指定的扩充维度的位置,那么torch.unsqueeze(tensor([1,2,3]), dim=0), 其中dim=0时,扩充出来是怎样的,dim=1时可以这么设置吗?

若tensor([1,2,3])则形状为(3,) ,dim = 0时,扩充后为tensor([[1,2,3]]), 形状为(1,3)

dim的数值,可以理解为tensor形状元组的索引位置。

Q2:扩充维度时,填从的元素是什么?

增加的维度大小为 1,但这个维度并不填充任何具体的值。它只是增加了一个维度,使得原始张量的维度增加一维。(相当于只是让容器大了一层,但并不一定装东西。)

其他例子:

import torch

# 示例 1: 原始张量形状为 (3,)
x = torch.tensor([1, 2, 3])
y = torch.unsqueeze(x, 0)
print(y)  # 输出: tensor([[1, 2, 3]])

# 示例 2: 原始张量形状为 (3,)
x = torch.tensor([1, 2, 3])
y = torch.unsqueeze(x, 1)
print(y)  # 输出: tensor([[1],
                    #         [2],
                    #         [3]])

# 示例 3: 原始张量形状为 (2, 3)
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.unsqueeze(x, 0)
print(y)  # 输出: tensor([[[1, 2, 3],
                    #         [4, 5, 6]]])

# 示例 4: 原始张量形状为 (2, 3)
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.unsqueeze(x, 1)
print(y)  # 输出: tensor([[[1, 2, 3]],
                    #         [[4, 5, 6]]])

---------------------------------------

torch.cat([...]): 这个函数用于将多个张量沿着指定的维度进行拼接。在这里,它将所有通过列表推导式生成的张量拼接在一起

torch.cat(tensors, dim=0, *, out=None)

        

  1. tensors (sequence of Tensors) - 要拼接的张量序列,这些张量必须在其他所有非拼接维度上具有相同的形状。(拼接维度直接相加)如:dim=1时(1,2,3)和(1,5,3)拼成(1,7,3)

                而dim=0时,(1,2,3)和(1,5,3)就不能拼接

      dim=0时,就是最外面那个框框相接,即tensor([[...]],[[...]])

        dim = 1时,就是倒数第二个框框外相接(总之就是从外到内看)tensor([[...],[...]])

形状为(2,1,2)和(2,2,2)的张量当torch.cat()函数中dim = 1时,拼接

(tips:从内到外表示tensor)tensor([[a,b]],[[c,d]]) 和 tensor([[a,b],[c,d]],[[e,f],[g,h]])

拼接后为:tensor([ [a,b],

                                [a,b],

                                [c,d]  ],

                                [ [c,d],

                                [e,f],

                                [g,h]  ])

import torch

# 假设张量 A 和 B 已经定义,形状分别为 (2, 1, 2) 和 (2, 2, 2)
A = torch.tensor([[[1, 2]], [[3, 4]]])
B = torch.tensor([[[1, 2],[3, 4]], [[5, 6],[7, 8]]])

# 沿着第三维度拼接
result = torch.cat((A, B), dim=1)
print(result)

拓:

技巧:找逗号,判层数

tensor([1,2,3,4]) 在PyTorch中表示一个一维张量,具体来说是一个长度为4的向量。

  • :1行
  • :4列

这种张量的形状可以表示为 (4,)。在PyTorch中,张量的形状是一个元组,其中每个元素代表一个维度的大小。对于一维张量,形状通常只有一个元素,表示该维度的长度(这里就是4)。

辨析F.pad(...)于torch.unsqueeze()用途区别:

        pad是用于对张量进行填充。即可以使(1,2,3)变成(1,4,3)

                表现为: 某一维度下增加了元素[1,2,3,4,0,0,0,0]

                      torch.unsqueeze 在张量的某维度下增加一个额外的维度。即可以使(1,2,3)变成(1,1,2,3)

                      表现为最外层增加个中括号。

        判断一个tensor是的几维形状,则去数非并列的最右边的右括号有几个,有n个,就是n维

        如:

tensor([[0],
        [1],
        [2],
        [3]])

则是两个右中括号,则为二维(1,4)。若是tensor([1,2,3,4])则是一维(4,)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

结构体与共用体

一、链表 1.尾插 2.头删: 3.尾删: 4.内存泄漏:malloc调用的节点需要手动清除 头删效率更高,算法复杂度更低 二、共用体 1.形式:union 共用体名{成员表列} 变量表列;共用体的成员会占用同样的内存空间 …

微信小程序_对接腾讯实时音视频_多人会议

目录 一、开通腾讯实时音视频 1.腾讯实时音视频简介 2.创建应用 二、快速接入 1.微信小程序账号类目资格 2.跑通腾讯多人会议源码 3.发行项目 三、开发自己的业务代码 如何对接腾讯实时音视频的多人会议产品,从开通服务到对接完成,一 一讲解。 一…

LBS 开发微课堂|Polyline绘制优化:效果更丰富,性能更佳!

为了让广大的开发者 更深入地了解 百度地图开放平台的技术能力 轻松掌握满满的技术干货 更加简单地接入 开放平台的服务 我们特别推出了 “位置服务(LBS)开发微课堂” 系列技术案例 第一期的主题是 《Polyline 绘制优化升级》 你还想了解哪些…

MySQL:Prepared Statement 预处理语句

预处理语句(Prepared Statement) 是一种在数据库管理系统中使用的编程概念,用于执行对数据库进行操作的 SQL 语句。 使用预处理语句的具体方式和语法依赖于所用的编程语言和数据库管理系统。常见的编程语言如 Java、PHP、Python 和 C# 都提供…

如何把视频语音转文字?交给这4款工具就完事

这两天巴黎奥运会的盛大开幕,世界各地的记者们纷纷涌入这个体育盛事的现场,带着他们的镜头和麦克风,捕捉每一个激动人心的瞬间。 然而,随着采访的深入,如何快速准确地将这些珍贵的视频内容转化为文字记录,…

代码随想录算法训练营第十七天 | 654.最大二叉树, 617.合并二叉树 ,700.二叉搜索树中的搜索 , 98.验证二叉搜索树

目录 654.最大二叉树 思路 方法一: 递归基础版 方法二:递归使用下标 方法三:递归使用切片 心得收获 617.合并二叉树 思路 递归法 迭代法 方法一: 递归 - 前序 - 修改root1 方法二:递归 - 前序 - 新建root…

敦煌文化主题页面 HTML,CSS,Javascript 源码分享

使用技术:HTML,CSS,JavaScript 项目亮点:加入了大量的CSS动画效果,以及JS交互效果,水平适合初学者以及大学生,包含登录注册页 需要的可以dd, 绿泡泡:ColdDayOne

AI入门指南:什么是人工智能、机器学习、神经网络、深度学习?

文章目录 一、前言二、人工智能(AI)是什么?起源概念人工智能分类人工智能应用 三、机器学习是什么?概念机器学习常见算法机器学习分类机器学习与人工智能的关系 四、神经网络是什么?概念神经网络组成部分神经网络模型神经网络和机器学习的关系…

【Hot100】LeetCode—76. 最小覆盖子串

题目 原题链接:76. 最小覆盖子串 1- 思路 利用两个哈希表解决分为 :① 初始化哈希表、②遍历 s,处理当前元素,判断当前字符是否有效、③收缩窗口、④更新最小覆盖子串 2- 实现 ⭐76. 最小覆盖子串——题解思路 class Solution …

Python | Leetcode Python题解之第316题去除重复字母

题目: 题解: class Solution:def removeDuplicateLetters(self, s: str) -> str:vis defaultdict(int)cnt defaultdict(int)for ch in s: cnt[ch] 1queue []for ch in s:if vis[ch] 0:while queue and queue[-1] > ch and cnt[queue[-1]]:vi…

VS Code设置C++编译器路径

C_Cpp.default.compilerPath是C/C编译器路径; python.condaPath是conda路径.

Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接

目录 报错 解决办法 报错 在redis文件夹的路径栏中输入 cmd 命令,打开控制栏窗口界面 报错说是 redis-cli.exe打开就显示Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。 解决办法 (1)cmd…

【教学类-71-01】20240802蔬菜切切乐01

背景需求: ✂️自制教具分享✂️蔬菜切切乐(剪纸) - 小红书 (xiaohongshu.com)https://www.xiaohongshu.com/explore/65bf6809000000001100fa53?app_platformandroid&ignoreEngagetrue&app_version8.46.0&share_from_user_hidd…

mybatis保存postgresql数组格式数据

新建表的时候在int4后加上[]中括号就行 -- 创建数组 SELECT ARRAY[1, 2, 3, 4, 5];-- 访问数组元素(从1开始) SELECT ARRAY[1, 2, 3, 4, 5][1]; -- 返回 1-- 数组长度 SELECT array_length(ARRAY[1, 2, 3, 4, 5], 1); -- 返回 5-- 数组连接 SELECT ARRA…

C语言 | Leetcode C语言题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; char* removeDuplicateLetters(char* s) {int vis[26], num[26];memset(vis, 0, sizeof(vis));memset(num, 0, sizeof(num));int n strlen(s);for (int i 0; i < n; i) {num[s[i] - a];}char* stk malloc(sizeof(char) * 27);int stk…

Linux软件编程

8月1日学习了最后的标准IO&#xff0c;流的偏移。然后进入了文件IO的学习&#xff0c;包括文件的打开、读写、关闭以及偏移。之后又学习了剩余的一些函数接口&#xff0c;可以对文件进行一些其余操作。 8月2日学习了目录文件和链接文件的操作。目录文件的操作包括目录的创建、…

8月17日|广州|Cocos开发者沙龙不见不散!

6月底举行的Cocos成都沙龙吸引了近200位开发者和10多家发行&#xff0c;得到了大家的一致好评。 Cocos广州沙龙即将到来&#xff0c;会邀请更多KOL和头部发行、渠道嘉宾分享行业经验&#xff0c;让大家实现技术干货、游戏合作、行业信息多丰收。 活动主题&#xff1a;小游戏与出…

二叉树构建(从3种遍历中构建)python刷题记录

R3-树与二叉树篇. 目录 从前序与中序遍历序列构造二叉树 算法思路&#xff1a; 灵神套路 从中序与后序遍历序列构造二叉树 算法思路&#xff1a; 灵神套路 从前序和后序遍历序列构造二叉树 算法思路&#xff1a; 灵神套路 从前序与中序遍历序列构造二叉树 算法…

请你学习:前端布局2 - 定位(Positioning)是一种重要的布局技术

在页面布局中&#xff0c;定位&#xff08;Positioning&#xff09;是一种重要的布局技术&#xff0c;它允许我们精确地控制元素在页面上的位置。定位模式、是否脱标以及移动位置是理解定位的三个关键方面。 1 定位模式 定位模式决定了元素在文档中的定位方式&#xff0c;通过…

一款完全免费的数据恢复软件

WinFR&#xff0c;Windows文件恢复&#xff08;微软命令行程序&#xff09;的免费图形界面&#xff0c;帮您轻松恢复文件。WinFR是免费的Windows数据恢复替代方案&#xff0c;支持U盘数据恢复、硬盘数据恢复、存储卡数据恢复、文件数据恢复等功能。WinFR完全调用Windows文件恢复…