0201 爲什麼 Pytorch 定義模型要有一個 init 和一個 forward,兩者怎麼區分

https://www.bilibili.com/video/BV1GB4y1H7hq?spm_id_from=333.999.0.0&vd_source=b1ce52b6eb3a9e6c2360a4b7172edf5a

class LayerNorm(nn.Module):

    def __init__(self, feature, eps=1e-6):
        """
        :param feature: self-attention 的 x 的大小
        :param eps:
        """
        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
    
    
# python 面向對象
# 當你不做高拓展的時候,下面這種寫法被你給寫死了
# 一個 512 維的向量,還有一個 256 維的向量
l1 = LayerNorm(10)
l2 = LayerNorm(20)

l1()

l1()


l1()

l1()

l1()
l2()

今天

class LayerNorm1(nn.Module):

    def __init__(self):
        """
        :param feature: self-attention 的 x 的大小
        :param eps:
        """
        super(LayerNorm1, self).__init__()

    def forward(self, feature, x, eps=1e-6):
        self.a_2 = nn.Parameter(torch.ones(feature))
        self.b_2 = nn.Parameter(torch.zeros(feature))
        self.eps = eps
        mean = x.mean(-1, keepdim=True)
        std = x.std(-1, keepdim=True)
        return self.a_2 * (x - mean) / (std + self.eps) + self.b_2
    
l3 = LayerNorm1()
l3(1)


l3(1)
l3(1)


l3(1)
l3(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章