关于pytorch中super的一点思考,结合代码
生活随笔
收集整理的這篇文章主要介紹了
关于pytorch中super的一点思考,结合代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
class ResidualAdd(nn.Module):def __init__(self, fn):super().__init__()#inherit fa class's init methodself.fn = fndef forward(self, x, **kwargs):res = xx = self.fn(x, **kwargs)x += resreturn x
#該類必須定義成員函數(shù),不然在TransformerEncoderBlock調(diào)用父類的forward方法時會報錯。class FeedForwardBlock(nn.Sequential):def __init__(self, emb_size: int, expansion: int = 4, drop_p: float = 0.):super().__init__(nn.Linear(emb_size, expansion * emb_size),nn.GELU(),nn.Dropout(drop_p),nn.Linear(expansion * emb_size, emb_size),)#這里 FeedForwardBlock類的父類為nn.Sequential,且通過super().__init__()顯示調(diào)用了父類的初
#始化方法,因此繼承了分類的屬性和方法,因此在使用的時候,即使FeedForwardBlock沒有顯示定義方法函
#數(shù),也可以調(diào)用父類的forward方法。class TransformerEncoderBlock(nn.Sequential):def __init__(self,emb_size: int = 768,drop_p: float = 0.,forward_expansion: int = 4,forward_drop_p: float = 0.,** kwargs):super().__init__(ResidualAdd(nn.Sequential(nn.LayerNorm(emb_size),MultiHeadAttention(emb_size, **kwargs),nn.Dropout(drop_p))),ResidualAdd(nn.Sequential(nn.LayerNorm(emb_size),FeedForwardBlock(emb_size, expansion=forward_expansion, drop_p=forward_drop_p),nn.Dropout(drop_p))))#這里稍顯復雜,主要是ResidualAdd里的nn.Sequential具有迷惑性,這里的nn.Sequential與
#TransformerEncorderBlock的父類沒有太多關聯(lián)含義,這里在使用時,先初始化一個ResidualAdd對象,
#然后,由于這里TransformerEncorderBlock仍然顯示調(diào)用了父類的初始化方法,因此,繼承了父類的屬性
#和方法,在使用的時候會調(diào)用nn.Squential里的forward方法。class Sequential(Module):def __init__(self, *args: Any):super(Sequential, self).__init__()if len(args) == 1 and isinstance(args[0], OrderedDict):for key, module in args[0].items():self.add_module(key, module)else:for idx, module in enumerate(args):self.add_module(str(idx), module)def forward(self, input):for module in self:input = module(input)return input#關于父類nn.Sequential主要部分的代碼,我們可以看出,其初始化參數(shù)是實例化對象,因此每個實例化對象
#的類都須有forward函數(shù),不然在input = module(input)時就會報錯,這也是為什么ResidualAdd必
#須有forward的原因
參考:https://blog.csdn.net/ZEdwin/article/details/117296675
????????? ?讓python類直接被調(diào)用_csldh的博客-CSDN博客_python直接調(diào)用類
????????? ?https://blog.csdn.net/a__int__/article/details/104600972
總結
以上是生活随笔為你收集整理的关于pytorch中super的一点思考,结合代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验问题集中记录
- 下一篇: einops包中的rearrange,r