感知器的c++实现_使用FastAI和PyTorch的多层感知器
我將向您展示如何使用FastAIv1和Pytorch構建神經網絡(多層感知器)并成功訓練它以識別圖像中的數字。Pytorch是一個非常流行的深度學習框架,FastAI v1是一個使用現代最佳實踐簡化訓練快速準確的神經網絡的庫。它基于對fast.ai進行快速學習最佳實踐的研究,包括對視覺,文本,表格和協作(協作過濾)模型的支持。我會在本文最后貼出源代碼地址。
BoilerPlate命令
使用以下三行代碼可以確保對您所創建的庫的任何編輯都自動重新加載,并且顯示的任何圖表或圖像都會顯示在此內容中。
%reload_ext autoreload%autoreload 2%matplotlib inline導入Fast AI庫
讓我們導入fastai庫并將我們的batch_size參數定義為128。圖像數據庫是巨大的,所以我們需要使用批處理將這些圖像輸入GPU,批處理大小為128意味著我們將一次輸入128幅圖像來更新我們的深度學習模型的參數。如果由于GPU RAM較小而導致內存不足,則可以將批處理大小減小到64或32。
from fastai.vision import *bs=128使用數據集
我們將從MNIST手寫數據集開始。MNIST是小型(28x28)手寫灰度數字的標準數據集,于20世紀90年代開發,用于測試當今最復雜的模型; 現在,經常被用作介紹深度學習的基本“hello world”。此fast.ai數據集版本使用標準PNG格式而不是原始的特殊二進制格式,以便您可以在大多數庫中使用常規數據路徑; 如果您只想使用與原始輸入通道相同的單個輸入通道,只需從通道軸中選取一部分即可。
path = untar_data(URLs.MNIST);path通過運行上述命令,數據被下載并存儲在上面顯示的路徑中。讓我們看看如何設置數據目錄,因為我們必須從這些目錄導入數據。讓我們從查看路徑目錄開始,我們可以看到下面的數據已經有了訓練和測試文件夾。
path.ls()讓我們看一下訓練文件夾。數據在不同的文件夾中按數字1到9分離出來。
(path/'training').ls()在每個數字文件夾中,我們還有圖像。
(path/'training/0').ls()[1:5]導入數據
現在我們了解了如何設置數據目錄; 我們將使用FastAI 的data block API導入數據和FastAI image transform函數來進行數據擴充。
ds_tfms = get_transforms(do_flip=False, flip_vert=False, max_rotate= 15,max_zoom=1.1, max_lighting=0.2, max_warp=0.2)在get_transforms函數中,我們可以定義我們想要做的所有轉換。FastAI使得數據增強非常容易,因為所有轉換都可以在一個函數中傳遞并使用非常快速的實現。函數中給出的每個參數:
- do_flip = False,flip_vert = False:不允許在垂直和水平方向上翻轉數字。
- max_rotate = 15:設置在順時針和逆時針方向上導入圖像時最多隨機旋轉15度。
- max_zoom = 1.1:設置放大/縮小原始圖像的尺寸不超過10%
- max_lighting = 0.2:設置將應用由max_lighting控制的隨機閃光和對比度變化
- max_warp = 0.2:在-max_warp和+ max_warp之間的隨機對稱扭曲應用概率p_affine,在這種情況下默認為0.75。
現在我們已經定義了我們想要對輸入圖像做什么轉換,讓我們從定義數據批處理或databunch (FastAI將其稱為databunch)開始。因為圖像數據集的數據量很大,所以盡量不在內存中導入整個數據集,而是我們一個databunch,它允許我們加載批量數據并動態執行所需的轉換。
data = (ImageItemList.from_folder(path, convert_mode='L') .split_by_folder(train='training', valid='testing') .label_from_folder() .transform(tfms=ds_tfms, size=28) .databunch(bs=bs))Jeremy Howard將上述步驟稱為標簽工程,因為大部分時間和精力花在正確導入數據上。FastAI的data block API使我們可以非常容易地定義我們想要如何使用R ggplots (如API)來導入我們的數據,可以一直鏈接不同的函數,直到數據集準備好為止。讓我們理解上面的代碼在做什么 -
- ImageItemList.from_folder(path,convert_mode ='L') - 在帶有文件名后綴擴展名的文件夾中創建ItemList。Convert_mode ='L'幫助我們定義我們導入的圖像是灰度/單通道圖像默認為'RGB',這意味著一個3通道圖像。FastAI使用PIL庫,所以convert實際上是PIL函數
- split_by_folder(train ='training',valid ='testing'):這個函數告訴數據庫我們在Path目錄的'training'和'testing'子文件夾中有訓練和測試數據
- label_from_folder() - 此函數通知databunch從其文件夾名稱中獲取數字標簽
- transform(tfms = ds_tfms,size = 28) - 此函數通知databunch將ds_tfms變量中定義的轉換應用于每個圖像
- databunch(bs = bs) - 此函數將此數據庫轉換為FastAI的ImageDataBunch類,批量大小在bs變量中定義,本例中為128。
現在我們已經定義了我們的databunch,現在可以看看我們的數據。如下所示,您可以看到數字是使用show_batch函數導入和可視化,這些圖像已應用了我們定義的轉換。
print(data.classes) ## Prints class labelsprint(data.c) ## Prints number of classesdata.show_batch(rows=3, figsize=(10,6), hide_axis=False) ## Show sample data使用Pytorch定義多層感知器
現在我們已經定義了我們的databunch。讓我們使用Pytorch定義我們的Multilayer感知器模型。對于完全連接的層,我們使用nn.Linear函數,我們使用ReLU轉換應用于非線性。在Pytorch中,我們只需要定義前向函數,并使用autograd自動定義后向函數。
class Mnist_NN(nn.Module): def __init__(self): super().__init__() self.lin1 = nn.Linear(784, 512, bias=True) self.lin2 = nn.Linear(512, 256, bias=True) self.lin3 = nn.Linear(256, 10, bias=True) def forward(self, xb): x = xb.view(-1,784) x = F.relu(self.lin1(x)) x = F.relu(self.lin2(x)) return self.lin3(x)訓練模型
現在我們已經定義了我們的模型,我們需要訓練它。我們可以使用FastAI的Learner函數,它可以更輕松地利用現代增強優化方法和許多其他巧妙的技巧,如1-Cycle樣式的訓練。
現在定義Learner類
## Defining the learnermlp_learner = Learner(data=data, model=Mnist_NN(), loss_func=nn.CrossEntropyLoss(),metrics=accuracy)解釋一下我們做了什么:
- data = data - 傳遞Databunch函數
- model = Mnist_NN() - 傳遞我們定義的MLP模型Mnist_NN
- loss_func = nn.CrossEntropyLoss() - 定義優化損失函數,在本例中我們使用交叉熵損失函數。
- metrics =準確度 - 這只是為了在訓練時進行輸出。
我們可以試著在訓練深度學習模型時找到理想的學習速率。
## Finidng Ideal learning latemlp_learner.lr_find()mlp_learner.recorder.plot()理想情況下,我們要找到斜率最大的點。在這種情況下,該點是1e-2。因此,我們將開始從1e-2作為我們的學習率,并使用fit_one_cycle函數開始五個訓練周期,該函數使用1-Cycle樣式訓練方法。此外,FastAI 在訓練時顯示tqdm樣式進度條,在訓練結束時,它開始顯示我們在驗證數據上定義的損失函數和指標的進度。
mlp_learner.fit_one_cycle(5,1e-2)通過降低學習速率來對模型進行更多的訓練。
mlp_learner.fit_one_cycle(5,1e-3)mlp_learner.recorder.plot_losses()我們可以看到,通過使用簡單的多層感知器,我們的準確率達到了98.6%。
結論
Fast.ai是Jeremy Howard和他的團隊的一項出色的倡議,我相信fastai庫可以通過使構建深度學習模型變得非常簡單,真正實現將深度學習大眾化,讓每個人都可以建造自己的深度學習模型。
總結
以上是生活随笔為你收集整理的感知器的c++实现_使用FastAI和PyTorch的多层感知器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zabbix监控mysql的哪些参数_C
- 下一篇: mysql 按月统计 包括空月_mysq