天天看點

pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較

點選上方“AI公園”,關注公衆号,選擇加“星标“或“置頂”

作者:Erfandi Maula Yusnu, Lalu

編譯:ronghuaiyang

導讀

對使用PyTorch Lightning的訓練代碼和原始的PyTorch代碼進行了對比,展示了其簡單,幹淨,靈活的優點,相信你會喜歡的。

pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較

PyTorch Lightning是為ML研究人員設計的輕型PyTorch封裝。它幫助你擴充模型并編寫更少的樣闆檔案,同時維護代碼幹淨和靈活同時進行擴充。它幫助研究人員更多地專注于解決問題,而不是編寫工程代碼。

我從兩年前就開始使用PyTorch了,我從0.3.0版本開始使用。在我使用PyTorch之前,我使用Keras作為我的深度學習架構,但後來我開始切換到PyTorch,原因有幾個。如果你想知道我的原因,看看下面這篇文章:https://medium.com/swlh/why-i-switch-from-keras-to-pytorch-e48922f5846。

由于我一直在使用PyTorch,是以我需要犧牲在Keras中隻用幾行簡單的行代碼就可以進行訓練的樂趣,而編寫自己的訓練代碼。它有優點也有缺點,但是我選擇PyTorch編寫代碼的方式來獲得對我的訓練代碼的更多控制。但每當我想在深度學習中嘗試一些新的模型時,就意味着我每次都需要編寫訓練和評估代碼。

是以,我決定建立我自己的庫,我稱之為torchwisdom,但我陷入了困境,因為我仍在為我的公司建構OCR全pipeline系統。是以,我試圖找到另一個解決方案,然後我找到了PyTorch Lightning,在我看到代碼後,它讓我一見鐘情。

是以,我将在本文中介紹的内容是安裝、基本的代碼比較以及通過示例進行比較,這些示例是我自己通過從pytorch lightning site擷取的,一些代碼自己建立的。最後是本文的結論。

安裝

好的,讓我們從安裝pytorch-lighting開始,這樣你就可以跟着我一起做了。你可以使用pip或者conda安裝pytorch lightning。

pip install

pip install pytorch-lightning
           

conda install

conda install pytorch-lightning -c conda-forge
           

對我來說,我更喜歡用anaconda作為我的python解釋器,它對于深度學習和資料科學的人來說更完整。從第一次安裝開始,它就自帶了許多标準機器學習和資料處理庫包。

基本代碼的比較

在我們進入代碼之前,我想讓你看看下面的圖檔。下面有2張圖檔解釋了pytorch和pytorch lightning在編碼、模組化和訓練上的差別。在左邊,你可以看到,pytorch需要更多的代碼行來建立模型和訓練。

有了pytorch lightning,代碼就變成了Lightning子產品的内部,所有的訓練工程代碼都被pytorch lightning解決了。但是你需要在一定程度上定制你的訓練步驟,如下面的示例代碼所示。

pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較
pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較

對于訓練代碼,你隻需要3行代碼,第一行是用于執行個體化模型類,第二行是用于執行個體化Trainer類,第三行是用于訓練模型。

這個例子是用pytorch lightning訓練的一種方法。當然,你可以對pytorch進行自定義風格的編碼,因為pytorch lightning具有不同程度的靈活性。你想看嗎?讓我們繼續。

通過例子進行比較

好了,在完成安裝之後,讓我們開始編寫代碼。要做的第一件事是導入需要使用的所有庫。在此之後,你需要建構将用于訓練的資料集和資料加載器。

# import all you needimport osimport torchimport torchvisionimport torch.nn as nnimport torch.nn.functional as Ffrom torch.utils.data import DataLoader, random_splitfrom torchvision.datasets import MNISTfrom torchvision import datasets, transformsimport pytorch_lightning as plfrom pytorch_lightning import Trainerfrom pytorch_lightning.core.lightning import LightningModule# transforms# prepare transforms standard to MNIST
transform=transforms.Compose([transforms.ToTensor(),
                              transforms.Normalize((0.1307,), (0.3081,))])# data
mnist_train = MNIST(os.getcwd(), train=True, download=True, transform=transform)
mnist_train_loader = DataLoader(mnist_train, batch_size=64)
           

正如上面看到的代碼,我們使用來自torchvision的MNIST資料集,并使用torch.utils.DataLoader建立資料加載器。現在,在下面的代碼中,我們使網絡與28x28像素的MNIST資料集想比對。第一層有128個隐藏節點,第二層有256個隐藏節點,第三層為輸出層,有10個類作為輸出。

# build your modelclass CustomMNIST(LightningModule):def __init__(self):
        super().__init__()# mnist images are (1, 28, 28) (channels, width, height)
        self.layer1 = torch.nn.Linear(28 * 28, 128)
        self.layer2 = torch.nn.Linear(128, 256)
        self.layer3 = torch.nn.Linear(256, 10)def forward(self, x):
        batch_size, channels, width, height = x.size()# (b, 1, 28, 28) -> (b, 1*28*28)
        x = x.view(batch_size, -1)
        x = self.layer1(x)
        x = torch.relu(x)
        x = self.layer2(x)
        x = torch.relu(x)
        x = self.layer3(x)
        x = torch.log_softmax(x, dim=1)return xdef training_step(self, batch, batch_idx):
        data, target = batch
        logits = self.forward(data)
        loss = F.nll_loss(logits, target)return {'loss': loss}def configure_optimizers(self):return torch.optim.Adam(self.parameters(), lr=1e-3)# train your model
model = CustomMNIST()
trainer = Trainer(max_epochs=5, gpus=1)
           

如果你在上面的gist代碼中看到第27和33行,你會看到training_step和configure_optimators方法,它覆寫了在第2行中擴充的類LightningModule中的方法。這使得pytorch中标準的nn.Module不同于LightningModule,它有一些方法使它與第39行中的Trainer類相容。

現在,讓我們嘗試另一種方法來編寫代碼。假設你必須編寫一個庫,或者希望其他人使用純pytorch編寫的庫。你該怎樣使用pytorch lightning?

下面的代碼有兩個類,第一個類使用标準的pytorch的nn.Module作為其父類。它是按照标準pytorch子產品中通常編寫的方式編寫的,但是看第30行,有一個名為ExtendMNIST的類繼承了兩個類。這兩個類由StandardMNIST類和LightningModule類組合在一起。這就是我喜歡python的地方,一個類可以有多個父類。

# build your modelclass StandardMNIST(nn.Module):def __init__(self):
        super().__init__()# mnist images are (1, 28, 28) (channels, width, height)
        self.layer1 = torch.nn.Linear(28 * 28, 128)
        self.layer2 = torch.nn.Linear(128, 256)
        self.layer3 = torch.nn.Linear(256, 10)def forward(self, x):
        batch_size, channels, width, height = x.size()# (b, 1, 28, 28) -> (b, 1*28*28)
        x = x.view(batch_size, -1)
        x = self.layer1(x)
        x = torch.relu(x)
        x = self.layer2(x)
        x = torch.relu(x)
        x = self.layer3(x)
        x = torch.log_softmax(x, dim=1)return x# extend StandardMNIST and LightningModule at the same time# this is what I like from python, extend two class at the same timeclass ExtendMNIST(StandardMNIST, LightningModule):def __init__(self):
        super().__init__()  def training_step(self, batch, batch_idx):
        data, target = batch
        logits = self.forward(data)
        loss = F.nll_loss(logits, target)return {'loss': loss}def configure_optimizers(self):return torch.optim.Adam(self.parameters(), lr=1e-3)# run the training
model = ExtendMNIST()
trainer = Trainer(max_epochs=5, gpus=1)
trainer.fit(model, mnist_train_loader)
           

如果你看到ExtendMNIST類中的代碼,你會看到它隻是覆寫了LightningModule類。使用這種編寫代碼的方法,你可以擴充以前編寫的任何其他模型,而無需更改它,并且仍然可以使用pytorch lightning庫。

那麼,你能在訓練時給我看一下結果嗎?好,讓我們看看它在訓練時是什麼樣子。

pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較

這樣你就有了它在訓練時的螢幕截圖。它有一個很好的進度條,顯示了網絡的損失,這不是讓你更容易訓練一個模型嗎?

如果你想檢視實際運作的代碼,可以單擊下面的連結。第一個是pytorch lightning的标準方式,第二個是自定義方式。

PyTorch Lightning StandardStandard waycolab.research.google.com

PyTorch Lightning CustomCustom Waycolab.research.google.com

總結

PyTorch Lightning已經開發出了一個很好的标準代碼,它有229個貢獻者,并且它的開發非常活躍。現在,它甚至有風險投資,因為它達到了版本0.7。

在這種情況下(風險投資),我相信pytorch lightning将足夠穩定,可以用作你編寫pytorch代碼的标準庫,而不必擔心将來開發會停止。

對于我來說,我選擇在我的下一個項目中使用pytorch lighting,我喜歡它的靈活性,簡單和幹淨的方式來編寫用于深度學習研究的代碼。

好了,今天就到這裡,祝你愉快。記住要去嘗試,不會有什麼損失。

pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較

—END—

英文原文:https://medium.com/swlh/automate-your-neural-network-training-with-pytorch-lightning-1d7a981322d1

pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較

請長按或掃描二維碼關注本公衆号

喜歡的話,請給我個好看吧!

pytorch自帶網絡_使用PyTorch Lightning自動訓練你的深度神經網絡安裝基本代碼的比較通過例子進行比較

繼續閱讀