Tensor API 较多,所以把 运算 单独列出来,方便查看

 

本教程环境 pytorch 1.3以上

乘法

见代码

import torch as t

# t.mul(input, other, out=None):mul 等价于 *
# t.matmul(mat, mat, out=None):torch.matmul 等价于 torch.mm

###################################3
# 乘以1个数
t1 = t.rand(3, 2)
t2 = t1 * 2
t3 = t.mul(t1, 2)
print(t2.shape)         # torch.Size([3, 2])
print((t2 == t3).all()) # tensor(True)

# 点乘,对应位置相乘,要求尺寸相同
t1 = t.randn(3, 4)
t2 = t.rand(3, 4)
t3 = t.multiply(t1, t2)
print(t3.shape)     # torch.Size([3, 4])

# 二维 矩阵乘法,第一个列=第二个行
t1 = t.randn(3, 2)
t2 = t.randint(2, 5, size=(2, 7)).float()
t3 = t.matmul(t1, t2)
t4 = t.mm(t1, t2)
print(t3.shape)         # torch.Size([3, 7])
print((t3 == t4).all()) # tensor(True)

# 三维 矩阵乘法,[b,H,W],第一个batch相同,且不参与计算,第一个矩阵的列W=第二个矩阵的行H
t1 = t.rand(5, 4, 2)
t2 = t.randn(5, 2, 3)
t3 = t.bmm(t1, t2)
print(t3.shape)     # torch.Size([5, 4, 3])

 

乘法需要符合 向量乘法 的规则,即尺寸匹配

a=torch.randn(2,3)
c = torch.randn(2, 3)
# print(torch.matmul(a, c))   # 尺寸不符合向量乘法,(2,3)x(2,3)
print(torch.matmul(a, c.t())) # t() 转置,正确 (2,3)x(3,2)

 

加法

加法有 3 种方式:+,add,add_

import torch as t
y = t.rand(2, 3)        ### 使用[0,1]均匀分布构建矩阵
z = t.ones(2, 3)        ### 2x3 的全 1 矩阵

#### 3 中加法操作等价
print(y + z)            ### 加法1
t.add(y, z)             ### 加法2
### 加法的第三种写法
result = t.Tensor(2, 3) ### 预先分配空间
t.add(y, z, out=result) ### 指定加法结果的输出目标
print(result)

 

add_ 与 add 的区别在于,add 不会改变原来的 tensor,而 add_会改变原来的 tensor;

在 pytorch 中,方法后面加  _ 都会改变原来的对象,相当于 in-place 的作用

print(y)
# tensor([[0.4083, 0.3017, 0.9511],
#         [0.4642, 0.5981, 0.1866]])
y.add(z)
print(y)                ### y 不变
# tensor([[0.4083, 0.3017, 0.9511],
#         [0.4642, 0.5981, 0.1866]])
y.add_(z)
print(y)                ### y 变了,相当于 inplace
# tensor([[1.4083, 1.3017, 1.9511],
#         [1.4642, 1.5981, 1.1866]])

 

可以作用于单个数字或者 尺寸为 (1,1) 的 Tensor

a = t.ones(3, 3)
print(a + 1)        ### 可以直接作用于单个数字

b = t.ones(1, 1)
print(a + b)

c = t.ones(2, 1)
# print(a + c)        ### 报错,如果尺寸不匹配,c 的尺寸只能是 (1, 1)

 

减法 

和加法一样,三种:-、sub、sub_

a = t.randn(2, 1)
b = t.randn(2, 1)
print(a)
### 等价操作
print(a - b)
print(t.sub(a, b))
print(a)        ### sub 后 a 没有变化

a.sub_(b)
print(a)        ### sub_ 后 a 也变了

c = 1
print(a - c)    ### 直接作用于单个数字

 

其他运算

t.div(input, other, out=None):除法

t.pow(input, other, out=None):指数

t.sqrt(input, out=None):开方

t.round(input, out=None):四舍五入到整数

t.abs(input, out=None):绝对值

t.ceil(input, out=None):向上取整

t.clamp(input, min, max, out=None):把 input 规范在 min 到 max 之间,超出用 min 和 max 代替,可理解为削尖函数

import torch as t

# tensor.clamp(float minnumber, float maxnumber)
# torch.clamp(tensor, float minnumber, float maxnumber)
input = t.linspace(1, 5, 3)
print(input)                # tensor([1., 3., 5.])
x1 = t.clamp(input, 2, 3)   # tensor([2., 3., 3.]) 限制在2 3之间
x2 = t.clamp(input, 2, 6)   # tensor([2., 3., 5.])
x3 = t.clamp(input, -2, 3)  # tensor([1., 3., 3.])
print(x1, x2, x3)

x4 = input.clamp(2, 3)      # tensor([2., 3., 3.]) 限制在2 3之间
print(x4)

t.argmax(input, dim=None, keepdim=False):返回指定维度最大值的索引

t.sigmoid(input, out=None)

t.tanh(input, out=None)

 

 

 

 

参考资料: