Pytorch 隨機數種子設定

2022-05-25 08:00:12 字數 877 閱讀 5797

一般而言,可以按照如下方式固定隨機數種子,以便復現實驗:

parser.add_argument('--seed', type=int, default=42, help='random seed.')

np.random.seed(args.seed)

torch.manual_seed(args.seed)

if args.cuda:

torch.cuda.manual_seed(args.seed)

# 自己之前所寫的 noisy label 的**,參照某一篇 blog

def seed_torch(seed=0):

random.seed(seed)

np.random.seed(seed)

torch.manual_seed(seed)

torch.cuda.manual_seed(seed)

torch.backends.cudnn.deterministic = true

torch.backends.cudnn.benchmark = false

即使設定了隨機數種子,當改寫了幾行** ,即使期望實現功能完全相同,但也可能無法復現原來的結果

原因在於:隨機數是順序生成的,如果中間被額外的步驟多呼叫了一次隨機數生成器,就會導致最終的結果完全不同。

例如:優化 \(loss1+\lambda\times loss2\)

假定 \(loss1\)的計算過程要用到隨機數, 若在 \(loss2\) 的計算過程中也要呼叫了隨機數發生器,則會打亂先前供計算 \(loss1\) 使用的隨機數列,導致如下兩種情況最終結果不同:

python 在主函式中設定隨機數種子,似乎也可以將子函式 or 其他被主函式呼叫的隨機模組給固定下來。

隨機數種子

隨機數 int main 函式rand 是真正的隨機數生成器,而srand 會設定供rand 使用的隨機數種子。如果你在第一次呼叫rand 之前沒有呼叫srand 那麼系統會為你自動呼叫srand 而使用同種子相同的數呼叫 srand 會導致相同的隨機數序列被生成。srand unsigned ti...

隨機數種子

隨機數就是就隨機數種子中取出的數。種子就是個序號,這個序號交給乙個數列管理器,通過這個序號,你從管理器中取出乙個數列,這個數列就是你通過那個序號得到的隨機數。但這個隨技術並不真正隨機。因為它是通過某個演算法的得到。也就是說你給數列管理器同乙個序號將得到同樣乙個 隨機 數列。也就是說種子和隨機數列是一...

隨機數種子

隨機數 int main 函式rand 是真正的隨機數生成器,而srand 會設定供rand 使用的隨機數種子。如果你在第一次呼叫rand 之前沒有呼叫srand 那麼系統會為你自動呼叫srand 而使用同種子相同的數呼叫 srand 會導致相同的隨機數序列被生成。srand unsigned ti...