numpy pytorch 接口对应_拆书分享篇深度学习框架PyTorch入门与实践
<<深度學習框架PyTorch入門與實踐>>讀書筆記
《深度學習框架PyTorch入門與實踐》讀后感
小作者:馬苗苗
?讀完<<深度學習框架PyTorch入門與實踐>>,我對PyTorch有了更多更全面的了解,首先介紹下常見的深度學習框架。
?常見的深度學習框架有TensorFlow、Caffe、Theano、Keras、MXNet、PyTorch等。這些深度學習框架被應(yīng)用于計算機視覺、語音識別、自然語言處理與生物信息學等領(lǐng)域,并獲取了極好的效果。
?通過對本書的閱讀結(jié)合我的使用經(jīng)驗簡單介紹下各個框架的優(yōu)缺點。Theano調(diào)試難、構(gòu)建圖慢,目前已停止開發(fā),不建議作為研究工具繼續(xù)學習;TensorFlow社區(qū)強大,適合生產(chǎn)環(huán)境,但上手困難、不易學習,且頻繁變動的接口導致新舊版本代碼調(diào)試總是會出bug;Keras入門最簡單,但其過度封裝導致不夠靈活,使用受限;Caffe/Caffe2缺少靈活性,文檔不夠完善,安裝麻煩,但簡潔快速,適合生產(chǎn)環(huán)境;MXNet文檔略混亂,但分布式性能強大,語言支持最多,適合AWS云平臺使用;CNTK社區(qū)不夠活躍,但是性能突出,擅長語音方面的相關(guān)研究。PyTorch高效快速、靈活易學習、調(diào)試方便、很適合研究使用,但其分布式并行支持有限,且難以部署到生產(chǎn)環(huán)境。
?下來介紹下PyTorch中重要的數(shù)據(jù)結(jié)構(gòu)以及構(gòu)建神經(jīng)網(wǎng)絡(luò)訓練常用的操作。
?Tensor是PyTorch中重要的數(shù)據(jù)結(jié)構(gòu),只要使用PyTorch,就會用到Tensor,可認為是高維數(shù)組,與numpy的ndarrays類似,支持很多操作,包括數(shù)學運算、線性代數(shù)、選擇、切片等,與numpy對象共享內(nèi)存,它們之間的轉(zhuǎn)換很快,幾乎不會消耗資源,且可通過.cuda()方法很方便地轉(zhuǎn)為GPU的Tensor,從而使用GPU加速。
?神經(jīng)網(wǎng)絡(luò)訓練主要分為定義網(wǎng)絡(luò)、計算輸出、計算損失、反向傳播求梯度、優(yōu)化器優(yōu)化、模型保存這幾個步驟。接下來分別針對這幾個模塊介紹PyTorch中相應(yīng)的用法。
?Torch.nn是PyTorch專門為神經(jīng)網(wǎng)絡(luò)設(shè)計的模塊化接口。nn構(gòu)建于Autograd之上,可用來定義和運行神經(jīng)網(wǎng)絡(luò)。nn.Module是nn中最重要的類,包含網(wǎng)絡(luò)各層定義及forward方法,調(diào)用forward(input)方法,可返回前向傳播的結(jié)果。需要注意的是,定義網(wǎng)絡(luò)時,需要繼承nn.Module,并實現(xiàn)它的forward方法,把網(wǎng)絡(luò)中具有可學習的參數(shù)的層數(shù)放在構(gòu)造函數(shù)__init__中。若某一層(如ReLU)不具有可學習的參數(shù),則既可以放在構(gòu)造函數(shù)中,也可以不放。nn.functional也是nn中很常用的模塊,其與nn.Module主要區(qū)別在于,nn.Module實現(xiàn)的layers是一個特殊的類,都是由class Layer(nn.Module)定義,會自動提取可學習的參數(shù);而nn.functional中的函數(shù)更像是純函數(shù),由def function(input)定義。如果模型有可學習的參數(shù),最好用nn.Module,否則既可以使用nn.functional,也可以使用nn.Module。但建議dropout操作還使用nn.Dropout而不是nn.functional.dropout,因為dropout在訓練和測試兩個階段的行為有所差別,使用nn.Module對象能夠通過model.eval操作加以區(qū)分。
?nn實現(xiàn)了神經(jīng)網(wǎng)絡(luò)中大多數(shù)的損失函數(shù),如nn.MSELoss用來計算均方誤差,nn.CrossEntropyLoss用來計算交叉熵損失等,也可以很方便靈活的自定義損失函數(shù)。調(diào)用.backward()時,PyTorch計算圖會動態(tài)生成并自動微分,也會自動計算圖中參數(shù)的導數(shù)。再調(diào)用.backward()前,要調(diào)用.zero_grad()對網(wǎng)絡(luò)中所有可學習參數(shù)的梯度清零。
?torch.optim中實現(xiàn)了深度學習中絕大多數(shù)的優(yōu)化方法,例如RMSProp、Adam、SGD等,其設(shè)計靈活,能夠很方便地擴展成自定義的優(yōu)化方法。參數(shù)優(yōu)化中可對不同子網(wǎng)絡(luò)設(shè)置不同的學習率,在finetune中經(jīng)常用到。調(diào)整學習率主要有兩種做法。一種是修改optimizer.param_groups中對應(yīng)的學習率,另一種是新建優(yōu)化器。但新建優(yōu)化器會重新初始化動量等初始狀態(tài)信息,對使用動量的優(yōu)化器來說,可能會造成損失函數(shù)在收斂過程中出現(xiàn)震蕩。
?通過torch.save(obj, file_name)等方法保存任意可序列化的對象,然后通過torch.load(file_name)方法加載保存的數(shù)據(jù)。對Module和Optimizer對象,建議保存對應(yīng)的state_dict。
總結(jié)
以上是生活随笔為你收集整理的numpy pytorch 接口对应_拆书分享篇深度学习框架PyTorch入门与实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#sort升序还是降序_c# List
- 下一篇: xml 名称中不能包含= 字符_可扩展标