大家在使用PyTorch時,是不是也踩過不少坑?
現在,Reddit上的一位開發者根據他曾經犯過的錯和經常忘記的點,總結了
七點
使用PyTorch的小技巧,供大家參考。
該分享目前在Reddit上得到了300+的支援。
很多人表示很有用,並有人指出這些不僅僅是tips,是
每
個人
在使用Pytorch之前應該閱讀的教程的一部分
。
這位分享者還提供了線上程式碼示例和影片演示。
接下來就為大家一一展示,請大家按需汲取!
1、使用device引數直接在目標裝置建立張量
這樣
速度會更快
!線上示例程式碼顯示,直接在GPU上建立只需0。009s:
對此,有網友補充道,之所以這樣更快,是因為使用device引數是直接在GPU上建立張量,而不是在CPU上建立後再複製到GPU。
並且這樣以來,
使用的RAM更少,也不會留下CPU張量hanging around的風險
。
2、可能的話使用Sequential層
為了程式碼更乾淨。
下面是部分示例程式碼:
3、不要列層列表
因為它們不能被nn。Module類正確註冊。相反,應該將層列表作為未打包的引數傳遞到一個
Sequential
層中。
以上兩點有
爭議
:有人認為從程式碼正確性來看,使用nn。Sequential沒毛病,但是從程式碼可讀性來看,
應該使用nn。ModuleList
,除非只是在堆疊(stack)層。
他還給出了官方連結佐證
(詳情可見文末連結[3])
,該觀點得到了不少贊同。
另外針對第三點建議,有人不明白如何將列表作為未打包的引數傳遞給Sequential,並獲得相同的結果。
有人作出瞭解答:兩者都可索引定址和遍歷。只是ModuleList只儲存不知道如何使用它們的模組,而sequential則按它們在列表中的順序執行層。
下面是分享者提供的示例程式碼:
4、充分利用torch。distributions
PyTorch有一些不錯的物件和函式用於distribution,但這位開發者認為它們在torch。distributions中沒有得到充分利用。可以這樣使用:
5、對長度量(Long-Term Metrics)使用detach()
在兩個epochs之間儲存張量度量時,請確保對它們呼叫。detach(),以
避免記憶體洩漏
。
6、刪除模型時,使用torch。cuda。empty_cache()清除GPU快取
尤其是在使用筆記本刪除並重新建立大型模型時。
7、預測之前一定記得呼叫model。eval()
是不是很多人都忘記了?
如果你忘記呼叫model。eval(),也就是忘記將模型轉變為
evaluation
(測試)
模式
,那麼Dropout層和Batch Normalization層就會對你的預測資料造成干擾。
以上就是這位開發者總結的7點PyTorch使用小技巧。
有人表示,“我居然連第一個技巧都不知道”!
你是否知道呢?
最後,如果你對哪點有疑問或還有其他使用PyTorch時的小技巧,歡迎在評論區開麥!
線上程式碼示例:
https://colab。research。google。com/drive/15vGzXs_ueoKL0jYpC4gr9BCTfWt935DC
影片演示:https://www。youtube。com/watch?v=BoC8SGaT3GE
參考連結:
[1]https://www。reddit。com/r/MachineLearning/comments/n9fti7/d_a_few_helpful_pytorch_tips_examples_included/
[2]https://gist。github。com/ejmejm/1baeddbbe48f58dbced9c019c25ebf71
[3]https://pytorch。org/docs/stable/generated/torch。nn。ModuleList。html