深度學習(十一)——神經網路:線形層及其他層介紹

2023-08-22 21:00:48

一、正則化層中nn.BatchNorm2d簡介

主要作用:對輸入函數採用正則化。正則化的主要作用是加快神經網路的訓練速度。

class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)

輸入引數:

  • num_features: 形狀為\((N, C, H, W)\)

  • 其他引數預設即可

舉例:

# With Learnable Parameters
m = nn.BatchNorm2d(100)
# Without Learnable Parameters
m = nn.BatchNorm2d(100, affine=False)
input = torch.randn(20, 100, 35, 45)
output = m(input)

該函數用得不多

二、其他層簡介

1. Recurrent Layers(Recurrent層)

內含RNN、LSTM等函數,主要在nlp領域用的比較多

官方檔案: Recurrent Layers

2. Transformer Layers

3. Linear Layers(線性層)

nn.Linear

class torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None

(1)引數介紹及計算方法

引數介紹:

  • in_features

  • out_features

  • bias(bool)

線性層具體引數解釋如下圖:

  • \(in\_features=d\),即指的是in_features的個數

  • \(out\_features=L\),即指的是out_features的個數

計算\(g\)的方法(以上圖\(g_1\)為例):

  • \(x_1,\dots,x_i,\dots,x_d\)每個指向\(g_1\)的箭頭上,均有:

\[k_i*x_i+b_i \]

  • 其中,\(b_i\)代表偏置,引數\(bias=True\),則加上\(b\)\(bias=False\),則不加\(b\)

  • 在每次訓練神經網路的過程中,均會調整\(k_i\)\(b_i\)的值,直到它變成一個合適的數值

  • 由此可得:

\[g_1=\sum^{d}_{i=1}{k_ix_i+b_i} \]

(2)程式碼範例

以典型的VGG16 Model網路結構為例:

因此,設定in_features=4096; out_feature=1000

  • 下面程式碼以一個尺寸為n×n的影象為例,先將影象展開成一行,即\(n^2\)的尺寸。最後將\(n^2\)尺寸的影象通過線性層,轉化為1×10尺寸的影象。
import torch
import torchvision
from torch.utils.data import DataLoader
from torch import nn
from torch.nn import Linear

dataset=torchvision.datasets.CIFAR10("./dataset",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloder=DataLoader(dataset,batch_size=64)

# for data in dataloder:
#     imgs,targets = data
#     #print(imgs.shape)   #[Run] torch.Size([64, 3, 32, 32])
#
#     #我們的目標是把影象尺寸變成1×1×1×根據前面計算得出的數,下面進行轉換
#     output=torch.reshape(imgs,(1,1,1,-1))
#     #print(output.shape)  #[Run] torch.Size([1, 1, 1, 196608])

#根據上面output得出的196608尺寸資料,構造神經網路結構
class Demo(nn.Module):
    def __init__(self):
        super(Demo,self).__init__()
        self.linear1=Linear(in_features=196608,out_features=10)

    def forward(self,input):
        output=self.linear1(input)
        return output

#呼叫神經網路
demo=Demo()

for data in dataloder:
    imgs,targets=data
    output=torch.reshape(imgs,(1,1,1,-1))

    output=demo.forward(output)
    print(output.shape)  #[Run] torch.Size([1, 1, 1, 10])

由此,成功將1×1×1×196608尺寸的影象轉化為1×1×1×10尺寸的影象

注意:

  • 可以用torch.flatten() 函數將影象展開成一行,即替換第33行的程式碼output=torch.reshape(imgs,(1,1,1,-1)),為:
output=torch.flatten(imgs)
# print(output.shape)  #[Run] torch.Size([196608])
  • torch.flatten()torch.reshape() 的區別:

    • torch.flatten更方便,可以直接把影象變成一行

    • torch.reshape功能更強大,可任意指定影象尺寸

4. Dropout Layers

主要作用:在訓練的過程中隨機把一些input(輸入的tensor資料型別)變成0。變成0的概率由\(p\)決定

class torch.nn.Dropout(p=0.5, inplace=False)
  • 變成0的主要原因是防止過擬合

5. Sparse Layers

nn.Embedding

主要用於自然語言處理中

class torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None,
      max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False,
      _weight=None, _freeze=False, device=None, dtype=None)

6.Distance Functions

主要作用:計算兩個值之間的誤差,並指定誤差的衡量標準

7. Loss Function

主要作用:計算Loss的誤差大小

三、呼叫pytorch中的網路模型

現在我們已經學會如何自己搭建神經網路模型了,下面介紹pytorch中神經網路模型的呼叫方法。根據官方檔案,我們可以呼叫自己需要的網路結構,而不需要自己寫程式碼

1.影象方面的網路結構

官網檔案:Models and pre-trained weights — Torchvision 0.15 documentation

2.語音方面的網路結構

官方檔案:torchaudio.models — Torchaudio 2.0.1 documentation