1. 程式人生 > >pytorch系列-----1 python class 中 的__call__方法

pytorch系列-----1 python class 中 的__call__方法

鑑於pytorch在科學論文領域用的越來越多,想寫一個系列文章,講述pytorch的用法。

要學習pytorch,一個前提是 知道python calss中的__call____init__方法.
簡單的說就是:

  • __init__: 類的初始化函式,類似於c++的建構函式
  • __call___: 使得類物件具有類似函式的功能。

__init__比較好理解,現在主要看一下 __call__的功能示例:

class A():
    def __call__(self):
        print('i can be called like a function'
) a = A() a()

out:

i can be called like a function

讓我們在呼叫時傳入引數如何?

class A():
    def __call__(self, param):
        
        print('i can called like a function')
        print('摻入引數的型別是:', type(param))


a = A()


a('i')

out:

i can called like a function
摻入引數的型別是: <class ‘str’>

發現物件a的表現完全類似一個函式

那當然也可以在__call__裡呼叫其他的函式啊,
__call__函式中呼叫forward函式,並且返回呼叫的結果

class A():
    def __call__(self, param):
        
        print('i can called like a function')
        print('傳入引數的型別是:{}   值為: {}'.format(type(param), param))

        res = self.forward(param)
        return res

    def
forward(self, input_): print('forward 函式被呼叫了') print('in forward, 傳入引數型別是:{} 值為: {}'.format( type(input_), input_)) return input_ a = A() input_param = a('i') print("物件a傳入的引數是:", input_param)

out:

i can called like a function
傳入引數的型別是:<class ‘str’> 值為: i
forward 函式被呼叫了
in forward, 傳入引數型別是:<class ‘str’> 值為: i
物件a傳入的引數是: i

現在我們將初始化函式__init__也加上,來看一下:
在物件初始化時確定初始年齡,通過呼叫a(2)為物件年齡增加2歲,

class A():
    def __init__(self, init_age):
        super().__init__()
        print('我年齡是:',init_age)
        self.age = init_age

    def __call__(self, added_age):
        

        res = self.forward(added_age)
        return res

    def forward(self, input_):
        print('forward 函式被呼叫了')
        
        return input_ + self.age
print('物件初始化。。。。')
a = A(10)


input_param = a(2)
print("我現在的年齡是:", input_param)


out:

物件初始化。。。。
我年齡是: 10
forward 函式被呼叫了
我現在的年齡是: 12

pytorch主要也是按照__call__, __init__,forward三個函式實現網路層之間的架構的

這部落格講述了pytorch中具體實現:https://blog.csdn.net/dss_dssssd/article/details/82977170