基本函数
unsqueeze(1):扩充一个维度为一的维度
out = out.unsqueeze(-1) # [B, L, Hs, 1]
压缩维度为一的,即删除Squeeze(1)
学习模型是看shape的变化,不是看参数,要灵活
torch.size(x)
取维度大小
基本运算
torch.cat()
torch.cat([input,ht],-1)
word_input_cat = torch.cat([word_inputs_d, gaz_embeds_cat], dim=-1) #(b,l,we+4*ge)#拼接的是最后一维
cat拼接,类似sum。torch.cat((a,b),0),按行拼接,-1按内部的行拼接为一维。
torch.sum()
torch.sum(input, dtype=None)
torch.sum(input, list: dim, bool: keepdim=False, dtype=None) → Tensor
#input:输入一个tensor
#dim:要求和的维度,可以是一个列表
#keepdim:求和之后这个dim的元素个数为1,所以要被去掉,如果要保留这个维度,则应当keepdim=True
torch.sum()# [[1,2,3],[4,5,6]]
torch.size=2*3,按照从外往里数
torch.sum(x, dim=0): 2个维度的挤压tensor([5, 7, 9])
torch.sum(x, dim=1) :自身的挤压tensor([ 6, 15])
#解释:dim=0,进行挤压2*3->1*3
torch.div()
将输入的每个元素除以一个常量,然后返回一个新的修改过的张量。
用法:
torch.div(inp, other, out=None)
参数
inp:这是输入张量。
other:这是一个要划分为输入inp的每个元素的数字。
out:输出张量。
返回:它返回张量。
torch.view()
相当于numpy中resize()的功能,但是用法可能不太一样。变换形状
gaz_embeds = torch.sum(gaz_embeds, dim=3) #(b,l,4,e)
gaz_embeds_cat = gaz_embeds.view(batch_size,seq_len,-1) #(b,l,4*ge)
维度:(batch,len,4,e)->(batch,len,4*ge)
a=torch.Tensor([[[1,2,3],[4,5,6]]])
print(a.view(3,2))
#将会得到:
tensor([[1., 2.],
[3., 4.],
[5., 6.]])
相当于就是从1,2,3,4,5,6顺序的拿数组来填充需要的形状。但是如果您想得到如下的结果:
tensor([[1., 4.],
[2., 5.],
[3., 6.]])
就需要使用另一个函数了:permute()。
torch.transpose(x,y)
x和y维转置
正态分布数初始化参数 nn.LayerNorm(self.vocab_dim)
类似转置 # [B, L, H] -> [B, H, L] (注释:将 H 维度当作输入 channel 维度)
x = torch.transpose(x, 1, 2)
torch.contiguous()
torch.contiguous()方法语义上是“连续的”,经常与torch.permute()、torch.transpose()、torch.view()方法一起使用,要理解这样使用的缘由,得从pytorch多维数组的低层存储开始说起:
touch.view()方法对张量改变“形状”其实并没有改变张量在内存中真正的形状,可以理解为:
view方法没有拷贝新的张量,没有开辟新内存,与原张量共享内存;
view方法只是重新定义了访问张量的规则,使得取出的张量按照我们希望的形状展现。
torch.transpose()不会改变内存中的顺序
原因是:改变了形状的t2语义上是3行2列的,在内存中还是跟t一样,没有改变,导致如果按照语义的形状进行view拉伸,数字不连续,此时torch.contiguous()方法就派上用场了。
contiguous方法改变了多维数组在内存中的存储顺序,以便配合view方法使用
torch.contiguous()方法首先拷贝了一份张量在内存中的地址,然后将地址按照形状改变后的张量的语义进行排列。
Tensor维度总结
基本思想
2d:23
3d:323想象为平铺了3个23的矩阵
思维转换:
转换到具体任务中,其维度表示的具体意思如下:
x = torch.randn(10, 16, 30, 32, 34) # batch, channel , height , width
转换为tensor sentences.type(torch.LongTensor)