python常见知识点总结
-
position = torch.arange(0, 100, 2, dtype=torch.float) print(position) # torch.arange(起点(含,省略0开始), 终点(不含), 间隔数(省略为1), dtype=torch.float) ========================================================================= >>tensor([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18., 20., 22., 24., 26., 28., 30., 32., 34., 36., 38., 40., 42., 44., 46., 48., 50., 52., 54., 56., 58., 60., 62., 64., 66., 68., 70., 72., 74., 76., 78., 80., 82., 84., 86., 88., 90., 92., 94., 96., 98.])
-
# 插入一个维度 tensor.unsqueeze(插入后的维度,省略默认在最后一个维度) # 删除一个维度 tensor.unsqueeze(要删除的维度,省略默认为维度为1的那个维度) ========================================================================= position = torch.arange(100, dtype=torch.float) a = position.unsqueeze(1) b = a.squeeze() print(position.size(),a.size(),b.size()) ========================================================================= >>torch.Size([100]) torch.Size([100, 1]) torch.Size([100])
-
math.log(x[, base]) # x -- 数值表达式; base -- 可选,底数,默认为 e。
-
pe = torch.zeros(max_len, d_model) pe[:, 0::2] # 第一个维度取所有,第二个维度从0开始,到最后结束,间隔为2。
-
torch.Tensor的4种乘法
- 点乘
a与b做*乘法,原则是如果a与b的size不同,则以某种方式将a或b进行复制,使得复制后的a和b的size相同,然后再将a和b做 element-wise 的乘法。
一、 * 标量
>>> a = torch.ones(3,4) >>> a tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> a * 2 tensor([[2., 2., 2., 2.], [2., 2., 2., 2.], [2., 2., 2., 2.]])
二、*一维向量
注意此时要求Tensor的列数与行向量的列数相等
>>> a = torch.ones(3,4) >>> a tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> b = torch.Tensor([1,2,3]).reshape((3,1)) >>> a : torch.Size([3, 4]), b : torch.Size([3, 1]) >>> b tensor([[1.], [2.], [3.]]) >>> a * b tensor([[1., 1., 1., 1.], [2., 2., 2., 2.], [3., 3., 3., 3.]])
三、*矩阵
如果两个二维矩阵A与B做点积A * B,则要求A与B的维度完全相同,即A的行数=B的行数,A的列数=B的列数
>>> a = torch.tensor([[1, 2], [2, 3]]) >>> a * a tensor([[1, 4], [4, 9]])
四、broadcast
点积是broadcast的。broadcast是torch的一个概念,简单理解就是在一定的规则下允许高维Tensor和低维Tensor之间的运算。
这里举一个点积broadcast的例子。在例子中,a是二维Tensor,b是三维Tensor,但是a的维度与b的后两位相同,那么a和b仍然可以做点积,点积结果是一个和b维度一样的三维Tensor,运算规则是:若c = a * b, 则c[i,,] = a * b[i, *, *],即沿着b的第0维做二维Tensor点积,或者可以理解为运算前将a沿着b的第0维也进行了expand操作,即a = a.expand(b.size()); a * b。>>> a = torch.tensor([[1, 2], [2, 3]]) >>> b = torch.tensor([[[1,2],[2,3]],[[-1,-2],[-2,-3]]]) >>> a * b tensor([[[ 1, 4], [ 4, 9]], [[-1, -4], [-4, -9]]]) >>> b * a tensor([[[ 1, 4], [ 4, 9]], [[-1, -4], [-4, -9]]])
- torch.mul
和* 一样,也是element-wise的乘法,也是支持broadcast的。
1. 乘标量 >>> a = torch.ones(3,4) >>> a tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> a * 2 tensor([[2., 2., 2., 2.], [2., 2., 2., 2.], [2., 2., 2., 2.]]) 2. 乘行向量 >>> a = torch.ones(3,4) >>> a tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> b = torch.Tensor([1,2,3,4]) >>> b tensor([1., 2., 3., 4.]) >>> torch.mul(a, b) tensor([[1., 2., 3., 4.], [1., 2., 3., 4.], [1., 2., 3., 4.]]) 3. 乘列向量 >>> a = torch.ones(3,4) >>> a tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> b = torch.Tensor([1,2,3]).reshape((3,1)) >>> b tensor([[1.], [2.], [3.]]) >>> torch.mul(a, b) tensor([[1., 1., 1., 1.], [2., 2., 2., 2.], [3., 3., 3., 3.]]) 4. 乘矩阵 # 二维矩阵 mul 二维矩阵 >>> a = torch.tensor([[1, 2], [2, 3]]) >>> torch.mul(a,a) tensor([[1, 4], [4, 9]]) # 二维矩阵 mul 三维矩阵(broadcast) >>> a = torch.tensor([[1, 2], [2, 3]]) >>> b = torch.tensor([[[1,2],[2,3]],[[-1,-2],[-2,-3]]]) >>> torch.mul(a,b) tensor([[[ 1, 4], [ 4, 9]], [[-1, -4], [-4, -9]]])
- torch.mm
数学里的矩阵乘法,要求两个Tensor的维度满足矩阵乘法的要求.
>>> a = torch.ones(3,4) >>> b = torch.ones(4,2) >>> torch.mm(a, b) tensor([[4., 4.], [4., 4.], [4., 4.]])
- torch.matmul
torch.mm的broadcast版本.
当输入有多维时,把多出的一维作为batch提出来,其他部分做矩阵乘法。
>>> a = torch.ones(3,4)
>>> b = torch.ones(5,4,2)
>>> torch.matmul(a, b)
tensor([[[4., 4.],
[4., 4.],
[4., 4.]],
[[4., 4.],
[4., 4.],
[4., 4.]],
[[4., 4.],
[4., 4.],
[4., 4.]],
[[4., 4.],
[4., 4.],
[4., 4.]],
[[4., 4.],
[4., 4.],
[4., 4.]]])
torch.Size([5, 3, 2])
-
# 向模块添加持久缓冲区,这个变量在训练过程中不会随着模型训练变化 self.register_buffer('pe', pe)
-
# 计算矩阵的上三角阵, k表示从第几条对角线起保留数据。 正值是主对角线往上数,负值是往下数。k=0时表示从主对角线开始保留。 np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1) >>>array([[ 1, 2, 3], [ 4, 5, 6], [ 0, 8, 9], [ 0, 0, 12]]) np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], 1) >>>array([[0, 2, 3], [0, 0, 6], [0, 0, 0], [0, 0, 0]]) np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], 0) >>>array([[1, 2, 3], [0, 5, 6], [0, 0, 9], [0, 0, 0]])
-
nn.Linear(in_futures, out_futures,bias=True) # in_features指的是输入的二维张量的大小,即输入的[batch_size, size]中的size。 # out_features指的是输出的二维张量的大小,即输出的二维张量的形状为[batch_size,output_size],当然,它也代表了该全连接层的神经元个数。 # 从输入输出的张量的shape角度来理解,相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。
-
tensor.repeat(1, n_heads, 1, 1) # 在对应的维度填重复的遍数即可
-
# torch.gt(a,b)函数比较a中元素大于(这里是严格大于)b中对应元素,大于则为1 (True),不大于则为0 (False),这里a为Tensor,b可以为与a的size相同的Tensor或常数。 >>> import torch >>> a=torch.randn(2,4) >>> a tensor([[-0.5466, 0.9203, -1.3220, -0.7948], [ 2.0300, 1.3090, -0.5527, -0.1326]]) >>> b=torch.randn(2,4) >>> b tensor([[-0.0160, -0.3129, -1.0287, 0.5962], [ 0.3191, 0.7988, 1.4888, -0.3341]]) >>> torch.gt(a,b) #得到a中比b中元素大的位置 tensor([[0, 1, 0, 0], [1, 1, 0, 1]], dtype=torch.uint8)