0606-nn.functional
目錄- 一、nn.functional 和 nn.Module 的區別
- 二、nn.functional 和 nn.Module 結合使用
pytorch完整教程目錄:https://www.cnblogs.com/nickchen121/p/14662511.html
一、nn.functional 和 nn.Module 的區別
nn 中還有一個經常使用的模塊 nn.functional,nn 中的絕大多數的 layer 在 functional 中都有一個和它對應的函式,
nn.functional 和 nn.Module的區別在于,Module 實作的 layers 是一個特殊的類,由 class Layer(nn.Module) 定義,會自動提取可學習的引數;而 functional 中的函式更像是一個純函式,由 def fucntion(input) 定義,
import torch as t
from torch import nn
from torch.autograd import Variable as V
inp = V(t.randn(2, 3))
model = nn.Linear(3, 4)
output1 = model(inp)
output2 = nn.functional.linear(inp, model.weight, model.bias)
output1 == output2
tensor([[True, True, True, True],
[True, True, True, True]])
b = nn.functional.relu(inp)
b2 = nn.ReLU()(inp)
b == b2
tensor([[True, True, True],
[True, True, True]])
從上述代碼可以看到 Module 和 functional 的功能類似,那么這兩者我們什么時候會用到呢?
答案很簡單,如果有可學習的引數時,最好用 Module,反之既可以用 functional,當然也可以用 Module,因為二者在性能上并沒有很大的差別,
例如,由于激活函式、池化等層沒有可學習引數,可以使用對應的 functional 函式代替,而卷積、全連接層有可學習引數,盡量使用 Module,
但是有一個例外,dropout 操作也沒有可學習引數,但是由于 dropout 操作在訓練和測驗兩個階段的行為有區別,如果使用 Module 物件那個能夠通過 model.eval 加以區分,
二、nn.functional 和 nn.Module 結合使用
下面舉例將 functional 和 Module 結合使用,
from torch.nn import functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = F.pool(F.relu(self.conv1(x)), 2)
x = F.pool(F.relu(self.conv2(x)), 2)
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
沒有可學習引數的層,可以用函式代替他們,因此可以不用放在建構式中,
對于有可學習引數的層,雖然也可以用 functional 替代,只不過實作起來步驟麻煩,需要自己手動定義引數,比如前面實作的全連接層,既可以吧 weight 和 bias 兩個引數拿出來,在建構式中初始化為 parameter,例子如下:
class MyLinear(nn.Module):
def __init__(self):
super(MyLinear, sefl).__init__()
self.weight = nn.Parameter(t.randn(3, 4))
self.bias = nn.Parameter(t.zeros(3))
def forward(self):
return F.linear(input, weight, bias)
從上面的代碼可以看出,如果通過 functional 去構造一個具有可學習引數的層,是非常麻煩的,不如 Module 那樣簡便,
很多同學現在可能會想,functional 看起也不是那么方便,并且 Module 已經夠好了,為什么還要設計 functional 呢?想深入了解 functional 和 Module的區別的同學,可以參考論壇的討論和作者寫的說明:https://discuss.pytorch.org/search?q=nn.functional
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280179.html
標籤:其他
上一篇:0605-優化器
下一篇:0603-常用的神經網路層
