比较与torch.nn.LayerNorm的功能差异

查看源文件

torch.nn.LayerNorm

class torch.nn.LayerNorm(
    normalized_shape,
    eps=1e-05,
    elementwise_affine=True
)(input) -> Tensor

更多内容详见torch.nn.LayerNorm

mindspore.nn.LayerNorm

class mindspore.nn.LayerNorm(
    normalized_shape,
    begin_norm_axis=-1,
    begin_params_axis=-1,
    gamma_init='ones',
    beta_init='zeros',
    epsilon=1e-7
)(x) -> Tensor

更多内容详见mindspore.nn.LayerNorm

差异对比

PyTorch:在mini-batch输入上应用层归一化(Layer Normalization),其中参数elementwise_affine用于控制是否采用可学习参数。

MindSpore:MindSpore此API实现功能与PyTorch基本一致,但MindSpore中不存在参数elementwise_affine,同时增加了参数begin_norm_axis控制归一化开始计算的轴,参数begin_params_axis控制第一个参数(beta, gamma)的维度,以及参数gamma_initbeta_init用来控制γ参数和β参数的初始化方法。

分类

子类

PyTorch

MindSpore

差异

参数

参数1

normalized_shape

normalized_shape

PyTorch支持int/list,MindSpore此参数支持tuple/list

参数2

eps

epsilon

功能一致,参数名不同,默认值不同

参数3

elementwise_affine

-

PyTorch中此参数用于控制是否采用可学习参数,MindSpore无此参数

参数4

-

begin_norm_axis

MindSpore中的此参数控制归一化开始计算的轴,PyTorch无此参数

参数5

-

begin_params_axis

MindSpore中的此参数控制第一个参数(beta, gamma)的维度,PyTorch无此参数

参数6

-

gamma_init

MindSpore中的此参数控制γ参数的初始化方法,PyTorch无此参数

参数7

-

beta_init

MindSpore中的此参数控制β参数的初始化方法,PyTorch无此参数

输入

单输入

input

x

功能一致,参数名不同

代码示例

PyTorch的参数elementwise_affine为True时,两API功能一致,用法相同。

# PyTorch
import torch
import torch.nn as nn

inputs = torch.ones([20, 5, 10, 10])
m = nn.LayerNorm(inputs.size()[1:])
output = m(inputs)
print(output.detach().numpy().shape)
# (20, 5, 10, 10)

# MindSpore
import mindspore
from mindspore import Tensor
import mindspore.numpy as np
import mindspore.nn as nn

x = Tensor(np.ones([20, 5, 10, 10]), mindspore.float32)
shape1 = x.shape[1:]
m = nn.LayerNorm(shape1, begin_norm_axis=1, begin_params_axis=1)
output = m(x).shape
print(output)
# (20, 5, 10, 10)

当PyTorch的num_featuresint类型时,MindSpore应为tuple(int)类型

# PyTorch
import torch
import torch.nn as nn

input_tensor = torch.randn(10, 20, 30)
layer_norm = nn.LayerNorm(normalized_shape=30)
output = layer_norm(input_tensor)
print("Output shape:", output.shape)
# Output shape: torch.Size([10, 20, 30])

# MindSpore
import mindspore
from mindspore import nn

input_tensor = mindspore.ops.randn(10, 20, 30)
layer_norm = nn.LayerNorm(normalized_shape=(30,))
output = layer_norm(input_tensor)
print("Output shape:", output.shape)
# Output shape: (10, 20, 30)