torch.nn
torch.nn 與 torch.nn.functional
說起torch.nn,不得不說torch.nn.functional!
這兩個庫很類似,都涵蓋了神經網絡的各層操作,只是用法有點不同,比如在損失函數Loss中實現交叉熵! 但是兩個庫都可以實現神經網絡的各層運算。其他包括卷積、池化、padding、激活(非線性層)、線性層、正則化層、其他損失函數Loss,兩者都可以實現不過nn.functional畢竟只是nn的子庫,nn的功能要多一些,還可以實現如Sequential()這種將多個層弄到一個序列這樣復雜的操作。
如何看關于torch.nn的 API
首先看左側,這些都是功能的分類! 比如Containers中就包含了 集合各種神經網絡的操作的 容器;
而Convolution Layers則是抱哈了各種卷積操作! 如果我們想要調用的話,不是torch.nn.Containers,而是torch.nn.Moule()、torch.nn.Sequential() 等
torch.nn中某些函數
1. torch.nn.Parameter()
一種張量,被認為是一個模參數。
Parameter是Tensor的子類,當與Module s一起使用時,它們有一個非常特殊的屬性——當它們被分配為模塊屬性時,它們會自動添加到參數列表中,并將出現在Parameters()迭代器中(可以通過nn.Moudle.Parameter()獲得)。
賦值一個張量沒有這樣的效果。這是因為人們可能想要在模型中緩存一些臨時狀態,比如RNN的最后一個隱藏狀態。如果沒有Parameter這樣的類,這些臨時對象也會被注冊。
參數:
- data(張量)–parameter tensor。
- Requires_grad (bool,optional)—如果參數需要漸變。有關更多細節,請參閱局部禁用梯度計算。默認值:True
Parameter Vs Tensor:
首先可以把這個函數理解為類型轉換函數,將一個不可訓練的類型Tensor轉換成可以訓練的類型parameter并將這個parameter綁定到這個module里面(net.parameter()中就有這個綁定的parameter,所以在參數優化的時候可以進行優化的),所以經過類型轉換這個self.v變成了模型的一部分,成為了模型中根據訓練可以改動的參數了。使用這個函數的目的也是想讓某些變量在學習的過程中不斷的修改其值以達到最優化。
所以如果只是單純的線性層or卷積層,是可以使用tensor的;
但是如果是在模型中,也就是Containers容器中的,那么就必須是Parameter類型
在concat注意力機制中,權值V是不斷學習的所以要是parameter類型。
通過做下面的實驗發現,linear里面的weight和bias就是parameter類型,且不能夠使用tensor類型替換,還有linear里面的weight甚至可能通過指定一個不同于初始化時候的形狀進行模型的更改。
與torch.tensor([1,2,3],requires_grad=True)的區別,這個只是將參數變成可訓練的,并沒有綁定在module的parameter列表中。
Containers()
2. torch.nn.Module()
所有神經網絡模塊的基類。
可以看博客
3. torch.nn.Sequential()
順序容器。
順序容器。Modules將按照它們在構造函數中傳遞的順序添加到它中。另外,Modules的OrderedDict可以被傳入。Sequential的forward()方法接受任何輸入并將其轉發到它包含的第一個Module。然后,它將輸出按順序鏈接到每個后續Module的輸入,最后返回最后一個Module的輸出。
一個Sequential通過手動調用模塊序列提供的值是,它允許將整個容器視為單個Module,這樣在Sequential上執行轉換將應用于它存儲的每個Module(每個Module都是Sequential的注冊subModule)。
Sequential和torch.nn.ModuleList的區別是什么?ModuleList就是一個用來存儲Module的列表!另一方面,Sequential中的各層以級聯方式連接。
舉例:
# Using Sequential to create a small model. When `model` is run, # input will first be passed to `Conv2d(1,20,5)`. The output of # `Conv2d(1,20,5)` will be used as the input to the first # `ReLU`; the output of the first `ReLU` will become the input # for `Conv2d(20,64,5)`. Finally, the output of # `Conv2d(20,64,5)` will be used as input to the second `ReLU` model = nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU())# Using Sequential with OrderedDict. This is functionally the # same as the above code model = nn.Sequential(OrderedDict([('conv1', nn.Conv2d(1,20,5)),('relu1', nn.ReLU()),('conv2', nn.Conv2d(20,64,5)),('relu2', nn.ReLU())]))4. torch.nn.ModuleDict()
在字典中保存子模塊。
ModuleDict可以像普通的Python字典一樣被索引,但它包含的Module是正確注冊的,所有Module方法都可以看到它。
ModuleDict是一個有序字典,它反映了
- 插入的順序,和
- 在update()中,合并的OrderedDict、dict(從Python 3.6開始)或另一個ModuleDict (**update()**的參數)的順序。
注意,對于其他無序映射類型的update()(例如,Python 3.6版之前的普通dict)不會保留合并映射的順序。
參數:
Modules (iterable, optional)——(string: module)的映射(字典)或鍵值對類型的可迭代對象(string, module)
實例:
class MyModule(nn.Module):def __init__(self):super(MyModule, self).__init__()self.choices = nn.ModuleDict({'conv': nn.Conv2d(10, 10, 3),'pool': nn.MaxPool2d(3)})self.activations = nn.ModuleDict([['lrelu', nn.LeakyReLU()],['prelu', nn.PReLU()]])def forward(self, x, choice, act):x = self.choices[choice](x)x = self.activations[act](x)return x項目中的實例:
self.conv_filters = nn.ModuleDict({str(x): nn.Conv2d(3 if self.config.use_context else 2,self.config.num_filters,(x, self.config.word_embedding_dim))for x in self.config.window_sizes})方法:
1、 clear()
從ModuleDict中刪除所有項。
2、items()
返回ModuleDict鍵/值對的可迭代對象。
3、keys()
返回ModuleDict鍵的可迭代對象。
4、pop(key)
從ModuleDict中移除key并返回它的模塊。
參數:key (string) -從ModuleDict中彈出的鍵
5、update(modules)
使用映射或可迭代對象的鍵值對更新ModuleDict,覆蓋現有的鍵。
如果modules是OrderedDict、ModuleDict或鍵值對的可迭代對象,則其中新元素的順序將保留。
參數: modules (iterable)——一個從字符串到模塊的映射(字典),或者一個鍵值對類型的可迭代對象(string, Module)
6、values()
返回ModuleDict值的可迭代對象。
Convolution Layers
5. torch.nn.Conv1d
6. torch.nn.Conv2d
方法:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’, device=None, dtype=None)
參數:
-
in_channels (int) -輸入圖像中的通道數
-
out_channels (int) -由卷積產生的信道數
-
kernel_size (int或tuple) -卷積內核的大小
-
stride (int或tuple,optional)——卷積的stride。默認值:1
-
padding (int, tuple或str,optional)-添加到輸入所有四方的padding。默認值:0
-
Padding_mode (string,optional)- ‘zeros’, ‘reflect’, ’ replication ‘或’circular’。默認值:“0”
-
dilation(int或tuple,optional)-內核元素之間的間距。默認值:1
-
groups (int,optional)-從輸入通道到輸出通道的阻塞連接數。默認值:1
-
bias (bool,optional)-如果為True,則在輸出中添加一個可學習的偏差。默認值:True
變量:
- ~Conv2d.weight (Tensor):(out_channels,in?channelsgroups\frac{ in-channels}{groups}groupsin?channels? , kernel_size[0], kernel_size[1]). 這些權重的值是從U(?k,k)\mathcal{U}(-\sqrt{k}, \sqrt{k})U(?k?,k?)取樣,其中k=groups?Cin??∏i=01kernel-size?[i]k=\frac{\text { groups }}{C_{\text {in }} * \prod_{i=0}^{1} \text { kernel-size }[i]}k=Cin???∏i=01??kernel-size?[i]?groups??
- ~Conv2d.bias (Tensor) : 可學習bias的形狀(out_channels)。如果偏差是True, 那么這些權重的值將從從U(?k,k)\mathcal{U}(-\sqrt{k}, \sqrt{k})U(?k?,k?)取樣,其中k=groups?Cin??∏i=01kernel-size?[i]k=\frac{\text { groups }}{C_{\text {in }} * \prod_{i=0}^{1} \text { kernel-size }[i]}k=Cin???∏i=01??kernel-size?[i]?groups??。
舉例:
>>> # 正方形的核和相同的步長 >>> m = nn.Conv2d(16, 33, 3, stride=2) >>> # 非正方形的核和不一樣的步長和填充 >>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2)) >>> # non-square kernels and unequal stride and with padding and dilation >>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1)) >>> input = torch.randn(20, 16, 50, 100) >>> output = m(input)etc
Pooling Layers
torch.nn.MaxPool1d
torch.nn.MaxPool2d
總結
- 上一篇: 司爱侠计算机英语教程第五版翻译,计算机英
- 下一篇: 李宏毅机器学习(九)Multi-ling