驚嘆!十分鐘輕鬆入門AI利器PyTorch

2020-12-11 python大大

PyTorch快速入門

概述

dddd

PyTorch快速入門

本教程通過十分鐘快速入門和代碼實踐帶你走入python的AI世界。

PyTorch代碼概述

model/net.py

:指定神經網絡架構,損失函數和評估指標model/data_loader.py:指定如何將數據饋送到網絡train.py:包含主要訓練循環evaluate.py:包含用於評估模型的主循環utils.py:用於處理hyperparams /日誌/存儲模型的實用程序函數建議您仔細閱讀

train.py

以獲得詳細認識。

摸熟後,您可能需要修改代碼,具體取決於您的任務和數據集

model/net.py改變模型,即如何將輸入轉換為預測以及損失等。model/data_loader.py更改將數據提供給模型的方式。train.py

evaluate.py一旦您獲得了適用於的數據集,可以隨意編輯代碼以滿足需求。繞不過的理論:張量和變量

在進一步討論之前,我強烈建議您使用PyTorch進行快速實踐,以了解PyTorch的基礎知識。這是一個潛行峰。

PyTorch張量的行為與NumPy的數組相似。

>>>importtorch>>>a=torch.Tensor([[1,2],[3,4]])>>>print(a)1234[torch.FloatTensorofsize2x2]>>>print(a**2)14916[torch.FloatTensorofsize2x2]

PyTorch變量允許您包裝Tensor並對其執行記錄操作。

>>>fromtorch.autogradimportVariable>>>a=Variable(torch.Tensor([[1,2],[3,4]]),requires_grad=True)>>>print(a)Variablecontaining:1234[torch.FloatTensorofsize2x2]>>>y=torch.sum(a**2)# 1 + 4 + 9 + 16>>>print(y)Variablecontaining:30[torch.FloatTensorofsize1]>>>y.backward()# compute gradients of y wrt a>>>print(a.grad)# print dy/da_ij = 2*a_ij for a_11, a_12, a21, a22Variablecontaining:2468[torch.FloatTensorofsize2x2]

這PyTorch以其極簡主義和直觀的語法包含優雅和表現力。在繼續之前,請先熟悉參考資料部分中的更多示例。

核心步驟

讓我們先來看看訓練算法的核心是什麼樣的。下面的五行通過模型傳遞一批輸入,計算損失,執行反向傳播並更新參數。

output_batch=model(train_batch)# compute model outputloss=loss_fn(output_batch,labels_batch)# calculate lossoptimizer.zero_grad()# clear previous gradientsloss.backward()# compute gradients of all variables wrt lossoptimizer.step()# perform updates using calculated gradients

每個變量

train_batch

labels_batch

output_batch

loss

是一個PyTorch變量,並且允許自動計。

我們編寫的所有其他代碼都是圍繞這個構建的 - 模型的確切規範,如何獲取一批數據和標籤,計算損失和優化器的細節。在這篇文章中,將介紹如何在PyTorch中編寫簡單模型,計算損失並定義優化器。

PyTorch中的模型

可以通過繼承類來在PyTorch中定義模型

torch.nn.Module

。該模型分為兩個步驟。首先指定模型的參數,然後概述它們如何應用於輸入。對於不涉及可訓練參數的操作(激活函數,如ReLU,像maxpool這樣的操作),我們通常使用該

torch.nn.functional

模塊。以下是從這裡借來的單個隱藏層神經網絡的示例:

importtorch.nnasnnimporttorch.nn.functionalasFclassTwoLayerNet(nn.Module):def__init__(self,D_in,H,D_out):""" In the constructor we instantiate two nn.Linear modules and assign them as member variables. D_in: input dimension H: dimension of hidden layer D_out: output dimension """super(TwoLayerNet,self).__init__()self.linear1=nn.Linear(D_in,H)self.linear2=nn.Linear(H,D_out)defforward(self,x):""" In the forward function we accept a Variable of input data and we must return a Variable of output data. We can use Modules defined in the constructor as well as arbitrary operators on Variables. """h_relu=F.relu(self.linear1(x))y_pred=self.linear2(h_relu)returny_pred

__init__

函數初始化模型的兩個線性層。PyTorch負責始化您指定的參數。在

forward

函數中,我們首先應用第一個線性層,應用ReLU激活,然後應用第二個線性層。該模塊假定第一個維度

x

是批量大小。如果網絡的輸入只是維度為100的向量,批量大小為32,則維度為

x

32,100。讓我們看一個如何定義模型和計算正向傳遞的示例:

# N is batch size; D_in is input dimension;# H is the dimension of the hidden layer; D_out is output dimension.N,D_in,H,D_out=32,100,50,10# Create random Tensors to hold inputs and outputs, and wrap them in Variablesx=Variable(torch.randn(N,D_in))# dim: 32 x 100# Construct our model by instantiating the class defined abovemodel=TwoLayerNet(D_in,H,D_out)# Forward pass: Compute predicted y by passing x to the modely_pred=model(x)# dim: 32 x 10更複雜的模型遵循相同的布局,我們將在後續帖子中看到其中兩個。

損失函數

PyTorch提供了許多標準loss功能,可供您在

torch.nn

模塊中使用。這是一個如何計算交叉熵損失的簡單示例。假設我們的模型解決了帶

C

標籤的多類分類問題。然後對於一批大小

N

out

NxC

通過在模型中傳遞輸入批次獲得的PyTorch維度變量。我們還有一個

target

大小的變量

N

,其中每個元素都是該示例的類,即中的標籤

[0,...,C-1]

。您可以定義損失函數並計算損失,如下所示:

loss_fn=nn.CrossEntropyLoss()loss=loss_fn(out,target)

PyTorch可以很容易地擴展它並編寫自己的自定義損失函數。我們可以編寫自己的Cross Entropy Loss函數,如下所示(注意NumPy-esque語法):

defmyCrossEntropyLoss(outputs,labels):batch_size=outputs.size()[0]# batch_sizeoutputs=F.log_softmax(outputs,dim=1)# compute the log of softmax valuesoutputs=outputs[range(batch_size),labels]# pick the values corresponding to the labelsreturn-torch.sum(outputs)/num_examples

這是編寫自己的損失函數的一個相當簡單的例子。

優化

torch.optim

軟體包為常見的優化算法提供了易於使用的界面。定義優化器非常簡單:

# pick an SGD optimizeroptimizer=torch.optim.SGD(model.parameters(),lr=0.01,momentum=0.9)# or pick ADAMoptimizer=torch.optim.Adam(model.parameters(),lr=0.0001)

傳遞了每次迭代需要更新的模型參數。還可以指定更複雜的方法,例如參數學習率。

一旦使用計算梯度

loss.backward()

,調用

optimizer.step()

更新優化算法定義的參數。

訓練與評估

訓練與ping'gu

在訓練模型之前,必須打調用

model.train()

。同樣,調用

model.eval()

在測試模型之前。這可以糾正培訓和測試過程中的丟失,批量標準化的差異。

計算指標

在這個階段,您應該能夠理解大部分代碼

train.py

evaluate.py

除了密切關注損失之外,監控其他指標(如準確性和精確度/召回率)也很有幫助。為此,您可以為文件中的一批模型輸出定義自己的度量標準函數

model/net.py

。為了使其更容易,我們將PyTorch變量轉換為NumPy數組,然後將它們傳遞給度量函數。對於在損失函數一節中設置的多類分類問題,我們可以使用NumPy編寫一個計算精度的函數:

defaccuracy(out,labels):outputs=np.argmax(out,axis=1)returnnp.sum(outputs==labels)/float(labels.size)

您可以在

model/net.py

文件中添加自己的指標。完成後,只需將它們添加到

metrics

中:

metrics={'accuracy':accuracy,# add your own custom metrics,}

保存和加載模型

我們定義實用程序函數來保存和加載模型

utils.py

。要保存模型,請執行:

state={'epoch':epoch+1,'state_dict':model.state_dict(),'optim_dict':optimizer.state_dict()}utils.save_checkpoint(state,is_best=is_best,# True if this is the model with best metricscheckpoint=model_dir)# path to folder

utils.py

在內部使用該

torch.save(state, filepath)

方法來保存上面定義的狀態。您可以向狀態中添加更多,例如指標。

model.state_dict()

存儲模型和參數

optimizer.state_dict()

存儲優化的狀態(如每個參數學習率)。

要從檢查點加載已保存的狀態,您可以使用:

utils.load_checkpoint(restore_path,model,optimizer)

optimizer

參數是可選的,你可以選擇一個新的優化器重新啟動。

load_checkpoint

內部加載保存的檢查點並恢復模型權重和優化程序的狀態。

使用GPU

通過代碼散布,你會發現如下行:

>model=net.Net(params).cuda()ifparams.cudaelsenet.Net(params)>ifparams.cuda:batch_data,batch_labels=batch_data.cuda(),batch_labels.cuda()

PyTorch使用這些命令使GPU顯式透明。調用

.cuda()

模型/ Tensor / Variable將其發送到GPU。為了在GPU上訓練模型,必須將所有相關參數和變量發送到GPU

.cuda()

調試

憑藉其簡潔的設計,PyTorch使調試變得輕而易舉。您可以

pdb.set_trace()

在代碼中的任何行使用斷點。然後,您可以執行進一步的計算,檢查PyTorch張量/變量並查明錯誤的根本原因。

以上就是使用PyTorch的基本套路。大家感覺如何?歡迎評論交流。

相關焦點

  • 5分鐘!用Java實現目標檢測|PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。
  • 5分鐘!用Java實現目標檢測 | PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    官方教程包含了 PyTorch 介紹,安裝教程;60分鐘快速入門教程,可以迅速從小白階段完成一個分類器模型;計算機視覺常用模型,方便基於自己的數據進行調整,不再需要從頭開始寫;自然語言處理模型,聊天機器人,文本生成等生動有趣的項目。
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    選自heartbeat.fritz.ai作者:Derrick Mwiti機器之心編譯參與:Geek AI、王淑婷這是一篇關於使用 PyTorch 框架進行深度學習的教程,讀完以後你可以輕鬆地將該框架應用於深度學習模型。
  • 如何把ai,ei,ui,輕鬆讀準,孩子兩分鐘搞定
    這節課,主要是跟大家一起學習,雙韻母ai(哀),ei(誒),ui(威)。那麼,到底什麼是雙韻母呢?雙韻母和單韻母,到底是什麼關係呢?如何才能把雙韻母輕鬆地讀準確呢?雙韻母,簡單理解,就是把兩個單韻母組合在一起,或者是把一個單韻母和一個聲母組合在一起,共同發一個音。這就是雙韻母。之所以稱之為是雙韻母,主要是因為,它只有兩個字母,由兩個字母組合而成的。
  • 《PyTorch中文手冊》來了
    這是一本開源的書籍,目標是幫助那些希望和使用 PyTorch 進行深度學習開發和研究的朋友快速入門,其中包含的 Pytorch 教程全部通過測試保證可以成功運行。目錄第一章: pytorch 入門1. Pytorch 簡介2.
  • PyTorch上也有Keras了,訓練模型告別Debug,只需專注數據和邏輯
    雖然這世上已經有了神器Keras,能用幾條語句就輕鬆組建一個神經網絡,但一想到它是站在Tensorflow的肩膀上,就讓人不禁想起江湖中的那句傳說:PyTorch 真香!那麼為什麼不做一個PyTorch上的Keras呢?
  • 60分鐘入門深度學習工具PyTorch
    /docs/autograd本章的官方代碼:Jupyter notebook:https://pytorch.org/tutorials/_downloads/009cea8b0f40dfcb55e3280f73b06cc2/autograd_tutorial.ipynb
  • 福利,PyTorch中文版官方教程來了
    教程作者來自 pytorchchina.com。教程網站:http://pytorch123.com教程裡有什麼教程根據 PyTorch 官方版本目錄,完整地還原了所有的內容。包括簡單的環境搭建、快速入門相關 API、高級操作、圖像處理實戰、文本處理實戰、GAN 和強化學習等,基本涵蓋了目前所有深度學習相關的知識點。教程的一部分內容,使用 torch.view 改變 tensor 的大小或形狀用教程設計一個聊天機器人,以上為部分對話。
  • 10分鐘帶你入門AI開發庫PyTorch
    PyTorch代碼很簡單如上所述,您可以輕鬆定義網絡模型,無需經過多少培訓即可快速理解代碼。2. 動態計算圖Pytorch提供動態計算圖(DAG)。訓練結果不知不覺,就學完了Pytorch的快速入門。作為本章結束語,和標題呼應,是不是真的難以置信的簡單啊!
  • 華為雲應用編排,手把手教您完成pytorch代碼部署
    在入門時,PyTorch提供了完整的文檔,並有著活躍的社區論壇,對於新手而言上手遇到的難關容易解決。更深入一些,在特性設計上,PyTorch對於抽象出的概念較少,易於理解,同時提供的API的設計理念與Torch一脈相承,符合人的一般思維,接口優雅。而框架最核心的性能方面,PyTorch的速度表現在許多評測中勝過TensorFlow和Keras等知名框架。
  • 想入門人工智慧? 這些優質的 AI 資源絕對不要錯過
    那麼對於想入門人工智慧的人群來說,應該從哪兒開始呢?本文列出了一些優質AI學習資源。希望在閱讀本文後,能幫助你順利開啟AI學習之旅。該課程旨在面向有抱負的工程師,從人工智慧的基本概念入門到掌握為人工智慧解決方案構建深度學習模型所需技能。當中提供十門課程,加上一個頂點項目,這些課程都是免費的,如果你需要認證證書則需要付費。當中包含的課程很不錯,例如AI所需的數學基礎入門,以及數據分析中的倫理學和法律課程。
  • 弱電電工基礎技術手冊,新手從入門到精通利器!
    弱電電工基礎技術手冊,新手從入門到精通利器!大家熟悉的電工,一般都是從事高壓強電方面的工作,但是弱電電工的概念人們並不是很清楚,弱電電工是指從事建築物內部以及內部和外部間的信息交換與信息傳遞工程安裝維修工作的電工。如今,信息化發展越來越好,弱電電工在建築領域中起到的作用也越來越大。很多朋友都想要從事或者轉行做弱電,那麼如何進行更好地學習呢?
  • 初學AI神經網絡應該選擇Keras或是Pytorch框架?
    Powerful,是深度學習入門的絕佳技術路線舉個tensorflow1.0的例子(偽代碼)定義Variable、constant、placeholder等。 初始化global_variables_initializersession回話狀態。
  • Keras vs PyTorch:誰是第一深度學習框架?
    本文中,來自 deepsense.ai 的研究員給出了他們在高級框架上的答案。在 Keras 與 PyTorch 的對比中,作者還給出了相同神經網絡在不同框架中性能的基準測試結果。目前在 GitHub 上,Keras 有超過 31,000 個 Stars,而晚些出現的 PyTorch 已有近 17,000 個 Stars。
  • PyTorch v1.1 重大更新,TensorBoard已加入豪華套餐
    和新版本、新工具一起,Facebook 宣布他們和優達學城(Udacity)建立合作,將在其中的深度學習入門課程中加入 PyTorch 教學,Facebook 還會提供為繼續學習完整機器學習學位的參加者提供獎學金。Fast.ai 也將於今年 6 月提供新的使用 PyTorch 的深度學習課程。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    官網:http://pytorch.orgGitHub:https://github.com/pytorch/pytorchPyTorch 是一個 Python 軟體包,其提供了兩種高層面的功能:使用強大的 GPU 加速的 Tensor 計算(類似 numpy)構建於基於 tape 的 autograd 系統的深度神經網絡如有需要,你也可以復用你最喜歡的
  • 手把手教你用PyTorch實現圖像分類器(第一部分)
    翻譯 | 醬番梨、Succi         校對 | 醬番梨        審核 | 醬番梨       整理 | 立魚王原文連結:https://medium.com/udacity/implementing-an-image-classifier-with-pytorch-part
  • Facebook 發布 Detectron2:基於 PyTorch 的新一代目標檢測工具
    速度和可擴展性 通過將整個訓練 pipeline 移至 GPU,能夠使 Detectron2 比原來的 Detectron 更快,而且可以更加方便在各種標準型號下進行 GPU 伺服器的分布式訓練,從而輕鬆擴展訓練數據集。
  • 圖靈獎得主力推:PyTorch 1.3 今天發布
    PyTorch 1.3 項目地址:https://github.com/pytorch/pytorch/releases/tag/v1.3.0茁壯成長的 PyTorch由於 PyTorch 一直致力於滿足研究者的需求,因此它在不斷地進行版本迭代,現在已經成為開源社區僅次於 TensorFlow 的深度學習框架。