张量计算

张量计算是神经网络训练的基础,PyTorch中提供了非常全面的用于张量计算的函数。PyTorch的张量计算函数一般都可以接受一个out参数,当指定out参数时,可以将计算结果输出到指定的张量中,如果没有指定out参数,则会返回张量计算结果。

PyTorch中提供的张量计算函数常用的主要有以下这些。

  • 变换操作
    • torch.cat(tensors, dim=0),在指定维度上连接多个张量。
    • torch.split(tensor, chunk, dim=0),在指定维度上将张量分隔为多个张量。
    • torch.index_select(input, dim, index),在指定维度上以指定索引建立新的张量。
    • torch.masked_select(input, mask),使用指定蒙版建立新的张量。
    • torch.nonzero(input),返回非零元素的索引张量。
    • torch.reshape(input, shape),按照指定形状元组变换张量形状。
    • torch.squeeze(input, dim=None),返回丢弃全部尺寸为1的维度后的张量。
    • Tensor.view(*shape),返回相同数据但具备指定形状的新张量。
  • 逐点计算
    • torch.abs(input),\( out_i=|input_i| \)。
    • torch.acos(input),\( out_i = cos^{-1}(input_i) \)。
    • torch.add(input, value=1, other),\( out=input+value \times other \)。
    • torch.addcdiv(tensor, value=1, tensor1, tensor2),\( out_i = tensor_i + value \times \frac{tensor1_i}{tensor2_i} \)。
    • torch.addcmul(tensor, value=1, tensor1, tensor2),\( out_i = tensor_i + value \times tensor1_i \times tensor2_i \)。
    • torch.asin(input),\( out_i = sin^{-1}(input_i) \)。
    • torch.atan(input),\( out_i = tan^{-1}(input_i) \)。
    • torch.ceil(input),\( out_i = \lceil input_i \rceil = \lfloor input_i \rfloor + 1 \)。
    • torch.clamp(input, min, max),\( out_i = \left\lbrace \begin{array}{lcl} min & & input_i < min \\ input_i & & min \le input_i \le max \\ max & & max < input_i \end{array}\right. \)。
    • torch.cos(input),\( out_i = cos(input_i) \)。
    • torch.cosh(input),\( out_i = cosh(input_i) \)。
    • torch.div(input, tensor),\( out_i = \frac{input_i}{tensor_i} \)。
    • torch.digamma(input),\( \psi(x) = \frac{d}{dx}ln(\Gamma(x)) = \frac{\Gamma’(x)}{\Gamma(x)} \)。
    • torch.erf(input),\( erf(x) = \frac{2}{\sqrt{\pi}}\int_{0}^{x}e^{-t^2}dt \)。
    • torch.erfc(input),\( erfc(x) = 1 - \frac{2}{\sqrt{\pi}}\int_{0}^{x}e^{-t^2}dt \)。
    • torch.erfinv(input),\( erfinv(erf(x)) = x \)。
    • torch.exp(input),\( out_i = e^{input_i} \)。
    • torch.expm1(input),\( out_i = e^{input_i} - 1 \)。
    • torch.floor(input),\( out_i = \lfloor input_i \rfloor \)。
    • torch.fmod(input, divisor),取余。
    • torch.frac(input),\( out_i = input_i - \lfloor input_i \rfloor \)。
    • torch.lerp(start, end, weight),\( out_i = start_i + weight_i \times (end_i - start_i) \)。
    • torch.log(input),\( out_i = log_e(input_i) \)。
    • torch.log10(input),\( out_i = log_{10}(input_i) \)。
    • torch.lop1p(input),\( out_i = log_e(input_i + 1) \)。
    • torch.log2(input),\( out_i = log_2(input_i) \)。
    • torch.mul(input, tensor),\( out_i = input_i \times tensor_i \)。
    • torch.mvlgamma(input, p),\( log(\Gamma_p(a)) = C + \sum_{i=1}^{p}log(\Gamma(a - \frac{i - 1}{2})) \)。
    • torch.neg(input),\( out = -1 \times input \)。
    • torch.pow(input, exponent),\( out_i = input_i^{exponent_i} \)。
    • torch.reciprocal(input),\( out_i = \frac{1}{input_i} \)。
    • torch.round(input),四舍五入取整。
    • torch.rsqrt(input),\( out_i = \frac{1}{\sqrt{input_i}} \)。
    • torch.sigmoid(input),\( out_i = \frac{1}{1 + e^{-input_i}} \)。
    • torch.sign(input),取符号。
    • torch.sin(input),\( out_i = sin(input_i) \)。
    • torch.sinh(input),\( out_i = sinh(input_i) \)。
    • torch.sqrt(input),\( out_i = \sqrt{input_i} \)。
    • torch.tan(input),\( out_i = tan(input_i) \)。
    • torch.tanh(input),\( out_i = tanh(input_i) \)。
    • torch.trunc(input),取整数部分。
  • 归约操作
    • torch.argmax(x),返回最大值的索引。
    • torch.argmin(x),返回最小值的索引。
    • torch.cumprod(input, dim),在指定维度上计算所有元素的累乘积。
    • torch.cumsum(input, dim),在指定维度上计算所有元素的累加和。
    • torch.dist(input, other),计算范数,\( |x|_p = \left(\sum_{i=1}^{p}|x_i|^p \right)^{\frac{1}{p}} \)。
    • torch.logsumexp(input, dim),在指定维度上计算\( logsumexp(x)_i = log\sum_{j} e^{x_{ij}} \)。
    • torch.mean(input, dim),取所有元素的平均值,如指定维度则在指定维度上计算平均值。
    • torch.median(input, dim),去所有元素的中值,如。
    • torch.mode(input, dim=-1),在指定维度上计算众数值。
    • torch.norm(input, p='fro', dim=None),计算矩阵范数或者矢量范数。
    • torch.prod(input, dim=None),在指定维度上计算元素的积。
    • torch.std(input, dim=None),在指定维度上计算标准差。
    • torch.sum(input, dim=None),在指定维度上计算元素的和。
    • torch.unique(input, dim=None),返回指定维度上的不重复元素。
    • torch.var(input, dim=None),在指定维度上计算方差。
  • 比较操作
    • torch.eq(tensor1, tensor2)torch.ge(tensor1, tensor2)torch.gt(tensor1, tensor2)torch.le(tensor1, tensor2)torch.lt(tensor1, tensor2)torch.ne(tensor1, tensor2),比较两个张量,返回一个新的相同形状张量,其中1表示True,0表示False
    • torch.equal(tensor1, tensor2),比较两个张量是否相等,返回布尔值。
    • torch.isfinite(tensor1)torch.isinf(tensor1)torch.isnan(tensor1),判断张量中逐元素的特征。
    • torch.max(tensor)torch.min(tensor),从整个张量或者指定维度中选出最大值或者最小值。
  • 其他操作
    • torch.flatten(input),展平张量。
    • torch.flip(input, dims),翻转张量。
    • torch.rot90(input, k ,dims),90度旋转张量。
    • torch.roll(input, shifts, dims),滚动张量。
    • torch.tensordot(a, b, dims=2),对两个张量进行点积。

张量的操作除了可以调用torch包下定义的函数以外,Tensor类中也定义了相应的方法,其使用方法是相同的,只是需要注意的是,部分方法以_后缀结尾,这种方法是会改变当前张量值的,在使用时需要注意。