Pytorch為什麼總要設定隨機種子

2021-10-13 04:30:30 字數 2269 閱讀 7407

在pytorch中總能看到以 第一行有個設定隨機種子的函式?它到底有啥作用?

def

set_seed

(seed=1)

: random.seed(seed)

np.random.seed(seed)

torch.manual_seed(seed)

torch.cuda.manual_seed(seed)

隨機種子是針對 隨機方法 而言的。

隨機方法:常見的隨機方法有 生成隨機數,以及其他的像 隨機排序 之類的,後者本質上也是 基於生成隨機數來實現的。在深度學習中,比較常用的隨機方法的應用有:網路的隨機初始化,訓練集的隨機打亂 等。

舉個例子,如果我們簡單呼叫 random.random() 來生成隨機數,那麼每一次生成的數都是隨機的。但是,當我們預先使用 random.seed(x) 設定好隨機種子,基於這個種子來執行隨機演算法,這個時候我們 得到的隨機數序列是相同的。

隨機種子的工作原理(計算機底層是如何實現生成隨機數的)?

雖然計算機很擅長做精確計算,但是它們處理隨機事件時非常不靠譜。

實際上,計算機中的所有隨機數都是 偽隨機數,是靠 隨機數演算法 生成的,大多數隨機數演算法都在努力創造一種 呈均勻分布且難以**的 資料序列。

所有的隨機數演算法在初始化階段都需要乙個 隨機「種子」(random seed),完全相同的種子每次將產生相同的「隨機」數序列。如果我們沒有手動進行顯式設定,系統則 預設根據時間來選擇這個值,此時每次生成的隨機數因時間差異而不同。

① 隨機種子的取值範圍?

可以是任意數字,如10,1000

② 隨機種子的作用範圍

np.random.seed(0)

print

(np.random.rand(3)

)print

(np.random.rand(3)

)

輸出:

[

0.5488135

0.71518937

0.60276338][

0.54488318

0.4236548

0.64589411

]

再次執行程式,會輸出同一組隨機數:

[

0.5488135

0.71518937

0.60276338][

0.54488318

0.4236548

0.64589411

]

想要在同乙個程式中產生同一組隨機數,需要在下乙個函式前設定乙個相同的隨機種子

np.random.seed(0)

print

(np.random.rand(3)

)np.random.seed(0)

print

(np.random.rand(3)

)

輸出

[

0.5488135

0.71518937

0.60276338][

0.5488135

0.71518937

0.60276338

]

打個比方,在機器學習,深度學習演算法中,我們往往會用到隨機向量,隨機矩陣,這使得我們每次執行演算法計算出來的結果是不一致的,會為我們除錯演算法帶來麻煩。

基於隨機種子來實現**中的隨機方法,能夠 保證多次執行此段**能夠得到完全一樣的結果,即保證結果的 可復現性,這樣 別人跑你的**的時候也能夠很好地復現出你的結果。

【參考資料】pytorch設定隨機數種子,使訓練結果可復現。

在使用 pytorch 時,如果希望通過設定隨機數種子,在 gpu 或 cpu 上固定每一次的訓練結果,則需要在程式執行的開始處新增以下**:

def

setup_seed

(seed)

: torch.manual_seed(seed)

torch.cuda.manual_seed_all(seed)

np.random.seed(seed)

random.seed(seed)

torch.backends.cudnn.deterministic =

true

# 設定隨機數種子

setup_seed(20)

# 預處理資料以及訓練模型

# ...

# ...

為什麼每次開機總要按F1?

為什麼每次開機總要按f1?按步驟來 1 系統的時間顯示正確嗎?不正確 更換主機板電池 2 如果系統時間顯示正確 進入主機板設定介面 把driver 選擇none 3 看看主機板的第一驅動是不是設定成軟碟機了。改正確就行 一般第一驅動光碟機 第二驅動硬碟 這樣應該可以解決了。如果還不行 那就是要關閉主...

為什麼要設定損失函式

以數字識別任務為例,我們想獲得的是能提高識別精度的引數,特意再匯入乙個損失函式不是有些重複勞動嗎?也就是說,既然我們的目標是獲得使識別精度盡可能高的神經網路,那不是應該把識別精度作為指標嗎?在神經網路的學習中,尋找最優引數 權重和偏置 時,要尋找使損失函式的值盡可能小的引數。為了找到使損失函式的值盡...

為什麼要設定環境變數

解決不是內部或外部命令問題 關於環境變數,你了解多少呢?接下來我們一起來了解一下什麼是環境變數,它的作用是什麼。環境變數 這四個字千萬不要顧名思義,因為你根本就理解不了它的意思,那就乾脆不要理解了,直接說它的作用吧。環境變數就是一些被指定的資料夾路徑,目的是為了更快速方便的找到想要的檔案和資料夾。在...