第二十四篇—模型中的parameter和buffer
部分一:模型保存
模型保存方式:
模型加載方式:
保存的內(nèi)容是model.state_dict()的返回對(duì)象,是一個(gè)OrderedDict,以鍵值對(duì)(key-val)的形式包含模型中需要保存下來的參數(shù),如:
打印模型:

打印模型參數(shù):

部分二:模型中的parameter和buffer
parameter在反向傳播時(shí)會(huì)被optimizer.step更新,而buffer在反向傳播時(shí)不會(huì)被更新;
parameter和buffer都保存在model.state_dict()返回的OrderedDict對(duì)象中;
模型進(jìn)行設(shè)備移動(dòng)時(shí),模型中注冊(cè)的參數(shù)(parameter和buffer),即model.state_dict()中的內(nèi)容會(huì)同時(shí)進(jìn)行移動(dòng)。
創(chuàng)建parameter和buffer
創(chuàng)建parameter:
方法一:直接將模型的成員變量self.xxx通過nn.Parameter()創(chuàng)建,會(huì)自動(dòng)注冊(cè)到model.parameters()中;
方法二:先通過nn.Parameter()創(chuàng)建普通的parameter對(duì)象,此時(shí)該對(duì)象不作為模型的成員變量,然后將parameter對(duì)象通過register_parameter()注冊(cè)到model.parameters()中;
創(chuàng)建buffer:
通過register_buffer()注冊(cè)到model.buffers()中;
注意一:parameter和buffer都保存在model.state_dict()中,舉例如下:
結(jié)果如下:

注意二:需要進(jìn)行梯度更新的模型參數(shù)屬于parameter,而不是buffer中。實(shí)際上,parameter的創(chuàng)建在torch.nn.Linear類中的__init__函數(shù)中完成,成員變量weight和bias都屬于parameter對(duì)象,并在這里進(jìn)行了初始化,__init__函數(shù)如下圖:

代碼舉例:
打印結(jié)果:

parameter在反向傳播時(shí)會(huì)被optimizer.step更新,而buffer在反向傳播時(shí)不會(huì)被更新,舉例如下:
結(jié)果如下(buffer不變;parameter更新):

注意三:數(shù)據(jù)轉(zhuǎn)換為buffer的原因
原因一:parameter和buffer都保存在model.state_dict()返回的OrderedDict對(duì)象中,如果保存模型的方法是torch.save(model.state_dict(),PATH),那么類中普通成員數(shù)據(jù)如果不注冊(cè)為parameter或buffer,就不能被保存,因?yàn)橹挥衜odel.state_dict()中的內(nèi)容會(huì)被保存,即只保存parameter和buffer;
原因二:模型進(jìn)行設(shè)備移動(dòng)時(shí),模型中注冊(cè)的參數(shù)(parameter和buffer),即model.state_dict()中的內(nèi)容會(huì)同時(shí)進(jìn)行移動(dòng),而類中普通成員數(shù)據(jù)如果不注冊(cè)為parameter或buffer,就不能被移動(dòng),如下所示:
結(jié)果如下(只有model.state_dict()中的內(nèi)容,即parameter和buffer,轉(zhuǎn)移到了GPU;而普通成員變量沒被轉(zhuǎn)移,仍在CPU上):
