同步操作将从 PaddlePaddle/Paddle 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# TODO: define statistical functions of a tensor__all__ = ['mean', 'std', 'var', 'numel', 'median']import numpy as npfrom ..fluid.framework import Variablefrom ..fluid.layer_helper import LayerHelperfrom ..fluid.framework import core, in_dygraph_modefrom ..fluid import layersfrom .search import wherefrom ..fluid.data_feeder import convert_dtype, check_variable_and_dtype, check_type, check_dtypeimport paddledef mean(x, axis=None, keepdim=False, name=None):"""Computes the mean of the input tensor's elements along ``axis``.Args:x (Tensor): The input Tensor with data type float32, float64.axis (int|list|tuple, optional): The axis along which to perform meancalculations. ``axis`` should be int, list(int) or tuple(int). If``axis`` is a list/tuple of dimension(s), mean is calculated alongall element(s) of ``axis`` . ``axis`` or element(s) of ``axis``should be in range [-D, D), where D is the dimensions of ``x`` . If``axis`` or element(s) of ``axis`` is less than 0, it works thesame way as :math:`axis + D` . If ``axis`` is None, mean iscalculated over all elements of ``x``. Default is None.keepdim (bool, optional): Whether to reserve the reduced dimension(s)in the output Tensor. If ``keepdim`` is True, the dimensions ofthe output Tensor is the same as ``x`` except in the reduceddimensions(it is of size 1 in this case). Otherwise, the shape ofthe output Tensor is squeezed in ``axis`` . Default is False.name (str, optional): Name for the operation (optional, default is None).For more information, please refer to :ref:`api_guide_Name`.Returns:Tensor, results of average along ``axis`` of ``x``, with the same datatype as ``x``.Examples:.. code-block:: pythonimport paddlex = paddle.to_tensor([[[1., 2., 3., 4.],[5., 6., 7., 8.],[9., 10., 11., 12.]],[[13., 14., 15., 16.],[17., 18., 19., 20.],[21., 22., 23., 24.]]])out1 = paddle.mean(x)# [12.5]out2 = paddle.mean(x, axis=-1)# [[ 2.5 6.5 10.5]# [14.5 18.5 22.5]]out3 = paddle.mean(x, axis=-1, keepdim=True)# [[[ 2.5]# [ 6.5]# [10.5]]# [[14.5]# [18.5]# [22.5]]]out4 = paddle.mean(x, axis=[0, 2])# [ 8.5 12.5 16.5]"""if isinstance(axis, int):axis = [axis]reduce_all = True if axis is None \or len(axis)==0 \or len(axis) == len(x.shape) else Falseif axis is None or len(axis) == 0:axis = [0]if in_dygraph_mode():return core.ops.reduce_mean(x, 'dim', axis, 'keep_dim', keepdim,'reduce_all', reduce_all)check_variable_and_dtype(x, 'x/input', ['float32', 'float64'],'mean/reduce_mean')check_type(axis, 'axis/dim', (int, list, tuple), 'mean/reduce_mean')if isinstance(axis, (list, tuple)):for item in axis:check_type(item, 'elements of axis/dim', (int), 'mean/reduce_mean')helper = LayerHelper('mean', **locals())attrs = {'dim': axis, 'keep_dim': keepdim, 'reduce_all': reduce_all}out = helper.create_variable_for_type_inference(x.dtype)helper.append_op(type='reduce_mean', inputs={'X': x}, outputs={'Out': out}, attrs=attrs)return outdef var(x, axis=None, unbiased=True, keepdim=False, name=None):"""Computes the variance of ``x`` along ``axis`` .Args:x (Tensor): The input Tensor with data type float32, float64.axis (int|list|tuple, optional): The axis along which to performvariance calculations. ``axis`` should be int, list(int) ortuple(int). If ``axis`` is a list/tuple of dimension(s), varianceis calculated along all element(s) of ``axis`` . ``axis`` orelement(s) of ``axis`` should be in range [-D, D), where D is thedimensions of ``x`` . If ``axis`` or element(s) of ``axis`` is lessthan 0, it works the same way as :math:`axis + D` . If ``axis`` isNone, variance is calculated over all elements of ``x``. Defaultis None.unbiased (bool, optional): Whether to use the unbiased estimation. If``unbiased`` is True, the divisor used in the computation is:math:`N - 1`, where :math:`N` represents the number of elementsalong ``axis`` , otherwise the divisor is :math:`N`. Default is True.keepdim (bool, optional): Whether to reserve the reduced dimension(s)in the output Tensor. If ``keepdim`` is True, the dimensions ofthe output Tensor is the same as ``x`` except in the reduceddimensions(it is of size 1 in this case). Otherwise, the shape ofthe output Tensor is squeezed in ``axis`` . Default is False.name (str, optional): Name for the operation (optional, default is None).For more information, please refer to :ref:`api_guide_Name`.Returns:Tensor, results of variance along ``axis`` of ``x``, with the same datatype as ``x``.Examples:.. code-block:: pythonimport paddlex = paddle.to_tensor([[1.0, 2.0, 3.0], [1.0, 4.0, 5.0]])out1 = paddle.var(x)# [2.66666667]out2 = paddle.var(x, axis=1)# [1. 4.33333333]"""if not in_dygraph_mode():check_variable_and_dtype(x, 'x', ['float32', 'float64'], 'var')u = mean(x, axis, True, name)out = paddle.sum((x - u)**2, axis, keepdim=keepdim, name=name)n = paddle.cast(paddle.numel(x), x.dtype) \/ paddle.cast(paddle.numel(out), x.dtype)if unbiased:one_const = paddle.ones([1], x.dtype)n = where(n > one_const, n - 1., one_const)out /= nreturn outdef std(x, axis=None, unbiased=True, keepdim=False, name=None):"""Computes the standard-deviation of ``x`` along ``axis`` .Args:x (Tensor): The input Tensor with data type float32, float64.axis (int|list|tuple, optional): The axis along which to performstandard-deviation calculations. ``axis`` should be int, list(int)or tuple(int). If ``axis`` is a list/tuple of dimension(s),standard-deviation is calculated along all element(s) of ``axis`` .``axis`` or element(s) of ``axis`` should be in range [-D, D),where D is the dimensions of ``x`` . If ``axis`` or element(s) of``axis`` is less than 0, it works the same way as :math:`axis + D` .If ``axis`` is None, standard-deviation is calculated over allelements of ``x``. Default is None.unbiased (bool, optional): Whether to use the unbiased estimation. If``unbiased`` is True, the standard-deviation is calculated via theunbiased estimator. If ``unbiased`` is True, the divisor used inthe computation is :math:`N - 1`, where :math:`N` represents thenumber of elements along ``axis`` , otherwise the divisor is:math:`N`. Default is True.keepdim (bool, optional): Whether to reserve the reduced dimension(s)in the output Tensor. If ``keepdim`` is True, the dimensions ofthe output Tensor is the same as ``x`` except in the reduceddimensions(it is of size 1 in this case). Otherwise, the shape ofthe output Tensor is squeezed in ``axis`` . Default is False.name (str, optional): Name for the operation (optional, default is None).For more information, please refer to :ref:`api_guide_Name`.Returns:Tensor, results of standard-deviation along ``axis`` of ``x``, with thesame data type as ``x``.Examples:.. code-block:: pythonimport paddlex = paddle.to_tensor([[1.0, 2.0, 3.0], [1.0, 4.0, 5.0]])out1 = paddle.std(x)# [1.63299316]out2 = paddle.std(x, axis=1)# [1. 2.081666]"""if not in_dygraph_mode():check_variable_and_dtype(x, 'x', ['float32', 'float64'], 'std')out = var(**locals())return paddle.sqrt(out)def numel(x, name=None):"""Returns the number of elements for a tensor, which is a int64 Tensor with shape [1] in static modeor a scalar value in imperative modeArgs:x (Tensor): The input Tensor, it's data type can be bool, float16, float32, float64, int32, int64.Returns:Tensor: The number of elements for the input Tensor.Examples:.. code-block:: pythonimport paddlex = paddle.full(shape=[4, 5, 7], fill_value=0, dtype='int32')numel = paddle.numel(x) # 140"""if in_dygraph_mode():return core.ops.size(x)if not isinstance(x, Variable):raise TypeError("x must be a Tensor in numel")helper = LayerHelper('numel', **locals())out = helper.create_variable_for_type_inference(dtype=core.VarDesc.VarType.INT64)helper.append_op(type='size', inputs={'Input': x}, outputs={'Out': out})return outdef median(x, axis=None, keepdim=False, name=None):"""Compute the median along the specified axis.Args:x (Tensor): The input Tensor, it's data type can be bool, float16, float32, float64, int32, int64.axis (int, optional): The axis along which to perform median calculations ``axis`` should be int.``axis`` should be in range [-D, D), where D is the dimensions of ``x`` .If ``axis`` is less than 0, it works the same way as :math:`axis + D`.If ``axis`` is None, median is calculated over all elements of ``x``. Default is None.keepdim (bool, optional): Whether to reserve the reduced dimension(s)in the output Tensor. If ``keepdim`` is True, the dimensions ofthe output Tensor is the same as ``x`` except in the reduceddimensions(it is of size 1 in this case). Otherwise, the shape ofthe output Tensor is squeezed in ``axis`` . Default is False.name (str, optional): Name for the operation (optional, default is None).For more information, please refer to :ref:`api_guide_Name`.Returns:Tensor, results of median along ``axis`` of ``x``. If data type of ``x`` is float64, data type of results will be float64, otherwise data type will be float32.Examples:.. code-block:: pythonimport paddlex = paddle.arange(12).reshape([3, 4])# x is [[0 , 1 , 2 , 3 ],# [4 , 5 , 6 , 7 ],# [8 , 9 , 10, 11]]y1 = paddle.median(x)# y1 is [5.5]y2 = paddle.median(x, axis=0)# y2 is [4., 5., 6., 7.]y3 = paddle.median(x, axis=1)# y3 is [1.5, 5.5, 9.5]y4 = paddle.median(x, axis=0, keepdim=True)# y4 is [[4., 5., 6., 7.]]"""if not isinstance(x, Variable):raise TypeError("In median, the input x should be a Tensor.")is_flatten = axis is Nonedims = len(x.shape)if is_flatten:x = paddle.flatten(x)axis = 0else:if not isinstance(axis, int) or not (axis < dims and axis >= -dims):raise ValueError("In median, axis should be none or an integer in range [-rank(x), rank(x)).")if axis < 0:axis += dimssz = x.shape[axis]kth = sz >> 1tensor_topk, idx = paddle.topk(x, kth + 1, axis=axis, largest=False)dtype = 'float64' if x.dtype == core.VarDesc.VarType.FP64 else 'float32'if sz & 1 == 0:out_tensor = paddle.slice(tensor_topk, axes=[axis], starts=[kth - 1],ends=[kth]) + paddle.slice(tensor_topk, axes=[axis], starts=[kth], ends=[kth + 1])out_tensor = paddle.cast(out_tensor, dtype=dtype) / 2else:out_tensor = paddle.cast(paddle.slice(tensor_topk, axes=[axis], starts=[kth], ends=[kth + 1]),dtype=dtype)if not keepdim or is_flatten:if not is_flatten:newshape = x.shape[:axis] + x.shape[axis + 1:]elif not keepdim:newshape = [1]else:newshape = [1] * dimselse:newshape = out_tensor.shapeout_tensor = out_tensor.reshape(newshape, name=name)return out_tensor
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。