歡迎您光臨本站 註冊首頁

PyTorch之nn.ReLU與F.ReLU的區別介紹

←手機掃碼閱讀     lousu-xi @ 2020-06-28 , reply:0

我就廢話不多說了,大家還是直接看代碼吧~

  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, 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),       )       def forward(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



[lousu-xi ] PyTorch之nn.ReLU與F.ReLU的區別介紹已經有511次圍觀

http://coctec.com/docs/python/shhow-post-240055.html