主要就是了解一下pytorch中的使用layernorm这种归一化之后的数据变化,以及数据使用relu,prelu,leakyrelu之后的变化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import torch import torch.nn as nn import torch.nn.functional as F class model(nn.Module): def __init__(self): super(model, self).__init__() self.LN=nn.LayerNorm(10,eps=0,elementwise_affine=True) self.PRelu=nn.PReLU(init=0.25) self.Relu=nn.ReLU() self.LeakyReLU=nn.LeakyReLU(negative_slope=0.01,inplace=False) def forward(self,input ): out=self.LN(input) print("LN:",out) out1=self.PRelu(out) print("PRelu:",out1) out2=self.Relu(out) print("Relu:",out2) out3=self.LeakyReLU(out) print("LeakyRelu:",out3) return out tensor=torch.tensor([-0.9,0.1,0,-0.1,0.9,-0.4,0.9,-0.5,0.8,0.1]) net=model() print(tensor) net(tensor) |
输出:
1 2 3 4 5 6 7 8 9 10 | tensor([-0.9000, 0.1000, 0.0000, -0.1000, 0.9000, -0.4000, 0.9000, -0.5000, 0.8000, 0.1000]) LN: tensor([-1.6906, 0.0171, -0.1537, -0.3245, 1.3833, -0.8368, 1.3833, -1.0076, 1.2125, 0.0171], grad_fn=<NativeLayerNormBackward>) Relu: tensor([0.0000, 0.0171, 0.0000, 0.0000, 1.3833, 0.0000, 1.3833, 0.0000, 1.2125, 0.0171], grad_fn=<ReluBackward0>) PRelu: tensor([-0.4227, 0.0171, -0.0384, -0.0811, 1.3833, -0.2092, 1.3833, -0.2519, 1.2125, 0.0171], grad_fn=<PreluBackward>) LeakyRelu: tensor([-0.0169, 0.0171, -0.0015, -0.0032, 1.3833, -0.0084, 1.3833, -0.0101, 1.2125, 0.0171], grad_fn=<LeakyReluBackward0>) |
从上面可以看出,这个LayerNorm的归一化,并不是将数据限定在0-1之间,也没有进行一个类似于高斯分布一样的分数,只是将其进行了一个处理,对应的数值得到了一些变化,相同数值的变化也是相同的。
Relu的则是单纯将小于0的数变成了0,减少了梯度消失的可能性
PRelu是一定程度上的保留了负值,根据init给的值。
LeakyRelu也是一定程度上保留负值,不过比较小,应该是根据negative_slope给的值。