在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 看看主機板的第一驅動是不是設定成軟碟機了。改正確就行 一般第一驅動光碟機 第二驅動硬碟 這樣應該可以解決了。如果還不行 那就是要關閉主...
為什麼要設定損失函式
以數字識別任務為例,我們想獲得的是能提高識別精度的引數,特意再匯入乙個損失函式不是有些重複勞動嗎?也就是說,既然我們的目標是獲得使識別精度盡可能高的神經網路,那不是應該把識別精度作為指標嗎?在神經網路的學習中,尋找最優引數 權重和偏置 時,要尋找使損失函式的值盡可能小的引數。為了找到使損失函式的值盡...
為什麼要設定環境變數
解決不是內部或外部命令問題 關於環境變數,你了解多少呢?接下來我們一起來了解一下什麼是環境變數,它的作用是什麼。環境變數 這四個字千萬不要顧名思義,因為你根本就理解不了它的意思,那就乾脆不要理解了,直接說它的作用吧。環境變數就是一些被指定的資料夾路徑,目的是為了更快速方便的找到想要的檔案和資料夾。在...