Pytorch 模型中buffer的使用

2021-09-26 09:23:14 字數 1557 閱讀 3947

感覺就是將乙個常量賦值給了乙個張量。

我們知道,pytorch一般情況下,是將網路中的引數儲存成ordereddict形式的。這裡額引數其實包括2種:一種是模型中各種 module含的引數,即nn.parameter,我們當然可以在網路中定義其他的nn.parameter引數。另外一種是buffer。前者每次optim.step會得到更新,而不會更新後者。

第乙個例子

class mymodel(nn.module):

def __init__(self, kernel_size=3):

super(depth_guided1, self).__init__()

self.kernel_size = kernel_size

self.back_end = torch.nn.sequential(

torch.nn.conv2d(3, 32, 3, padding=1),

torch.nn.relu(true),

torch.nn.conv2d(3, 64, 3, padding=1),

torch.nn.relu(true),

torch.nn.conv2d(64, 3, 3, padding=1),

torch.nn.relu(true),

)mybuffer = np.arange(1,10,1)

self.mybuffer_tmp = np.randn((len(mybuffer), 1, 1, 10), dtype='float32')

self.mybuffer_tmp = torch.from_numpy(self.mybuffer_tmp)

# register preset variables as buffer

# so that, in testing , we can use buffer variables.

self.register_buffer('mybuffer', self.mybuffer_tmp)

# learnable weights

self.conv_weights = nn.parameter(torch.floattensor(64, 10).normal_(mean=0, std=0.01))

# other code

def forward(self):

...# 這裡使用 self.mybuffer!

i. 定義parameter和buffer都只需要傳入 tensor即可。也不需要將其轉成gpu。這是因為,當網路進行 .cuda()時候,會自動將裡面的層的引數,buffer等轉換成相應的gpu上。

ii. self.register_buffer可以將tensor註冊成buffer,在forward中使用self.mybuffer, 而不是self.mybuffer_tmp.

iii. 網路儲存時也會將buffer存下,當網路load模型時,會將儲存的模型的buffer也進行賦值。

iv. buffer的更新在forward中,optim.step只能更新nn.parameter型別的引數。

pytorch設計模型

1.nn.modulelist使對於加入其中的子模組,不必在forward中依次呼叫 nn.sequentialt使對於加入其中的子模組在forward中可以通過迴圈實現呼叫 2.pytorch中nn.modulelist和nn.sequential的用法和區別 nn.sequential定義的網路...

Pytorch 四 訓練模型

1.在前三部分已經分別完成了資料的處理 神經網路的定義,還有優化器 損失函式的選擇,這次我們將開始學習如何訓練模型。2.模型的訓練其實也是套路,大致分為一下五個部分。1 載入trainloader中的資料,並將其轉換為variable 形式的資料,作為神經網路的輸入。2 每次迴圈開始之前,確保梯度的...

pytorch模型訓練步驟

講解 textcnn模型 1.載入conf檔案 x import module models.model name config x.config dataset,embedding 2.載入model,初始化conf裡面值 model x.model config to config.device...