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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[nn.Parameter]理解总结与初始化方法大全

發布時間:2024/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [nn.Parameter]理解总结与初始化方法大全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 一、查看性質
    • 二、參數是否初始化的區別
    • 三、參數初始化的方法
      • 1. 均勻分布
      • 2. 正太分布
      • 3. 常數分布
      • 4. 全1分布
      • 5. 全0分布
      • 6.單位分布:question:
      • 7. xavier_uniform 分布
      • 8. xavier_normal 分布
      • 9. kaiming_uniform 分布
      • 10. kaiming_normal 分布
      • 11、正交矩陣
      • 12、稀疏矩陣
      • 13. 函數初始化
      • 14、遍歷初始化

Parameter實際上也是Tensor,也就是說是一個多維矩陣,是Variable類中的一個特殊類。當我們創建一個model時, parameter會自動累加到Parameter 列表中。(這樣就可以自動計算梯度等)

  • 創建一個model
## 導入庫 import numpy as np import torch import torch.nn as nn ## 建立一個空間注意力層 class Spatial_Attention_layer(nn.Module):def __init__(self, DEVICE, in_channels, num_of_vertices, num_of_timesteps):super(Spatial_Attention_layer, self).__init__()self.W1 = nn.Parameter(torch.FloatTensor(num_of_timesteps).to(DEVICE)) # (12)self.W2 = nn.Parameter(torch.FloatTensor(in_channels, num_of_timesteps).to(DEVICE)) # (1, 12)self.W3 = nn.Parameter(torch.FloatTensor(in_channels).to(DEVICE)) # (1)self.bs = nn.Parameter(torch.FloatTensor(1, num_of_vertices, num_of_vertices).to(DEVICE)) # (1,307, 307)self.Vs = nn.Parameter(torch.FloatTensor(num_of_vertices, num_of_vertices).to(DEVICE)) # (307, 307)def reset_parameters(self):# 初始化方法for p in self.parameters():if p.dim() > 1:nn.init.xavier_uniform_(p) # Xavier 初始化確保權重“恰到好處”else:nn.init.uniform_(p)def forward(self, x):'''x(B,N,F,T)–-×W1(T,)–-> (B,N,F) —-×W2(F,T) –->lhs(B,N,T)x(B,N,F,T)—- 轉置 -–> x(B,T,N,F) —-×W3(F,) –->rhs(B,T,N)product=lhs × rhs:(B,N,N)'''lhs = torch.matmul(torch.matmul(x, self.W1), self.W2)rhs = torch.matmul(self.W3, x).transpose(-1, -2)product = torch.matmul(lhs, rhs)S = torch.matmul(self.Vs, torch.sigmoid(product + self.bs))# normalizationS_normalized = F.softmax(S, dim=1) # (32, 307, 307)return S_normalized

一、查看性質

  • 通過.parameters()獲得model的parameter的迭代序列,不是真的List
  • 查看具體的參數可以用for循環獲取。

  • 查看每個參數的性質:數值(.data),形狀(.shape),數據類型(.dtype),梯度(.grad)

二、參數是否初始化的區別

通過nn.Parameters()自動創建的參數往往不是我們所需要的參數,比如數據出現極小值。

進行參數初始化后的參數(如下圖)

三、參數初始化的方法

《Python的torch.nn.Parameter參數初始化》 值得參考與學習👍

import math import numpy as np import torch import torch.nn as nn # 參數的初始化 w = torch.nn.Parameter(torch.empty(2, 3))

1. 均勻分布

# torch.nn.init.uniform_(tensor, a=0, b=1) nn.init.uniform_(w)

2. 正太分布

# torch.nn.init.normal_(tensor, mean=0, std=1) nn.init.normal_(w)

3. 常數分布

# torch.nn.init.constant_(tensor, value) nn.init.constant_(w, 0.3)

4. 全1分布

# torch.nn.init.ones_(tensor) torch.nn.init.ones_(w)

5. 全0分布

# torch.nn.init.zeros_(tensor) torch.nn.init.zeros_(w)

6.單位分布?

# torch.nn.init.eye_(tensor) nn.init.eye_(w)

7. xavier_uniform 分布

# torch.nn.init.xavier_uniform_(tensor, gain=1) # calculate_gain 返回默認增益值 a = nn.init.calculate_gain('relu') # 1.414 nn.init.xavier_uniform_(w, gain=a)

8. xavier_normal 分布

# torch.nn.init.xavier_normal_(tensor, gain=1) nn.init.xavier_normal_(w) # 默認gain=1

9. kaiming_uniform 分布

# torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu') nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')

10. kaiming_normal 分布

# torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu') nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu')

11、正交矩陣

# torch.nn.init.orthogonal_(tensor, gain=1) nn.init.orthogonal_(w)

12、稀疏矩陣

# torch.nn.init.sparse_(tensor, sparsity, std=0.01) # 非零元素采用正態分布 N(0, 0.01) 初始化. nn.init.sparse_(w, sparsity=0.1)

13. 函數初始化

# 13. Dirac delta 函數初始化,僅適用于 {3, 4, 5} 維的 torch.Tensor # torch.nn.init.dirac_(tensor) b = torch.empty(3, 16, 5, 5) # 是根據輸入的size信息生成張量的方法,不需要主動初始化,其dtype默認torch.folat32 nn.init.dirac_(b) c = torch.tensor(np.array([1, 2, 3.])) # torch.tensor()則是復制輸入的數據再生成張量的方法,其dtype默認輸入數據的dtype# 舉例 # 1 一層一層單獨初始化 # conv 與 bn conv = nn.Conv2d(1, 3, kernel_size=1) # init.kaiming_uniform_(self.weight, a=math.sqrt(5)) ## nn.Conv2d()的weight的默認的初始化方式 # fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight) # bound = 1 / math.sqrt(fan_in) # init.uniform_(self.bias, -bound, bound) ## nn.Conv2d()的bias的默認的初始化方式 nn.init.kaiming_normal_(conv.weight, mode='fan_in') nn.init.constant_(conv.bias, 0.)bn = nn.BatchNorm2d(3), # init.ones_(self.weight) ## nn.BatchNorm2d()的weight的默認的初始化方式 # init.zeros_(self.bias) ## nn.BatchNorm2d()的bias的默認的初始化方式 nn.init.normal_(bn[0].weight, mean=1., std=0.02) nn.init.constant_(bn[0].bias, 0.)

14、遍歷初始化

1 .舉例1: 見開頭的案例中方式,并不會自動初始化。如果想要model在實例化的時候自動初始化。則在__init__()添加一條語句 self.reset_parameters()。

查看結果

  • 舉例2:
  • class DoubleConv(nn.Module):def __init__(self, in_channels, out_channels, mid_channels=None):super().__init__()if not mid_channels:mid_channels = out_channelsself.double_conv = nn.Sequential(nn.Conv2d(in_channels, mid_channels, kernel_size=3, padding=1, bias=False),nn.BatchNorm2d(mid_channels),nn.ReLU(inplace=True),nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1, bias=False),nn.BatchNorm2d(out_channels),nn.ReLU(inplace=True),)self.initialize_weights()def initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):n = m.kernel_size[0] * m.kernel_size[1] * m.out_channelsm.weight.data.normal_(0, math.sqrt(2. / n))elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()def forward(self, x):return self.double_conv(x)dc = DoubleConv(1, 4, 2)

    總結

    以上是生活随笔為你收集整理的[nn.Parameter]理解总结与初始化方法大全的全部內容,希望文章能夠幫你解決所遇到的問題。

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