逐元素操作
Tensor中也有逐元素操作,大部分的数学运算都属于逐元素操作,逐元素操作的输入与输出的形状相同。
常见的逐元素操作可参考下表:
abs/add:绝对值/加法
addcdiv(t, t1, t2, value=1):t1与t2按元素除后,乘以value加t,即 t+(t1/t2)*value
addcmul(t, t1, t2, value=1):t1与t2按元素乘后,乘以value加t,即t+(t1*t2)*value
ceil/floor:向上取整/向下取整
clamp(t, min, max):将张量元素限制在指定区间
exp/log/pow:指数/对数/幂
mul(或*)/neg:逐元素乘法/取反
sigmoid/tanh/softmax:激活函数
sign/sqrt:取符号/开根号
这些操作均会创建新的Tensor(不修改本身),如果需要就地操作(修改本身),可以使用这些方法的下划线版本。
import torch
# 生成1×3的二维矩阵(服从标准正态分布)
t = torch.randn(1, 3)
print("*"*10 + " t " + "*"*10)
print(t)
# 进行t+2运算:t.add_()
res3 = t.add_(2)
print("*"*10 + " res3 " + "*"*10)
print(res3)
# 修改t本身
print("*"*10 + " t " + "*"*10)
print(t)
# 进行t+2运算:t.add()
res3 = t.add(2)
print("*"*10 + " res3 " + "*"*10)
print(res3)
# 不修改t本身
print("*"*10 + " t " + "*"*10)
print(t)
运行结果:
import torch
# 生成1×3的二维矩阵(服从标准正态分布)
t = torch.randn(1, 3)
print("*"*10 + " t " + "*"*10)
print(t)
# 生成3×1的二维矩阵(服从标准正态分布)
t1 = torch.randn(3, 1)
print("*"*10 + " t1 " + "*"*10)
print(t1)
# 生成1×3的二维矩阵(服从标准正态分布)
t2 = torch.randn(1, 3)
print("*"*10 + " t2 " + "*"*10)
print(t2)
# addc:两数相加,加 进位(carry) 位。 公式:t + (t1/t2)*value
res = torch.addcdiv(t, t1, t2, value=0.1)
print("*"*10 + " res " + "*"*10)
print(res)
# 计算sigmoid函数
res1 = torch.sigmoid(t)
print("*"*10 + " res1 " + "*"*10)
print(res1)
# 将t限制在[0, 1]之间
res2 = torch.clamp(t, 0, 1)
print("*"*10 + " res2 " + "*"*10)
print(res2)
# 不修改t本身
print("*"*10 + " t " + "*"*10)
print(t)
运行结果:
归并操作
对输入进行归并或合计等操作,输入、输出的形状一般不相同,而且往往是输入大于输出。归并操作可以对整个张量进行归并,也可以沿着某个维度进行归并。
常见的归并操作如下:
cumprod(t, axis):在指定维度对t进行累积。cumulative product
cumsum:在指定维度对t进行累加。cumulative sum
dist(a, b, p=2):返回a、b之间的p阶范数
mean/median:均值/中位数
std/var:标准差/方差
norm(t, p=2):返回t的p阶范数
prod(t)/sum(t):返回t所有元素的积/和
归并操作一般涉及dim参数,用于指定哪个维度进行归并。另一个参数keepdim,用于说明输出结果中是否保留含1的维度,默认:False,即不保留。
import torch
# 生成一个含6个数的向量
a = torch.linspace(0, 10, 6)
print("*"*10 + " a " + "*"*10)
print(a)
# 使用view方法,把a变为2×3的矩阵
b = a.view((2, 3))
print("*"*10 + " b " + "*"*10)
print(b)
# 不修改本身
print("*"*10 + " a " + "*"*10)
print(a)
# 沿y轴方向累加,最后形成一行:dim=0
c = b.sum(dim=0)
print("*"*10 + " c " + "*"*10)
print(c)
# 不修改本身
print("*"*10 + " b " + "*"*10)
print(b)
# 沿x轴方向累加,最后形成一列:dim=1
d = b.sum(dim=1)
print("*"*10 + " d " + "*"*10)
print(d)
# 不修改本身
print("*"*10 + " b " + "*"*10)
print(b)
# 沿y轴方向累加,最后形成一行,dim=0,并保留含1的维度
e = b.sum(dim=0, keepdim=True)
print("*"*10 + " e " + "*"*10)
print(e)
# 不修改本身
print("*"*10 + " b " + "*"*10)
print(b)
运行结果:
比较操作
比较操作一般进行逐元素比较操作,有些是按指定方向比较。
常用的比较函数如下:
eq:比较张量是否相等,支持广播机制。
equal:比较张量是否有相同的形状与值。
gt/lt/ge/le:大于/小于比较,大于或等于/小于或等于比较。
gt:greater than,大于
lt:less than,小于
ge:greater than or equal to,大于等于
le:less than or equal to,小于等于
max/min(t, axis):返回最值,若指定axis,则额外返回下标。
topk(t, k, axis):在指定的axis维上取最高的k个值。
import torch
# 生成一个2×3的矩阵:[0, 10]均匀分成6份
x = torch.linspace(0, 10, 6).view(2, 3)
print("*"*10 + " x " + "*"*10)
print(x)
# 求所有元素的最大值
x1 = torch.max(x)
print("*"*10 + " x " + "*"*10)
print(x1)
# dim=0,最后形成一行,每列取最大值。
x2 = torch.max(x, dim=0)
print("*"*10 + " x " + "*"*10)
print(x)
print("*"*10 + " x2 " + "*"*10)
print(x2)
# dim=0,最后形成一行,每列取1个最大值,以及在该列的位置。
x3 = torch.topk(x, 1, dim=0)
print("*"*10 + " x " + "*"*10)
print(x)
print("*"*10 + " x3 " + "*"*10)
print(x3)
# dim=1,最后形成1列,每行取1个最大值,以及在该行的位置。
x3 = torch.topk(x, 1, dim=1)
print("*"*10 + " x " + "*"*10)
print(x)
print("*"*10 + " x3 " + "*"*10)
print(x3)
运行结果:
矩阵操作
矩阵运算有两种:一种是逐元素乘法,另外一种是点积乘法。
PyTorch中常用的矩阵函数:
dot(t1, t2):计算张量(1维)的内积(或点积)。
mm(mat1, mat2)/bmm(bach1, batch2):计算矩阵乘法/含批量的3维矩阵乘法。
mm:matrix multiplication,矩阵乘法
bmm:batch matrix multiplication,批量矩阵乘法
mv(t1, v1):计算矩阵与向量乘法
t:转置
svd(t):计算t的SVD分解。
注:
1)Torch的dot函数与NumPy的dot函数有点不同,Torch中的dot函数是对两个1维张量进行点积运算,NumPy中的dot函数则无此限制。
2)mm是对2维矩阵进行点积运算,bmm是对含批量的3维矩阵进行点积运算。
3)转置运算会导致存储空间不连续,需要调用contiguous方法转为连续。
import torch
a = torch.tensor([2, 3])
print("*"*10 + " a " + "*"*10)
print(a)
b = torch.tensor([3, 4])
print("*"*10 + " b " + "*"*10)
print(b)
c = torch.dot(a, b)
print("*"*10 + " c " + "*"*10)
print(c)
x = torch.randint(10, (2, 3))
print("*"*10 + " x " + "*"*10)
print(x)
y = torch.randint(6, (3, 4))
print("*"*10 + " y " + "*"*10)
print(y)
z = torch.mm(x, y)
print("*"*10 + " z " + "*"*10)
print(z)
x = torch.randint(10, (2, 2, 3))
print("*"*10 + " x " + "*"*10)
print(x)
y = torch.randint(6, (2, 3, 4))
print("*"*10 + " y " + "*"*10)
print(y)
z = torch.bmm(x, y)
print("*"*10 + " z " + "*"*10)
print(z)
运行结果:
PyTorch与NumPy比较
PyTorch与NumPy的函数对照表
操作类型 | NumPy | PyTorch |
数据类型 | np.ndarray | torch.Tensor |
np.float32 | torch.float32 torch.float | |
np.float64 | torch.float64 torch.double | |
np.int64 | torch.int64 torch.long | |
从已有数据构建 | np.array([3.2, 4.3], dtype=np.float16) | torch.tensor([3.2, 4.3], dtype=torch.folat16) |
x.copy() | x.clone() | |
np.concatenate | torch.cat |
操作类别 | NumPy | PyTorch |
线性代数 | np.dot | torch.mm |
属性 | x.ndim | x.dim() |
x.size | x.nelement() | |
形状操作 | x.reshape | x.reshape x.view |
x.flatten | x.view(-1) | |
类型转换 | np.floor(x) | torch.floor(x) x.floor() |
操作类别 | NumPy | PyTorch |
比较 | np.less | x.lt |
np.less_equal | x.le | |
np.greater | x.gt | |
np.greater_equal | x.ge | |
np.equal | x.eq | |
np.not_equal | x.ne | |
随机种子 | np.random.seed | torch.manual_seed |
标签:10,dim,torch,矩阵,基础知识,PyTorch,print,新手,t1 From: https://blog.51cto.com/u_16093693/6919855