未验证 提交 aeb3d8a2 编写于 作者: Z zhongpu 提交者: GitHub

update norm op for dygraph, test=develop (#1291)

* update layer_norm_cn.rst, test=develop

* update code for layer_norm_cn.rst, test=develop

* update LayerNorm_cn.rst layer_norm_cn.rst, test=develop

* update BatchNorm_cn.rst, GroupNorm_cn.rst, SpectralNorm_cn.rst, test=develop

* fix bug for GroupNorm, test=develop

* fix norm op, test=develop

* add comment, test=develop

* add comment for dygraph layer, test=develop

* add comment for dygraph layer, test=develop

* add comment for dygraph layer, test=develop

* add comment for name, test=develop
上级 30d781c6
...@@ -5,66 +5,68 @@ BatchNorm ...@@ -5,66 +5,68 @@ BatchNorm
.. py:class:: paddle.fluid.dygraph.BatchNorm(name_scope, num_channels, act=None, is_test=False, momentum=0.9, epsilon=1e-05, param_attr=None, bias_attr=None, dtype='float32', data_layout='NCHW', in_place=False, moving_mean_name=None, moving_variance_name=None, do_model_average_for_mean_and_var=False, fuse_with_relu=False, use_global_stats=False, trainable_statistics=False) .. py:class:: paddle.fluid.dygraph.BatchNorm(name_scope, num_channels, act=None, is_test=False, momentum=0.9, epsilon=1e-05, param_attr=None, bias_attr=None, dtype='float32', data_layout='NCHW', in_place=False, moving_mean_name=None, moving_variance_name=None, do_model_average_for_mean_and_var=False, fuse_with_relu=False, use_global_stats=False, trainable_statistics=False)
该接口用于构建 ``BatchNorm`` 类的一个可调用对象,具体用法参照 ``代码示例`` 。其中实现了批归一化层(Batch Normalization Layer)的功能,可用作卷积和全连接操作的批归一化函数,根据当前批次数据按通道计算的均值和方差进行归一化。更多详情请参考 : `Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift <https://arxiv.org/pdf/1502.03167.pdf>`_
批正则化层(Batch Normalization Layer) 当use_global_stats = False时,:math:`\mu_{\beta}` 和 :math:`\sigma_{\beta}^{2}` 是minibatch的统计数据。计算公式如下:
可用作conv2d和全连接操作的正则化函数。该层需要的数据格式如下:
1.NHWC[batch,in_height,in_width,in_channels]
2.NCHW[batch,in_channels,in_height,in_width]
更多详情请参考 : `Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift <https://arxiv.org/pdf/1502.03167.pdf>`_
``input`` 是mini-batch的输入特征。
.. math:: .. math::
\mu_{\beta} &\gets \frac{1}{m} \sum_{i=1}^{m} x_i \quad &// mini-batch-mean \\ \mu_{\beta} &\gets \frac{1}{m} \sum_{i=1}^{m} x_i \quad &// mini-batch-mean \\
\sigma_{\beta}^{2} &\gets \frac{1}{m} \sum_{i=1}^{m}(x_i - \mu_{\beta})^2 \quad &// mini-batch-variance \\ \sigma_{\beta}^{2} &\gets \frac{1}{m} \sum_{i=1}^{m}(x_i - \mu_{\beta})^2 \quad &// mini-batch-variance \\
\hat{x_i} &\gets \frac{x_i - \mu_\beta} {\sqrt{\sigma_{\beta}^{2} + \epsilon}} \quad &// normalize \\
y_i &\gets \gamma \hat{x_i} + \beta \quad &// scale-and-shift
当use_global_stats = True时, :math:`\mu_{\beta}` 和 :math:`\sigma_{\beta}^{2}` 不是一个minibatch的统计数据。 它们是全局(或运行)统计数据。 (它通常来自预训练模型)。训练和测试(或预测)具有相同的行为: - :math:`x` : 批输入数据
- :math:`m` : 当前批次数据的大小
当use_global_stats = True时,:math:`\mu_{\beta}` 和 :math:`\sigma_{\beta}^{2}` 是全局(或运行)统计数据(moving_mean和moving_variance),通常来自预先训练好的模型。计算公式如下:
.. math:: .. math::
\hat{x_i} &\gets \frac{x_i - \mu_\beta} {\sqrt{\ moving\_mean = moving\_mean * momentum + \mu_{\beta} * (1. - momentum) \quad &// global mean \\
\sigma_{\beta}^{2} + \epsilon}} \\ moving\_variance = moving\_variance * momentum + \sigma_{\beta}^{2} * (1. - momentum) \quad &// global variance \\
y_i &\gets \gamma \hat{x_i} + \beta
归一化函数公式如下:
.. math::
\hat{x_i} &\gets \frac{x_i - \mu_\beta} {\sqrt{\sigma_{\beta}^{2} + \epsilon}} \quad &// normalize \\
y_i &\gets \gamma \hat{x_i} + \beta \quad &// scale-and-shift \\
- :math:`\epsilon` : 添加较小的值到方差中以防止除零
- :math:`\gamma` : 可训练的比例参数
- :math:`\beta` : 可训练的偏差参数
参数: 参数:
- **name_scope** (str) - 该类的名称 - **name_scope** (str) - 该类的名称
- **act** (str|None)- 激活函数类型,linear|relu|prelu|... - **num_channels** (int) - 指明输入 ``Tensor`` 的通道数量。
- **is_test** (bool) - 指示它是否在测试阶段。默认False。 - **act** (str, 可选) - 应用于输出上的激活函数,如tanh、softmax、sigmoid,relu等,支持列表请参考 :ref:`api_guide_activations` ,默认值为None。
- **momentum** (float)- 此值用于计算 moving_mean and moving_var. 更新公式为: :math:`moving\_mean = moving\_mean * momentum + new\_mean * (1. - momentum` :math:`moving\_var = moving\_var * momentum + new\_var * (1. - momentum` , 默认值0.9. - **is_test** (bool, 可选) - 指示是否在测试阶段,非训练阶段使用训练过程中统计到的全局均值和全局方差。默认值:False。
- **epsilon** (float)- 加在分母上为了数值稳定的值。默认值为1e-5 - **momentum** (float, 可选) - 此值用于计算 ``moving_mean`` 和 ``moving_var`` 。默认值:0.9。更新公式如上所示
- **param_attr** (ParamAttr|None) - batch_norm参数范围的属性,如果设为None或者是ParamAttr的一个属性,batch_norm创建ParamAttr为param_attr。如果没有设置param_attr的初始化函数,参数初始化为Xavier。默认:None - **epsilon** (float, 可选) - 为了数值稳定加在分母上的值。默认值:1e-05。
- **bias_attr** (ParamAttr|None) - batch_norm bias参数的属性,如果设为None或者是ParamAttr的一个属性,batch_norm创建ParamAttr为bias_attr。如果没有设置bias_attr的初始化函数,参数初始化为0。默认:None - **param_attr** (ParamAttr, 可选) - 指定权重参数属性的对象。默认值为None,表示使用默认的权重参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr` 。
- **data_layout** (string) - NCHW|NHWC。默认NCHW - **bias_attr** (ParamAttr, 可选) - 指定偏置参数属性的对象。默认值为None,表示使用默认的偏置参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr` 。
- **in_place** (bool)- 得出batch norm可复用记忆的输入和输出,默认False - **dtype** (str, 可选) - 指明输入 ``Tensor`` 的数据类型,可以为float32或float64。默认值:float32
- **moving_mean_name** (string|None)- moving_mean的名称,存储全局Mean均值。默认为None - **data_layout** (string, 可选) - 指定输入数据格式,数据格式可以为“NCHW”或者“NHWC”。默认值:“NCHW”
- **moving_variance_name** (string,默认None)- moving_variance的名称,存储全局方差。 - **in_place** (bool, 可选) - 指示 ``batch_norm`` 的输出是否可以复用输入内存。默认值:False。
- **do_model_average_for_mean_and_var** (bool,默认False)- 是否为mean和variance做模型均值 - **moving_mean_name** (str, 可选) - ``moving_mean`` 的名称,存储全局均值。如果将其设置为None, ``batch_norm`` 将随机命名全局均值;否则, ``batch_norm`` 将命名全局均值为 ``moving_mean_name`` 。默认值:None。
- **fuse_with_relu** (bool)- 如果为True,batch norm后该操作符执行relu。默认为False。 - **moving_variance_name** (string, 可选) - ``moving_var`` 的名称,存储全局方差。如果将其设置为None, ``batch_norm`` 将随机命名全局方差;否则, ``batch_norm`` 将命名全局方差为 ``moving_variance_name`` 。默认值:None。
- **use_global_stats** (bool) – 是否使用全局均值和方差。 在预测或测试模式下,将use_global_stats设置为true或将is_test设置为true,并且行为是等效的。 在训练模式中,当设置use_global_stats为True时,在训练期间也使用全局均值和方差。默认为False。 - **do_model_average_for_mean_and_var** (bool, 可选) - 指示是否为mean和variance做模型均值。默认值:False。
- **trainable_statistics** (bool)- eval模式下是否计算mean均值和var方差。eval模式下,trainable_statistics为True时,由该批数据计算均值和方差。默认为False。 - **fuse_with_relu** (bool, 可选) - 如果为True,将在执行 ``batch_norm`` 后执行 ``relu`` 操作。默认值:False。
- **use_global_stats** (bool, 可选) – 指示是否使用全局均值和方差。在预测或测试模式下,将 ``use_global_stats`` 设置为true或将 ``is_test`` 设置为true,这两种行为是等效的。在训练模式中,当设置 ``use_global_stats`` 为True时,在训练期间也将使用全局均值和方差。默认值:False。
返回: 张量,在输入中运用批正则后的结果 - **trainable_statistics** (bool, 可选) - eval模式下是否计算mean均值和var方差。eval模式下,trainable_statistics为True时,由该批数据计算均值和方差。默认值:False。
返回类型:变量(Variable) 返回:无
**代码示例** **代码示例**
.. code-block:: python .. code-block:: python
import paddle.fluid as fluid import paddle.fluid as fluid
from paddle.fluid.dygraph.base import to_variable
import numpy as np
x = np.random.random(size=(3, 10, 3, 7)).astype('float32')
with fluid.dygraph.guard(): with fluid.dygraph.guard():
fc = fluid.FC('fc', size=200, param_attr='fc1.w') x = to_variable(x)
hidden1 = fc(x)
batch_norm = fluid.BatchNorm("batch_norm", 10) batch_norm = fluid.BatchNorm("batch_norm", 10)
hidden2 = batch_norm(hidden1) hidden1 = batch_norm(x)
...@@ -7,36 +7,32 @@ GroupNorm ...@@ -7,36 +7,32 @@ GroupNorm
**Group Normalization层** **Group Normalization层**
请参考 `Group Normalization <https://arxiv.org/abs/1803.08494>`_ 。 该接口用于构建 ``GroupNorm`` 类的一个可调用对象,具体用法参照 ``代码示例`` 。其中实现了组归一化层的功能。更多详情请参考: `Group Normalization <https://arxiv.org/abs/1803.08494>`_ 。
参数: 参数:
- **name_scope** (str) - 该类名称。 - **name_scope** (str) - 该类名称。
- **groups** (int) - 从 channel 中分离出来的 group 的数目。 - **groups** (int) - 从通道中分离出来的 ``group`` 的数目。
- **epsilon** (float) - 为防止方差除零,增加一个很小的值,默认为1e-05。 - **epsilon** (float, 可选) - 为防止方差除零,增加一个很小的值。默认值:1e-05。
- **param_attr** (ParamAttr|None) - 可学习标度的参数属性 :math:`g`,如果设置为False,则不会向输出单元添加标度。如果设置为0,偏差初始化为1。默认值:None - **param_attr** (ParamAttr, 可选) - 指定权重参数属性的对象。默认值为None,表示使用默认的权重参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr`
- **bias_attr** (ParamAttr|None) - 可学习偏置的参数属性 :math:`b ` , 如果设置为False,则不会向输出单元添加偏置量。如果设置为零,偏置初始化为零。默认值:None - **bias_attr** (ParamAttr, 可选) - 指定偏置参数属性的对象。默认值为None,表示使用默认的偏置参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr`
- **act** (str) - 将激活应用于输出的 group normalizaiton - **act** (str, 可选) - 应用于输出上的激活函数,如tanh、softmax、sigmoid,relu等,支持列表请参考 :ref:`api_guide_activations` ,默认值为None。
- **data_layout** (string|NCHW) - 只支持NCHW - **data_layout** (str, 可选) - 只支持“NCHW”(num_batches,channels,height,width)格式。默认值:“NCHW”
返回: 一个张量变量,它是对输入进行 group normalization 后的结果。 返回:无
返回类型:Variable
抛出异常:
- ValueError - 如果 ``data_layout`` 不是“NCHW”格式。
**代码示例** **代码示例**
.. code-block:: python .. code-block:: python
import paddle.fluid as fluid import paddle.fluid as fluid
import numpy import numpy s np
with fluid.dygraph.guard(): with fluid.dygraph.guard():
x = numpy.random.random((8, 32, 32)).astype('float32') x = np.random.random((8, 32, 32)).astype('float32')
groupNorm = fluid.dygraph.nn.GroupNorm('GroupNorm', groups=4) groupNorm = fluid.dygraph.nn.GroupNorm('GroupNorm', groups=4)
ret = groupNorm(fluid.dygraph.base.to_variable(x)) ret = groupNorm(fluid.dygraph.base.to_variable(x))
...@@ -5,53 +5,49 @@ LayerNorm ...@@ -5,53 +5,49 @@ LayerNorm
.. py:class:: paddle.fluid.dygraph.LayerNorm(name_scope, scale=True, shift=True, begin_norm_axis=1, epsilon=1e-05, param_attr=None, bias_attr=None, act=None) .. py:class:: paddle.fluid.dygraph.LayerNorm(name_scope, scale=True, shift=True, begin_norm_axis=1, epsilon=1e-05, param_attr=None, bias_attr=None, act=None)
该接口用于构建 ``LayerNorm`` 类的一个可调用对象,具体用法参照 ``代码示例`` 。其中实现了层归一化层(Layer Normalization Layer)的功能,其可以应用于小批量输入数据。更多详情请参考:`Layer Normalization <https://arxiv.org/pdf/1607.06450v1.pdf>`_
假设特征向量存在于维度 ``begin_norm_axis ... rank (input)`` 上,计算大小为 ``H`` 的特征向量a在该维度上的矩统计量,然后使用相应的统计量对每个特征向量进行归一化。 之后,如果设置了 ``scale`` 和 ``shift`` ,则在标准化的张量上应用可学习的增益和偏差以进行缩放和移位。 计算公式如下
请参考 `Layer Normalization <https://arxiv.org/pdf/1607.06450v1.pdf>`_ .. math::
\\\mu=\frac{1}{H}\sum_{i=1}^{H}x_i\\
公式如下 \\\sigma=\sqrt{\frac{1}{H}\sum_i^H{(x_i-\mu)^2} + \epsilon}\\
.. math:: \\y=f(\frac{g}{\sigma}(x-\mu) + b)\\
\\\mu=\frac{1}{H}\sum_{i=1}^{H}a_i\\
.. math::
\\\sigma=\sqrt{\frac{1}{H}\sum_i^H{(a_i-\mu)^2}}\\
.. math::
\\h=f(\frac{g}{\sigma}(a-\mu) + b)\\
- :math:`\alpha` : 该层神经元输入总和的向量表示 - :math:`x` : 该层神经元的向量表示
- :math:`H` : 层中隐藏的神经元个数 - :math:`H` : 层中隐藏神经元个数
- :math:`g` : 可训练的缩放因子参数 - :math:`\epsilon` : 添加较小的值到方差中以防止除零
- :math:`b` : 可训练的bias参数 - :math:`g` : 可训练的比例参数
- :math:`b` : 可训练的偏差参数
参数: 参数
- **name_scope** (str) – 该类的名称 - **name_scope** (str) – 该类的名称
- **scale** (bool) - 是否在归一化后学习自适应增益g。默认为True。 - **scale** (bool, 可选) - 指明是否在归一化后学习自适应增益 ``g`` 。默认值:True。
- **shift** (bool) - 是否在归一化后学习自适应偏差b。默认为True。 - **shift** (bool, 可选) - 指明是否在归一化后学习自适应偏差 ``b`` 。默认值:True。
- **begin_norm_axis** (int) - ``begin_norm_axis`` 到 ``rank(input)`` 的维度执行规范化。默认1。 - **begin_norm_axis** (int, 可选) - 指明归一化将沿着 ``begin_norm_axis`` 到 ``rank(input)`` 的维度执行。默认值:1。
- **epsilon** (float) - 添加到方差的很小的值,以防止除零。默认1e-05。 - **epsilon** (float, 可选) - 指明在计算过程中是否添加较小的值到方差中以防止除零。默认值:1e-05。
- **param_attr** (ParamAttr | None) - 可学习增益g的参数属性。如果 ``scale`` 为False,则省略 ``param_attr`` 。如果 ``scale`` 为True且 ``param_attr`` 为None,则默认 ``ParamAttr`` 将作为比例。如果添加了 ``param_attr``, 则将其初始化为1。默认None - **param_attr** (ParamAttr, 可选) - 指定权重参数属性的对象。默认值为None,表示使用默认的权重参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr`
- **bias_attr** (ParamAttr | None) - 可学习偏差的参数属性b。如果 ``shift`` 为False,则省略 ``bias_attr`` 。如果 ``shift`` 为True且 ``param_attr`` 为None,则默认 ``ParamAttr`` 将作为偏差。如果添加了 ``bias_attr`` ,则将其初始化为0。默认None - **bias_attr** (ParamAttr, 可选) - 指定偏置参数属性的对象。默认值为None,表示使用默认的偏置参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr`
- **act** (str) - 激活函数。默认 None - **act** (str, 可选) - 应用于输出上的激活函数,如tanh、softmax、sigmoid,relu等,支持列表请参考 :ref:`api_guide_activations` ,默认值为None。
返回: 标准化后的结果 返回:
**代码示例** **代码示例**
.. code-block:: python .. code-block:: python
import paddle.fluid as fluid import paddle.fluid as fluid
from paddle.fluid.dygraph.base import to_variable
import numpy import numpy
x = numpy.random.random((3, 32, 32)).astype('float32')
with fluid.dygraph.guard(): with fluid.dygraph.guard():
x = numpy.random.random((3, 32, 32)).astype('float32') x = to_variable(x)
layerNorm = fluid.dygraph.nn.LayerNorm( layernorm = fluid.LayerNorm('LayerNorm', begin_norm_axis=1)
'LayerNorm', begin_norm_axis=1) ret = layernorm(x)
ret = layerNorm(fluid.dygraph.base.to_variable(x))
...@@ -5,19 +5,18 @@ SpectralNorm ...@@ -5,19 +5,18 @@ SpectralNorm
.. py:class:: paddle.fluid.dygraph.SpectralNorm(name_scope, dim=0, power_iters=1, eps=1e-12, name=None) .. py:class:: paddle.fluid.dygraph.SpectralNorm(name_scope, dim=0, power_iters=1, eps=1e-12, name=None)
该接口用于构建 ``SpectralNorm`` 类的一个可调用对象,具体用法参照 ``代码示例`` 。其中实现了谱归一化层的功能,用于计算fc、conv1d、conv2d、conv3d层的权重参数的谱正则值,输入权重参数应分别为2-D, 3-D, 4-D, 5-D张量,输出张量与输入张量维度相同。谱特征值计算方式如下:
该层计算了fc、conv1d、conv2d、conv3d层的权重参数的谱正则值,其参数应分别为2-D, 3-D, 4-D, 5-D。计算结果如下 步骤1:生成形状为[H]的向量U,以及形状为[W]的向量V,其中H是输入权重张量的第 ``dim`` 个维度,W是剩余维度的乘积
步骤1:生成形状为[H]的向量U,以及形状为[W]的向量V,其中H是输入权重的第 ``dim`` 个维度,W是剩余维度的乘积。 步骤2: ``power_iters`` 应该是一个正整数,用U和V迭代计算 ``power_iters`` 轮,迭代步骤如下。
步骤2: ``power_iters`` 应该是一个正整数,用U和V迭代计算 ``power_iters`` 轮。
.. math:: .. math::
\mathbf{v} &:= \frac{\mathbf{W}^{T} \mathbf{u}}{\|\mathbf{W}^{T} \mathbf{u}\|_2}\\ \mathbf{v} &:= \frac{\mathbf{W}^{T} \mathbf{u}}{\|\mathbf{W}^{T} \mathbf{u}\|_2}\\
\mathbf{u} &:= \frac{\mathbf{W}^{T} \mathbf{v}}{\|\mathbf{W}^{T} \mathbf{v}\|_2} \mathbf{u} &:= \frac{\mathbf{W}^{T} \mathbf{v}}{\|\mathbf{W}^{T} \mathbf{v}\|_2}
步骤3:计算 \sigma(\mathbf{W}) 并权重值归一化。 步骤3:计算 :math:`\sigma(\mathbf{W})` 并特征值值归一化。
.. math:: .. math::
\sigma(\mathbf{W}) &= \mathbf{u}^{T} \mathbf{W} \mathbf{v}\\ \sigma(\mathbf{W}) &= \mathbf{u}^{T} \mathbf{W} \mathbf{v}\\
...@@ -26,32 +25,23 @@ SpectralNorm ...@@ -26,32 +25,23 @@ SpectralNorm
可参考: `Spectral Normalization <https://arxiv.org/abs/1802.05957>`_ 可参考: `Spectral Normalization <https://arxiv.org/abs/1802.05957>`_
参数: 参数:
- **name_scope** (str)-该类的名称。 - **name_scope** (str) - 该类的名称。
- **dim** (int)-将输入(weight)重塑为矩阵之前应排列到第一个的维度索引,如果input(weight)是fc层的权重,则应设置为0;如果input(weight)是conv层的权重,则应设置为1,默认为0。 - **dim** (int, 可选) - 将输入(weight)重塑为矩阵之前应排列到第一个的维度索引,如果input(weight)是fc层的权重,则应设置为0;如果input(weight)是conv层的权重,则应设置为1。默认值:0。
- **power_iters** (int)-将用于计算spectral norm的功率迭代次数,默认值1。 - **power_iters** (int, 可选) - 将用于计算的 ``SpectralNorm`` 功率迭代次数,默认值:1。
- **eps** (float)-epsilon用于计算规范中的数值稳定性,默认值为1e-12 - **eps** (float, 可选) - ``eps`` 用于保证计算规范中的数值稳定性,分母会加上 ``eps`` 防止除零。默认值:1e-12。
- **name** (str)-此层的名称,可选。 - **name** (str, 可选) - 具体用法请参见 :ref:`api_guide_Name` ,一般无需设置,默认值为None。
返回:谱正则化后权重参数的张量变量
返回类型:Variable 返回:无
**代码示例**: **代码示例**:
.. code-block:: python .. code-block:: python
import paddle.fluid as fluid import paddle.fluid as fluid
import numpy import numpy as np
with fluid.dygraph.guard(): with fluid.dygraph.guard():
x = numpy.random.random((2, 8, 32, 32)).astype('float32') x = np.random.random((2, 8, 32, 32)).astype('float32')
spectralNorm = fluid.dygraph.nn.SpectralNorm('SpectralNorm', dim=1, power_iters=2) spectralNorm = fluid.dygraph.nn.SpectralNorm('SpectralNorm', dim=1, power_iters=2)
ret = spectralNorm(fluid.dygraph.base.to_variable(x)) ret = spectralNorm(fluid.dygraph.base.to_variable(x))
...@@ -5,52 +5,50 @@ layer_norm ...@@ -5,52 +5,50 @@ layer_norm
.. py:function:: paddle.fluid.layers.layer_norm(input, scale=True, shift=True, begin_norm_axis=1, epsilon=1e-05, param_attr=None, bias_attr=None, act=None, name=None) .. py:function:: paddle.fluid.layers.layer_norm(input, scale=True, shift=True, begin_norm_axis=1, epsilon=1e-05, param_attr=None, bias_attr=None, act=None, name=None)
假设特征向量存在于维度 ``begin_norm_axis ... rank (input)`` 上,计算大小为 ``H`` 的特征向量a在该维度上的矩统计量,然后使用相应的统计量对每个特征向量进行归一化。 之后,如果设置了 ``scale`` 和 ``shift`` ,则在标准化的张量上应用可学习的增益和偏差以进行缩放和移位。 该OP实现了层归一化层(Layer Normalization Layer),其可以应用于小批量输入数据。更多详情请参考:`Layer Normalization <https://arxiv.org/pdf/1607.06450v1.pdf>`_
请参考 `Layer Normalization <https://arxiv.org/pdf/1607.06450v1.pdf>`_ 计算公式如下
公式如下
.. math::
\\\mu=\frac{1}{H}\sum_{i=1}^{H}a_i\\
.. math::
\\\sigma=\sqrt{\frac{1}{H}\sum_i^H{(a_i-\mu)^2}}\\
.. math:: .. math::
\\h=f(\frac{g}{\sigma}(a-\mu) + b)\\ \\\mu=\frac{1}{H}\sum_{i=1}^{H}x_i\\
- :math:`\alpha` : 该层神经元输入总和的向量表示
- :math:`H` : 层中隐藏的神经元个数
- :math:`g` : 可训练的缩放因子参数
- :math:`b` : 可训练的bias参数
参数:
- **input** (Variable) - 输入张量变量。
- **scale** (bool) - 是否在归一化后学习自适应增益g。默认为True。
- **shift** (bool) - 是否在归一化后学习自适应偏差b。默认为True。
- **begin_norm_axis** (int) - ``begin_norm_axis`` 到 ``rank(input)`` 的维度执行规范化。默认1。
- **epsilon** (float) - 添加到方差的很小的值,以防止除零。默认1e-05。
- **param_attr** (ParamAttr | None) - 可学习增益g的参数属性。如果 ``scale`` 为False,则省略 ``param_attr`` 。如果 ``scale`` 为True且 ``param_attr`` 为None,则默认 ``ParamAttr`` 将作为比例。如果添加了 ``param_attr``, 则将其初始化为1。默认None。
- **bias_attr** (ParamAttr | None) - 可学习偏差的参数属性b。如果 ``shift`` 为False,则省略 ``bias_attr`` 。如果 ``shift`` 为True且 ``param_attr`` 为None,则默认 ``ParamAttr`` 将作为偏差。如果添加了 ``bias_attr`` ,则将其初始化为0。默认None。
- **act** (str) - 激活函数。默认 None
- **name** (str) - 该层的名称, 可选的。默认为None,将自动生成唯一名称。
返回: 标准化后的结果
**代码示例**
.. code-block:: python
import paddle.fluid as fluid
data = fluid.layers.data(name='data', shape=[3, 32, 32],
dtype='float32')
x = fluid.layers.layer_norm(input=data, begin_norm_axis=1)
\\\sigma=\sqrt{\frac{1}{H}\sum_i^H{(x_i-\mu)^2} + \epsilon}\\
\\y=f(\frac{g}{\sigma}(x-\mu) + b)\\
- :math:`x` : 该层神经元的向量表示
- :math:`H` : 层中隐藏神经元个数
- :math:`\epsilon` : 添加较小的值到方差中以防止除零
- :math:`g` : 可训练的比例参数
- :math:`b` : 可训练的偏差参数
参数:
- **input** (Variable) - 维度为任意维度的多维 ``Tensor`` ,数据类型为float32或float64。
- **scale** (bool, 可选) - 指明是否在归一化后学习自适应增益 ``g`` 。默认值:True。
- **shift** (bool, 可选) - 指明是否在归一化后学习自适应偏差 ``b`` 。默认值:True。
- **begin_norm_axis** (int, 可选) - 指明归一化将沿着 ``begin_norm_axis`` 到 ``rank(input)`` 的维度执行。默认值:1。
- **epsilon** (float, 可选) - 指明在计算过程中是否添加较小的值到方差中以防止除零。默认值:1e-05。
- **param_attr** (ParamAttr, 可选) - 指定权重参数属性的对象。默认值为None,表示使用默认的权重参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr` 。
- **bias_attr** (ParamAttr, 可选) - 指定偏置参数属性的对象。默认值为None,表示使用默认的偏置参数属性。具体用法请参见 :ref:`cn_api_fluid_ParamAttr` 。
- **act** (str, 可选) - 应用于输出上的激活函数,如tanh、softmax、sigmoid,relu等,支持列表请参考 :ref:`api_guide_activations` ,默认值为None。
- **name** (str, 可选) - 具体用法请参见 :ref:`api_guide_Name` ,一般无需设置,默认值为None。。
返回:表示归一化结果的 ``Tensor`` ,数据类型和 ``input`` 一致,返回维度和 ``input`` 一致。
返回类型:Variable
**代码示例**
.. code-block:: python
import paddle.fluid as fluid
import numpy as np
x = fluid.layers.data(name='x', shape=[3, 32, 32], dtype='float32')
hidden1 = fluid.layers.layer_norm(input=x, begin_norm_axis=1)
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
np_x = np.random.random(size=(8, 3, 32, 32)).astype('float32')
output = exe.run(feed={"x": np_x}, fetch_list = [hidden1])
print(output)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册