91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解析Pytorch基礎中網絡參數初始化問題

發布時間:2021-12-04 18:35:07 來源:億速云 閱讀:214 作者:柒染 欄目:大數據

如何解析Pytorch基礎中網絡參數初始化問題,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

參數訪問和遍歷:

對于模型參數,我們可以進行訪問;

由于Sequential由Module繼承而來,所以可以使用Module鐘的parameter()或者named_parameters方法來訪問所有的參數;

例如,對于使用Sequential搭建的網絡,可以使用下列for循環直接進行遍歷:

for name, param in net.named_parameters():
    print(name, param.size())

當然,也可以使用索引來按層訪問,因為本身網絡也是按層搭建的:

for name, param in net[0].named_parameters():
    print(name, param.size(), type(param))

當我們獲取某一層的參數信息后,可以使用data()和grad()函數來進行值和梯度的訪問:

weight_0 = list(net[0].parameters())[0]
print(weight_0.data)
print(weight_0.grad) # 反向傳播前梯度為None
Y.backward()
print(weight_0.grad)

參數初始化問題:

當我們參用for循環獲取每層參數,可以采用如下形式對w和偏置b進行初值設定:

for name, param in net.named_parameters():
    if 'weight' in name:
        init.normal_(param, mean=0, std=0.01)
        print(name, param.data)

for name, param in net.named_parameters():
    if 'bias' in name:
        init.constant_(param, val=0)
        print(name, param.data)

當然,我們也可以進行初始化函數的自定義設置:

def init_weight_(tensor):
    with torch.no_grad():
        tensor.uniform_(-10, 10)
        tensor *= (tensor.abs() >= 5).float()

for name, param in net.named_parameters():
    if 'weight' in name:
        init_weight_(param)
        print(name, param.data)

這里注意一下torch.no_grad()的問題;

該形式表示該參數并不隨著backward進行更改,常常用來進行局部網絡參數固定的情況;

如該連接所示:關于no_grad()

共享參數:

可以自定義Module類,在forward中多次調用同一個層實現;

如上章節的代碼所示:

class FancyMLP(nn.Module):
    def __init__(self, **kwargs):
        super(FancyMLP, self).__init__(**kwargs)
        self.rand_weight = torch.rand((20, 20), requires_grad=False) # 不可訓練參數(常數參數)
        self.linear = nn.Linear(20, 20)
    def forward(self, x):
        x = self.linear(x)
        # 使用創建的常數參數,以及nn.functional中的relu函數和mm函數
        x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1)
        # 復用全連接層。等價于兩個全連接層共享參數
        x = self.linear(x)
        # 控制流,這里我們需要調用item函數來返回標量進行比較
        while x.norm().item() > 1:
            x /= 2
        if x.norm().item() < 0.8:
            x *= 10
        return x.sum()

所以可以看到,相當于同時在同一個網絡中調用兩次相同的Linear實例,所以變相實現了參數共享;

suo'yi注意一下,如果傳入Sequential模塊的多層都是同一個Module實例的話,則他們共享參數;

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平遥县| 高要市| 屏南县| 沛县| 门头沟区| 大洼县| 元朗区| 南郑县| 田东县| 江源县| 芷江| 长海县| 余干县| 乐陵市| 石林| 英吉沙县| 宜兴市| 吉安市| 彭阳县| 崇文区| 望奎县| 墨竹工卡县| 清涧县| 惠安县| 景泰县| 雷山县| 石城县| 宝兴县| 枣庄市| 尼勒克县| 清新县| 抚宁县| 连城县| 麻江县| 刚察县| 舒城县| 无棣县| 郴州市| 永福县| 云龙县| 嘉鱼县|