一般而言,可以按照如下方式固定隨機數種子,以便復現實驗:
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...