张量计算
张量计算是神经网络训练的基础,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
类中也定义了相应的方法,其使用方法是相同的,只是需要注意的是,部分方法以_
后缀结尾,这种方法是会改变当前张量值的,在使用时需要注意。