transformer代码学习及pytorch函数学习

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,)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值