1.创建一个自定义形状的tensor,元素类型为int,并为随机数
a = torch.randint(1, 10, size=[4,2])
# 元素为1-10之间的随机数
2.将tensor中,元素类型改为float
b = a.float()
b = a.double()
3.在tensor的最外层增加一个维度 (tensor[None])
c = b[None]
print(b.shape)
print(c.shape)
4. 用原有tensor的元素类型,设备信息等创建一个新的tensor
device="cuda"
a=torch.rand(2,3,4).double()
a=a.to(device)
b=a.new_zeros((2,3,1))
print(a)
print(b)
5.自注意力
nn.MultiheadAttention()的参数
embed_dim:是每一个单词本来的词向量长度;
num_heads:是我们MultiheadAttention的head的数量
forward()函数的输入参数:
query(L,N,E) L 指的是输出目标序列的长度,N 就是batch_size, E 就是每个单词的embedding 维度大小
key(S,N,E) S 指的是输入目标序列的长度(也就是max_seq_length),N 就是batch_size, E 就是每个单词的embedding 维度大小
value(S,N,E) ,S 指的是输入目标序列的长度,N 是 batch_size, E 是embedding的维度
输出:
attn_output(L,N,E):即这些词的新编码attn_output_weight(N,L,S):即在计算过程中得到的权重矩阵 (上图中的权重矩阵大小为2*2)
import torch
import torch.nn as nn
lst=torch.Tensor([[1,2,3,4],
[2,3,4,5],
[7,8,9,10]])
lst=lst.unsqueeze(1)
lst.shape
multi_atten=nn.MultiheadAttention(embed_dim=4,num_heads=2)
print(multi_atten(lst,lst,lst))
6. 梯度
requires_grad=True
要求计算梯度
requires_grad=False
不要求计算梯度
with torch.no_grad()
或者@torch.no_grad()
中的数据不需要计算梯度,也不会进行反向传播
7.三维矩阵相乘
torch.bmm(input, mat2, *, deterministic=False, out=None) → Tensor
功能:对 input 和 mat2 矩阵执行批处理矩阵积。
- input 和 mat2 必须是三维张量,每个张量包含相同数量的矩阵。
输入:
- input tensor 维度:(b×n×m) ;
- mat2 tensor 维度: (b×m×p) ,
输出:
- out tensor 维度: (b×n×p) .
note:即,先不看第一个维度 b ,然后把后两个维度做矩阵乘法运算 (n * m) . (m * p) -> (n * p)。最终,得out维度 (b * n * p)。
input = torch.randn(10, 3, 4)
mat2 = torch.randn(10, 4, 5)
res = torch.bmm(input, mat2)
print(res.size())