PyTorch之nn.ReLU與F.ReLU的區別介紹
我就廢話不多說了,大家還是直接看程式碼吧~
import torch.nn as nn import torch.nn.functional as F import torch.nn as nn class AlexNet_1(nn.Module): def __init__(self,num_classes=n): super(AlexNet,self).__init__() self.features = nn.Sequential( nn.Conv2d(3,64,kernel_size=3,stride=2,padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True),) def forward(self,x): x = self.features(x) class AlexNet_2(nn.Module): def __init__(self,x): x = self.features(x) x = F.ReLU(x)
在如上網路中,AlexNet_1與AlexNet_2實現的結果是一致的,但是可以看到將ReLU層新增到網路有兩種不同的實現,即nn.ReLU和F.ReLU兩種實現方法。
其中nn.ReLU作為一個層結構,必須新增到nn.Module容器中才能使用,而F.ReLU則作為一個函式呼叫,看上去作為一個函式呼叫更方便更簡潔。具體使用哪種方式,取決於程式設計風格。
在PyTorch中,nn.X都有對應的函式版本F.X,但是並不是所有的F.X均可以用於forward或其它程式碼段中,因為當網路模型訓練完畢時,在儲存model時,在forward中的F.X函式中的引數是無法儲存的。
也就是說,在forward中,使用的F.X函式一般均沒有狀態引數,比如F.ReLU,F.avg_pool2d等,均沒有引數,它們可以用在任何程式碼片段中。
補充知識:pytorch小知識點——in-place operation
一、什麼是in-place
在pytorch的很多函式中經常看到in-place選項,具體是什麼意思一直一知半解。這次專門來學習一下,in-place operation在pytorch中是指改變一個tensor的值的時候,不經過複製操作,而是直接在原來的記憶體上改變它的值。可以把它稱為原地操作符。
在pytorch中經常加字尾“_”來代表原地in-place operation,比如說.add_() 或者.scatter()。我們可以將in_place操作簡單的理解類似於python中的"+=","-="等操作。
舉個例子,下面是正常的加操作,執行結束後x的值沒有變化
import torch x = torch.rand(2) x Out[3]: tensor([0.3486,0.2924]) #<-----這是x初始值 y = torch.rand(2) y Out[5]: tensor([0.6301,0.0101]) #<-----這是y初始值 x.add(y) Out[6]: tensor([0.9788,0.3026]) #<-----這是x+y的結果 x Out[7]: tensor([0.3486,0.2924]) #<-----這是執行操作之後x的值 y Out[8]: tensor([0.6301,0.0101]) #<-----這是執行操作之後y的值
我們可以發現,在正常操作之後原運算元的值不會發生變化。
下面我們來看看in_place操作
import torch x = torch.rand(2) x Out[3]: tensor([0.3486,0.2924]) #<-----這是x初始值 y = torch.rand(2) y Out[5]: tensor([0.6301,0.0101]) #<-----這是y初始值 x.add_(y) Out[9]: tensor([0.9788,0.3026]) #<-----這是x+y結果 x Out[10]: tensor([0.9788,0.3026]) #<-----這是操作後x的值 y Out[11]: tensor([0.6301,0.0101]) #<-----這是操作後y的值
通過對比可以發現,in_place操作之後,原運算元等於表示式計算結果。也就是說將計算結果賦給了原運算元。
二、不能使用in-place的情況
對於 requires_grad=True 的 葉子張量(leaf tensor) 不能使用 inplace operation
對於在 求梯度階段需要用到的張量 不能使用 inplace operation
以上這篇PyTorch之nn.ReLU與F.ReLU的區別介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。