日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【深度学习】PyTorch 数据集随机值的完美实践

發布時間:2025/3/12 pytorch 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】PyTorch 数据集随机值的完美实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 作者 | Elvanth@知乎

來源 | https://zhuanlan.zhihu.com/p/377155682
編輯 | 極市平臺
本文僅作學術交流,版權歸原作者所有,如有侵權請聯系刪除。

導讀

?

本文所分析的問題與解決方案將在最近發布的pytorch版本中解決;因此解決所有煩惱的根源是方法,更新pytorch~?>>

一個快捷的解決方案:

def worker_init_fn(worker_id):worker_seed = torch.initial_seed() % 2**32np.random.seed(worker_seed)random.seed(worker_seed)ds?=?DataLoader(ds,?10,?shuffle=False,?num_workers=4,?worker_init_fn=worker_init_fn)

01 關于pytorch數據集隨機種子的基本認識

在pytorch中random、torch.random等隨機值產生方法一般沒有問題,只有少數工人運行也可以保障其不同的最終值.

np.random.seed 會出現問題的原因是,當多處理采用 fork 方式產生子進程時,numpy 不會對不同的子進程產生不同的隨機值.

換言之,當沒有多處理使用時,numpy 不會出現隨機種子的不同的問題;實驗代碼的可復現性要求一個是工人種子 ,即工人內包括numpy,random,torch.random所有的隨機表現;另一個是Base ,即程序運行后的初始隨機值,其可以通過以下兩種方式產生

  • torch.manual_seed(base_seed)

  • 由特定的seed generator設置

  • generator = torch. Generator() g.manual_seed(base_seed) DataLoader(dataset, ..., generator=generator)

    使用spawn模式可以斬斷以上所有煩惱.

    02 直接在網上搜這個問題會得到什么答案

    參考很多的解決方案時,往往會提出以下功能:

    def worker_init_fn(worker_id):np.random.seed(np.random.get_state()[1][0] + worker_id)

    讓我們看看它的輸出結果:
    (第0,3列是索引,第1,4列是np.random的結果,第2,5列是random.randint的結果)

    epoch 0 tensor([[ 0, 5125, 13588, 0, 15905, 23182],[ 1, 7204, 19825, 0, 13653, 25225]]) tensor([[ 2, 1709, 11504, 0, 12842, 23238],[ 3, 5715, 14058, 0, 15236, 28033]]) tensor([[ 4, 1062, 11239, 0, 10142, 29869],[ 5, 6574, 15672, 0, 19623, 25600]]) ============================================================ epoch 1 tensor([[ 0, 5125, 18134, 0, 15905, 28990],[ 1, 7204, 13206, 0, 13653, 25106]]) tensor([[ 2, 1709, 15512, 0, 12842, 29703],[ 3, 5715, 14201, 0, 15236, 27696]]) tensor([[ 4, 1062, 13994, 0, 10142, 23411],[ 5, 6574, 18532, 0, 19623, 21744]]) ============================================================

    假設上述方案對一個時代內可以防止不同的工人出現隨機值相同的情況,但不同的時代之間,其最終的隨機種子仍然是不變的。

    03 那應該如何解決

    來自pytorch官方的解決方案:

    https://github.com/pytorch/pytorch/pull/56488#issuecomment-825128350

    def worker_init_fn(worker_id):worker_seed = torch.initial_seed() % 2**32np.random.seed(worker_seed)random.seed(worker_seed)ds?=?DataLoader(ds,?10,?shuffle=False,?num_workers=4,?worker_init_fn=worker_init_fn)

    來自numpy.random原作者的解決方案:

    https://github.com/pytorch/pytorch/issues/5059#issuecomment-817392562

    def worker_init_fn(id):process_seed = torch.initial_seed()# Back out the base_seed so we can use all the bits.base_seed = process_seed - idss = np.random.SeedSequence([id, base_seed])# More than 128 bits (4 32-bit words) would be overkill.np.random.seed(ss.generate_state(4))ds?=?DataLoader(ds,?10,?shuffle=False,?num_workers=4,?worker_init_fn=worker_init_fn)

    一個更簡單但不保證正確性的解決方案:

    def worker_init_fn(worker_id):np.random.seed((worker_id + torch.initial_seed()) % np.iinfo(np.int32).max)ds?=?DataLoader(ds,?10,?shuffle=False,?num_workers=4,?worker_init_fn=worker_init_fn)

    04 附上可運行的完整文件

    import numpy as np import random import torch# np.random.seed(0)class Transform(object):def __init__(self):passdef __call__(self, item = None):return [np.random.randint(10000, 20000), random.randint(20000,30000)]class RandomDataset(object):def __init__(self):passdef __getitem__(self, ind):item = [ind, np.random.randint(1, 10000), random.randint(10000, 20000), 0]tsfm =Transform()(item)return np.array(item + tsfm)def __len__(self):return 20from torch.utils.data import DataLoaderdef worker_init_fn(worker_id):np.random.seed(np.random.get_state()[1][0] + worker_id)ds = RandomDataset() ds = DataLoader(ds, 10, shuffle=False, num_workers=4, worker_init_fn=worker_init_fn)for epoch in range(2):print("epoch {}".format(epoch))np.random.seed()for batch in ds:print(batch)

    如果覺得有用,就請分享到朋友圈吧!

    往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯黃海廣老師《機器學習課程》視頻課 本站qq群851320808,加入微信群請掃碼:

    總結

    以上是生活随笔為你收集整理的【深度学习】PyTorch 数据集随机值的完美实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。