日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Pytorch常用的對象類和繼承機制(如果有)

作者:思念殤千尋 更新時間: 2022-02-17 編程語言

  參考資料:

  Pytorch這個深度學習框架在設計的時候嵌入了非常豐富的繼承機制。在通用的深度學習算法中使用到的組件其實都繼承于某一個父類,比如:Dataset,DataLoader,Model等其實都蘊含了一個繼承機制。這篇隨筆打算梳理并剖析一下Pytorch里的這樣一種繼承現象。請注意,繼承后的子類的構造方法第一行一定要調用super()方法哦。

  torch.nn.Module

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

  平時我們在深度學習中提到的Model其實就是繼承自torch.nn.Module。最重要且繼承后必須重寫的方法是forward,這個方法直接規定Model的前向運算方式。此外還有一些預定義的方法,比較重要的是:

  1. net.apply
  2. net.cuda
  3. net.train
  4. net.eval
  5. net.load_state_dict
  6. net.zero_grad

  torch.utils.data.Dataset

  官網并沒有給這個類示例,可能是覺得這個類比較簡單。正如描述中所說,torch.utils.data.Dataset是來handle鍵值對形式的數據格式的。我們必須實現兩個函數,__getitem__和__len__。前者輸入索引index返回對應的數據(和label),后者返回數據集總的大小(index的上限)。

  補充一句,在官網的Doc中torch.utils.data.Dataset下面就是torch.utils.data.IterableDataset,這個數據集格式和上面Dataset的區別在于它是來handle可迭代的數據集類型。其只需要重寫一個__iter__函數,留待日后有需要的時候研究。

  torchvision.transforms

  這里跑題提一下torchvision里面經常用到的transforms,它本質也是nn.Module(不信看源碼),其方便之處在于提供了豐富的內置處理圖片的方法(transforms變換)。并且可以通過transforms.Compose方法把多個transform串序并到一起(類似nn.Sequential)。所以在繼承一個torch.utils.data.Dataset的時候不妨多利用transforms哦(explicitly specify transform)。

  torch.utils.data.DataLoader

  從形式上來看,DataLoader是Dataset套的一層包裝;從功能上來看,DataLoader才是最終提供給Model數據的人。這個組件基本不涉及繼承機制(很少人去改寫這個類),因此略過。

  torch.nn.modules.loss

  說完了Dataset和Model,不得不提的就是損失函數了,從torch.nn.modules.loss可以看出,所有的loss其實沒啥特別的,說白了也是一個nn.Module。只不過它的forward方法比較特殊,Model的forward方法是給他一個data_tensor,而Loss的forward方法是給他一個target_tensor和一個(Model預測的)input_tensor,返回值一般是一個常數。

  torch.optim

  torch.optim這個包下預置了很多Optimizer比如SGD,Adam。其用法如下:

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)
for input, target in dataset:
    optimizer.zero_grad()
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()
    optimizer.step()

  需要注意的是如果網絡要在GPU上訓練,則optimizer和model綁定應該在model轉移到GPU上之后。

  torch.optim.lr_scheduler

  深度學習在訓練時一個動態衰減的學習率是比較理想的。torch.optim.lr_scheduler提供了這樣一個功能。其用法如下:

model = [Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = SGD(model, 0.1)
scheduler = ExponentialLR(optimizer, gamma=0.9)

for epoch in range(20):
    for input, target in dataset:
        optimizer.zero_grad()
        output = model(input)
        loss = loss_fn(output, target)
        loss.backward()
        optimizer.step()
    scheduler.step()

  注意scheduler.step要在optimizer.step之后。

原文鏈接:https://blog.csdn.net/weixin_43590796/article/details/121122853

欄目分類
最近更新