国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Pytorch權(quán)重初始化/參數(shù)初始化

這篇具有很好參考價(jià)值的文章主要介紹了Pytorch權(quán)重初始化/參數(shù)初始化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

refer:

  • 【Pytorch】各網(wǎng)絡(luò)層的默認(rèn)初始化方法 https://blog.csdn.net/guofei_fly/article/details/105109883

20230625

其實(shí)Pytorch初始化方法就在各自的層的def reset_parameters(self) -> None:方法中。

有人可能會(huì)問(wèn)為什么這個(gè)方法和Pytorch直接出來(lái)的權(quán)重初始值不一樣?單步調(diào)試會(huì)發(fā)現(xiàn)其實(shí)這個(gè)方法運(yùn)行了至少兩次,而每次出來(lái)的結(jié)果都是不同的,說(shuō)明初始化結(jié)果可能還和函數(shù)調(diào)用次數(shù)有關(guān),但是不論調(diào)用多少次還是符合基本的分布情況的。請(qǐng)參考python/pytorch random_seed隨機(jī)種子 https://blog.csdn.net/qq_43369406/article/details/131342983

"""init param"""
# !!write above on the first line!!
import random, numpy as np, torch

# set random seed
seed = 416
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)

def _weights_init(m):
    """
    intro:
        weights init.
        finish these:
            - torch.nn.Linear
    >>> version 1.0.0
    if type(m) == nn.Linear:
        print("Init", *[(name, param.shape) for name, param in m.named_parameters()][0])    # linear - param - weight
        nn.init.trunc_normal_(m.weight, std=.01)
        if m.bias is not None:
            print("Init", *[(name, param.shape) for name, param in m.named_parameters()][1])    # linear - param - bias
            nn.init.zeros_(m.bias)
    elif classname.startswith('Conv'):
        m.weight.data.normal_(0.0, 0.02)
    >>> version 1.0.1
        refer https://blog.csdn.net/guofei_fly/article/details/105109883
        finish nn.Linear, nn.Conv
    
    args:
        :param torch.parameters m: nn.Module
    """
    classname = m.__class__.__name__

    if type(m) == nn.Linear or classname.startswith("Conv"):
        print("Init", *[(name, param.shape) for name, param in m.named_parameters()][0])    # linear - param - weight
        nn.init.kaiming_uniform_(m.weight, a=math.sqrt(5), nonlinearity='leaky_relu')
        if m.bias is not None:
            print("Init", *[(name, param.shape) for name, param in m.named_parameters()][1])    # linear - param - bias
            fan_in, _ = nn.init._calculate_fan_in_and_fan_out(m.weight)
            bound = 1 / math.sqrt(fan_in)
            nn.init.uniform_(m.bias, -bound, bound)
    elif isinstance(m, nn.Conv2d):
        nn.init.kaiming_normal_(m.weight, mode="fan_out")
        if m.bias is not None:
            nn.init.zeros_(m.bias)
    elif isinstance(m, nn.LayerNorm):
        nn.init.zeros_(m.bias)
        nn.init.ones_(m.weight)
    elif classname.find('BatchNorm') != -1:
        m.weight.data.normal_(1.0, 0.02)
        m.bias.data.fill_(0)
         
net = nn.Sequential(nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=1), nn.LazyLinear(8), nn.ReLU(), nn.LazyLinear(1))
X = torch.rand(size=(1, 3, 224, 224))   # [ batch_size, channel, height, width ]
Y = net(X)
net.apply(_weights_init)

# check param
print(net[0].weight, '\n', net[0].bias)

20230622

# !!write above on the first line!!
import random, numpy as np, torch
random.seed(args.seed)
np.random.seed(args.seed)
torch.manual_seed(args.seed)
torch.cuda.manual_seed(args.seed)

def _weights_init(m):
    """
    intro:
        weights init.
        finish these:
            - torch.nn.Linear
    >>> version 1.0.0
    if type(m) == nn.Linear:
        print("Init", *[(name, param.shape) for name, param in m.named_parameters()][0])    # linear - param - weight
        nn.init.trunc_normal_(m.weight, std=.01)
        if m.bias is not None:
            print("Init", *[(name, param.shape) for name, param in m.named_parameters()][1])    # linear - param - bias
            nn.init.zeros_(m.bias)
    
    args:
        :param torch.parameters m: nn.Module
    """
    classname = m.__class__.__name__

    if type(m) == nn.Linear:
        print("Init", *[(name, param.shape) for name, param in m.named_parameters()][0])    # linear - param - weight
        nn.init.trunc_normal_(m.weight, std=.01)
        if m.bias is not None:
            print("Init", *[(name, param.shape) for name, param in m.named_parameters()][1])    # linear - param - bias
            nn.init.zeros_(m.bias)
    elif isinstance(m, nn.Conv2d):
        nn.init.kaiming_normal_(m.weight, mode="fan_out")
        if m.bias is not None:
            nn.init.zeros_(m.bias)
    elif isinstance(m, nn.LayerNorm):
        nn.init.zeros_(m.bias)
        nn.init.ones_(m.weight)
    elif classname.startswith('Conv'):
        m.weight.data.normal_(0.0, 0.02)
    elif classname.find('BatchNorm') != -1:
        m.weight.data.normal_(1.0, 0.02)
        m.bias.data.fill_(0)
         
net = nn.Sequential(nn.LazyLinear(8), nn.ReLU(), nn.LazyLinear(1))
X = torch.rand(size=(2, 4))
net.apply(_weights_init)

x.1 指定隨機(jī)性

正態(tài)分布仍然是一個(gè)分布,這會(huì)使得你的實(shí)驗(yàn)結(jié)果無(wú)法完全復(fù)現(xiàn),要讓實(shí)驗(yàn)結(jié)果完全復(fù)現(xiàn)則需要指定seed,如下:

random.seed(args.seed)
np.random.seed(args.seed)
torch.manual_seed(args.seed)
torch.cuda.manual_seed(args.seed)

x.2 參數(shù)初始化

參數(shù)初始化是很重要的工作,數(shù)據(jù)決定了梯度下降的山脈長(zhǎng)什么樣,而參數(shù)初始化決定了你從這個(gè)山的哪個(gè)合適的地方開(kāi)始出發(fā)。Pytorch提供了多種初始化方法,可以搭配nn.Module.apply和你自己寫(xiě)的初始化方法函數(shù),來(lái)將nn.Module中所有繼承自nn.Module子類(lèi)中的children對(duì)象的參數(shù)初始化,如下:

常見(jiàn)的bulit-in初始化方法,

"""

6.3.1. Built-in Initialization
using built-in func to init.

- `nn.init.normal_(module.weight, mean=0, std=0.01)`
- `nn.init.zeros_(module.bias)`
- `nn.init.constant_(module.weight, 1)`
- `nn.init.zeros_(module.bias)`
- `nn.init.xavier_uniform_(module.weight)`
- `nn.init.kaiming_uniform_(module.weight)` # default one for Linear, and the type is Leaky_ReLU
- `nn.init.uniform_(module.weight, -10, 10)`
"""

進(jìn)行初始化,

def init_normal(module):
    if type(module) == nn.Linear:
        nn.init.normal_(module.weight, mean=0, std=0.01)
        nn.init.zeros_(module.bias)

net.apply(init_normal)
print(net[0].weight.data[0]) 
print(net[0].bias.data[0])

使用自己的初始化方法進(jìn)行初始化,文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-510069.html

def _weights_init(m):
    """
    intro:
        weights init.
        finish these:
            - torch.nn.Linear
    >>> version 1.0.0
    if type(m) == nn.Linear:
        print("Init", *[(name, param.shape) for name, param in m.named_parameters()][0])    # linear - param - weight
        nn.init.trunc_normal_(m.weight, std=.01)
        if m.bias is not None:
            print("Init", *[(name, param.shape) for name, param in m.named_parameters()][1])    # linear - param - bias
            nn.init.zeros_(m.bias)
    
    args:
        :param torch.parameters m: nn.Module
    """
    classname = m.__class__.__name__

    if type(m) == nn.Linear:
        print("Init", *[(name, param.shape) for name, param in m.named_parameters()][0])    # linear - param - weight
        nn.init.trunc_normal_(m.weight, std=.01)
        if m.bias is not None:
            print("Init", *[(name, param.shape) for name, param in m.named_parameters()][1])    # linear - param - bias
            nn.init.zeros_(m.bias)
    elif isinstance(m, nn.Conv2d):
        nn.init.kaiming_normal_(m.weight, mode="fan_out")
        if m.bias is not None:
            nn.init.zeros_(m.bias)
    elif isinstance(m, nn.LayerNorm):
        nn.init.zeros_(m.bias)
        nn.init.ones_(m.weight)
    elif classname.startswith('Conv'):
        m.weight.data.normal_(0.0, 0.02)
    elif classname.find('BatchNorm') != -1:
        m.weight.data.normal_(1.0, 0.02)
        m.bias.data.fill_(0)
         
net = nn.Sequential(nn.LazyLinear(8), nn.ReLU(), nn.LazyLinear(1))
X = torch.rand(size=(2, 4))
net.apply(_weights_init)

到了這里,關(guān)于Pytorch權(quán)重初始化/參數(shù)初始化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【機(jī)器學(xué)習(xí)300問(wèn)】78、都有哪些神經(jīng)網(wǎng)絡(luò)的初始化參數(shù)方法?

    ????????在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),權(quán)重初始化是確保良好收斂的關(guān)鍵步驟之一。不合適的初始化方法可能會(huì)導(dǎo)致梯度消失或爆炸,特別是在深層網(wǎng)絡(luò)中。那么都有哪些神經(jīng)網(wǎng)絡(luò)的初始化參數(shù)方法呢?選擇它這些方法的原則是什么? ? ? ? ? 關(guān)于隨機(jī)初始化神經(jīng)網(wǎng)絡(luò)參數(shù)的方法

    2024年04月23日
    瀏覽(45)
  • VScode:初始化恢復(fù)默認(rèn)設(shè)置

    VScode:初始化恢復(fù)默認(rèn)設(shè)置

    第一步:在VScode左下角點(diǎn)擊設(shè)置 第二步:點(diǎn)擊這個(gè)按鈕 第三步:將大括號(hào)里的內(nèi)容全部刪除,這些都是你當(dāng)前的用戶(hù)設(shè)置 第四步:清空后,VScode的設(shè)置就初始化了,你會(huì)發(fā)現(xiàn)我的背景變了,因?yàn)槲覍⒅黝}的設(shè)置也刪除了,所以就恢復(fù)默認(rèn)主題了【記得ctrl + S(保存)】

    2024年03月21日
    瀏覽(29)
  • Git設(shè)置初始化默認(rèn)分支為main

    github創(chuàng)建項(xiàng)目的默認(rèn)分支為main。本地創(chuàng)建的git分支默認(rèn)為master,每次在本地新建一個(gè)倉(cāng)庫(kù)再關(guān)聯(lián)到remote,分支不統(tǒng)一。 git在2.28版本中提供了一個(gè)配置,指定在執(zhí)行 git init 的時(shí)候生成的默認(rèn)分支 本地git版本不夠的話先升級(jí); 如果使用homebrew安裝的git,直接升級(jí)即可 或者可以

    2024年02月13日
    瀏覽(16)
  • 深度學(xué)習(xí)參數(shù)初始化(二)Kaiming初始化 含代碼

    深度學(xué)習(xí)參數(shù)初始化(二)Kaiming初始化 含代碼

    目錄 一、介紹 二、基礎(chǔ)知識(shí) 三、Kaiming初始化的假設(shè)條件? 四、Kaiming初始化的簡(jiǎn)單的公式推導(dǎo) 1.前向傳播 2.反向傳播 五、Pytorch實(shí)現(xiàn) 深度學(xué)習(xí)參數(shù)初始化系列: (一)Xavier初始化 含代碼 (二)Kaiming初始化 含代碼 ????????Kaiming初始化論文地址:https://arxiv.org/abs/1502.01

    2024年02月04日
    瀏覽(19)
  • 【C++進(jìn)階知識(shí)】04 - 函數(shù)默認(rèn)實(shí)參、默認(rèn)初始化、initializer_list

    默認(rèn)實(shí)參需要注意以下幾點(diǎn): (1)函數(shù)默認(rèn)實(shí)參的賦值應(yīng)從右往左,否則編譯報(bào)錯(cuò),因?yàn)閰?shù)入棧應(yīng)該從右往左。 (2)類(lèi)外的默認(rèn)實(shí)參會(huì)使類(lèi)的非默認(rèn)構(gòu)造函數(shù)變成默認(rèn)構(gòu)造函數(shù)。 (3)如果在類(lèi)中添加了該函數(shù)的該參數(shù)的默認(rèn)實(shí)參,那么在類(lèi)外再次定義該參數(shù)的默認(rèn)實(shí)參

    2024年02月14日
    瀏覽(17)
  • 在C#中使用默認(rèn)值初始化字符串?dāng)?shù)組的3種方式

    在本文中,您將學(xué)習(xí)到新建字符串?dāng)?shù)組如何設(shè)置默認(rèn)值。數(shù)組是可以使用索引訪問(wèn)的相同類(lèi)型的元素的集合。對(duì)于字符串?dāng)?shù)組,每個(gè)元素都是一個(gè)字符串值。在 C# 中創(chuàng)建新的字符串?dāng)?shù)組時(shí),默認(rèn)值為 null。但是,在某些情況下,您可能希望使用特定的默認(rèn)值而不是 null 初始化

    2024年02月04日
    瀏覽(25)
  • RestHighLevelClient初始化http參數(shù)的含義

    high-level-rest-client 初始化 一般初始化時(shí)需要設(shè)置驗(yàn)證信息、http相關(guān)參數(shù); Http相關(guān)參數(shù)介紹 keepalive keepalive用以維護(hù)長(zhǎng)連接,長(zhǎng)連接可以復(fù)用,但一定情況下需要中斷長(zhǎng)連接,如長(zhǎng)連接長(zhǎng)時(shí)間沒(méi)有被使用的場(chǎng)景,需要中斷長(zhǎng)連接來(lái)節(jié)省資源。如上述ES客戶(hù)端初始化案例中,則是

    2024年02月12日
    瀏覽(18)
  • React refers to UMD global, but the current file is a module vite初始化react項(xiàng)目

    React refers to UMD global, but the current file is a module vite初始化react項(xiàng)目

    初始化項(xiàng)目 在執(zhí)行完上面的命令后,npm 首先會(huì)自動(dòng)下載create-vite這個(gè)第三方包,然后執(zhí)行這個(gè)包中的項(xiàng)目初始化邏輯。輸入項(xiàng)目名稱(chēng)之后按下回車(chē),此時(shí)需要選擇構(gòu)建的前端框架: 選中react后們還有個(gè)選項(xiàng),我們選擇typescript 切換到項(xiàng)目按照依賴(lài)后跑起來(lái) ? React refers to UMD

    2024年02月09日
    瀏覽(23)
  • Servlet 初始化參數(shù)(web.xml和@WebServlet)
  • 【Git】git初始化項(xiàng)目時(shí) | git默認(rèn)創(chuàng)建main分之 | 如何將git默認(rèn)分支從main改為master

    在 Git 中,如果你在第一次提交后想要將默認(rèn)分支名從 main 修改為 master,你可以按照以下步驟進(jìn)行操作: 創(chuàng)建 master 分支: 首先,你需要在當(dāng)前的 main 分支基礎(chǔ)上創(chuàng)建一個(gè)新的 master 分支。使用以下命令: 刪除 main 分支: 現(xiàn)在你已經(jīng)創(chuàng)建了一個(gè)新的 master 分支,可以將 main

    2024年02月08日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包