7個使用PyTorch的技巧,含線上程式碼示例!網友:我連第一個都不知道?!

大家在使用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

7個使用PyTorch的技巧,含線上程式碼示例!網友:我連第一個都不知道?!