是init就是创建模型对象时的初始化操作,
forward就是模型对象被当成函数调用时自动触发的方法
init是为了初始化对象的架构,forward定义计算流程。
forward 会在 __call__ 自动调用 和c++ 编辑overload 编辑operator ()没区别。
就是init一次,构建一个新对象,权重也是新的。
class LayerNorm(nn.Module):
def __init__(self,feature,eps=le-6):
"""
"""
super(LayerNorm,self).__init__()
self.a_2=nn.Parameter(torch.ones(feature))
self.b_2=nn.Parameter(torch.zeros(feature))
self.eps=eps
def forward(self,x):
mean=x.mean(-1,keepdim=True)
std=x.std(-1,keepdim=True)
return self.a_2*(x-mean)/(std+self.eps)+self.b_2
class SublayerConnection(nn.Module):
"""
这不仅仅做了残差,这是把残差和layernorm一起做了
"""
def __init__(self,size,dropout=0.1):
super(SublayerConnection,self).__init__()
#第一步,做layernorm
self.layer_norm=LayerNorm(size)
#第二步,做dropout ,可做可不做,避免过拟合,提升性能,其实重点是layerno
self.dropout=nn.Dropout(p=dropout)
def forward(self,x,sublayer):
"""
参数x:就是self-attention的输入
参数 sublayer:self-attention层
"""
return self.dropout(self.layer_norm(x+sublayer(x)))