【TORCH】神經網絡權重初始化和loss為inf

文章目錄

    • 數據輸入范圍和權重初始化
      • 數據范圍對權重初始化的影響
      • 示例代碼
        • 輸入數據標準化
      • 說明
      • 其他注意事項
    • 常見初始化方法
      • 常見的權重初始化方法
      • 示例代碼
      • 說明
    • 模型默認初始化方法,會不會導致Loss為inf
      • 示例
      • 說明
      • 初始化權重導致 Loss 為 `inf`
      • 避免 Loss 為 `inf` 的建議
      • 示例:檢查損失是否為 `inf`

數據輸入范圍和權重初始化

是的,初始化權重和數據范圍之間確實有關系。輸入數據的范圍和分布會影響神經網絡的訓練過程,因此權重初始化需要與之配合,以確保模型能夠有效地學習和收斂。

數據范圍對權重初始化的影響

  1. 輸入數據歸一化/標準化

    • 歸一化/標準化輸入數據可以確保所有特征具有相似的尺度,從而防止某些特征主導模型的學習過程。
    • 例如,將輸入數據歸一化到 [0, 1] 或標準化到均值為 0、標準差為 1 的分布。
  2. 權重初始化方法的選擇

    • 不同的初始化方法適用于不同的激活函數和數據范圍。
    • 例如,使用 ReLU 激活函數時,He 初始化通常效果更好;使用 tanh 或 sigmoid 激活函數時,Xavier 初始化通常效果更好。

示例代碼

以下是如何根據輸入數據范圍進行權重初始化的示例:

輸入數據標準化
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.preprocessing import StandardScaler# 生成示例數據
x_data = torch.randn(100, 10)
y_data = torch.randn(100, 1)# 標準化輸入數據
scaler = StandardScaler()
x_data = torch.tensor(scaler.fit_transform(x_data), dtype=torch.float32)# 定義簡單的神經網絡
class SimpleModel(nn.Module):def __init__(self, input_dim, output_dim):super(SimpleModel, self).__init__()self.linear1 = nn.Linear(input_dim, 50)self.linear2 = nn.Linear(50, output_dim)self._initialize_weights()def _initialize_weights(self):nn.init.kaiming_normal_(self.linear1.weight, nonlinearity='relu')nn.init.kaiming_normal_(self.linear2.weight, nonlinearity='relu')nn.init.constant_(self.linear1.bias, 0)nn.init.constant_(self.linear2.bias, 0)def forward(self, x):x = torch.relu(self.linear1(x))x = self.linear2(x)return x# 初始化模型
input_dim = x_data.shape[1]
output_dim = y_data.shape[1]
model = SimpleModel(input_dim, output_dim)# 定義損失函數和優化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 訓練步驟
output = model(x_data)
loss = criterion(output, y_data)print(f"Loss: {loss.item()}")

說明

  1. 數據標準化:使用 StandardScaler 將輸入數據標準化,使其均值為 0,標準差為 1。這樣可以確保數據范圍在一個合適的尺度上。
  2. 權重初始化:使用 He 初始化(nn.init.kaiming_normal_)來初始化權重,這是因為 ReLU 激活函數通常與 He 初始化配合得很好。
  3. 模型定義:定義了一個簡單的神經網絡模型,并在構造函數中調用了 _initialize_weights 方法來初始化權重。

其他注意事項

  • 數據歸一化:如果輸入數據的范圍在 [0, 1] 或 [-1, 1],可以考慮使用 MinMaxScaler 進行歸一化。
  • 特征縮放:如果不同特征的范圍差異較大,特征縮放可以幫助加速梯度下降算法的收斂。
  • 權重初始化的選擇:根據輸入數據范圍和激活函數選擇合適的權重初始化方法,可以有效地防止梯度消失或梯度爆炸問題,提高模型的訓練效果。

通過合理選擇權重初始化方法和對輸入數據進行適當的預處理,可以確保模型更穩定和高效地訓練。如果您有更多問題或需要進一步的幫助,請告訴我!

常見初始化方法

神經網絡的權重初始化對于模型的訓練效果至關重要。在 PyTorch 中,有多種常見的權重初始化方法,可以根據具體情況選擇最適合的方法。以下是一些常見的初始化方法:

常見的權重初始化方法

  1. 零初始化 (Zero Initialization)

    • 將所有權重初始化為零。
    • 這種方法一般不推薦,因為所有神經元的輸出將是相同的,導致梯度更新也是相同的,從而破壞了模型的學習能力。
  2. 正態分布初始化 (Normal Initialization)

    • 從均值為0,標準差為指定值的正態分布中采樣。
    • 通常使用 torch.nn.init.normal_ 方法。
  3. 均勻分布初始化 (Uniform Initialization)

    • 從指定區間的均勻分布中采樣。
    • 通常使用 torch.nn.init.uniform_ 方法。
  4. Xavier 初始化 (Xavier Initialization)

    • 適用于激活函數為 tanhsigmoid 的網絡。
    • 使得每一層的輸入和輸出的方差盡可能相同。
    • 使用 torch.nn.init.xavier_normal_torch.nn.init.xavier_uniform_ 方法。
  5. He 初始化 (He Initialization)

    • 適用于激活函數為 ReLU 的網絡。
    • 使用 torch.nn.init.kaiming_normal_torch.nn.init.kaiming_uniform_ 方法。

示例代碼

以下示例展示了如何使用這些初始化方法:

import torch
import torch.nn as nnclass SimpleModel(nn.Module):def __init__(self, input_dim, output_dim):super(SimpleModel, self).__init__()self.linear1 = nn.Linear(input_dim, 50)self.linear2 = nn.Linear(50, output_dim)self._initialize_weights()def _initialize_weights(self):# 正態分布初始化nn.init.normal_(self.linear1.weight, mean=0, std=0.01)nn.init.normal_(self.linear2.weight, mean=0, std=0.01)# 均勻分布初始化# nn.init.uniform_(self.linear1.weight, a=-0.01, b=0.01)# nn.init.uniform_(self.linear2.weight, a=-0.01, b=0.01)# Xavier 初始化# nn.init.xavier_normal_(self.linear1.weight)# nn.init.xavier_normal_(self.linear2.weight)# He 初始化# nn.init.kaiming_normal_(self.linear1.weight, nonlinearity='relu')# nn.init.kaiming_normal_(self.linear2.weight, nonlinearity='relu')# 偏置初始化為零nn.init.constant_(self.linear1.bias, 0)nn.init.constant_(self.linear2.bias, 0)def forward(self, x):x = torch.relu(self.linear1(x))x = self.linear2(x)return x# 初始化模型
input_dim = 10
output_dim = 1
model = SimpleModel(input_dim, output_dim)# 打印網絡每層參數
for name, param in model.named_parameters():print(f"Layer: {name} | Size: {param.size()} | Values: {param[:2]}\n")

說明

  1. 正態分布初始化:使用 nn.init.normal_ 方法將權重初始化為從正態分布中采樣的值。
  2. 均勻分布初始化:可以使用 nn.init.uniform_ 方法,將權重初始化為從均勻分布中采樣的值。
  3. Xavier 初始化:可以使用 nn.init.xavier_normal_nn.init.xavier_uniform_ 方法,根據輸入和輸出層的大小調整初始化值。
  4. He 初始化:可以使用 nn.init.kaiming_normal_nn.init.kaiming_uniform_ 方法,根據激活函數(如 ReLU)調整初始化值。
  5. 偏置初始化:將偏置初始化為零,使用 nn.init.constant_ 方法。

通過這些方法,您可以靈活地初始化神經網絡的權重,從而提高模型的訓練效果和收斂速度。如果您有更多問題或需要進一步的幫助,請告訴我!

模型默認初始化方法,會不會導致Loss為inf

在 PyTorch 中,如果不顯式設置權重初始化,模型層會使用默認的初始化方法。具體的默認初始化方法取決于層的類型。以下是一些常見層的默認初始化方法:

  1. 線性層 (nn.Linear)

    • 權重:使用均勻分布 U(-sqrt(k), sqrt(k)) 初始化,其中 k = 1 / input_features
    • 偏置:初始化為零。
  2. 卷積層 (nn.Conv2d)

    • 權重:使用均勻分布 U(-sqrt(k), sqrt(k)) 初始化,其中 k = 1 / (in_channels * kernel_size * kernel_size)
    • 偏置:初始化為零。

示例

以下示例展示了 PyTorch 默認的權重初始化方法:

import torch
import torch.nn as nnclass SimpleModel(nn.Module):def __init__(self, input_dim, output_dim):super(SimpleModel, self).__init__()self.linear1 = nn.Linear(input_dim, 50)self.linear2 = nn.Linear(50, output_dim)def forward(self, x):x = torch.relu(self.linear1(x))x = self.linear2(x)return x# 初始化模型
input_dim = 10
output_dim = 1
model = SimpleModel(input_dim, output_dim)# 打印網絡每層參數
for name, param in model.named_parameters():print(f"Layer: {name} | Size: {param.size()} | Values: {param[:2]}\n")

說明

  1. 線性層默認初始化:在上面的 SimpleModel 中,self.linear1self.linear2 的權重會默認使用均勻分布進行初始化,偏置初始化為零。

初始化權重導致 Loss 為 inf

權重初始化不當確實可能導致損失(loss)為 infNaN。常見原因包括:

  1. 權重過大:權重初始化值過大,導致前向傳播時激活值過大,從而在計算損失時產生溢出。
  2. 不適當的激活函數和初始化方法:例如,使用 ReLU 激活函數時,權重初始化值過大可能導致梯度爆炸。
  3. 數值不穩定:例如,在使用對數或指數運算時,輸入值過大可能導致數值溢出。

避免 Loss 為 inf 的建議

  1. 使用適當的初始化方法:根據激活函數選擇合適的權重初始化方法,例如使用 He 初始化與 ReLU 激活函數配合,使用 Xavier 初始化與 tanhsigmoid 激活函數配合。
  2. 梯度剪裁:在訓練過程中對梯度進行剪裁,防止梯度爆炸。
  3. 檢查輸入數據:確保輸入數據沒有異常值,例如過大的數值或缺失值(NaN)。
  4. 調整學習率:學習率過大也可能導致數值不穩定,可以嘗試減小學習率。

示例:檢查損失是否為 inf

import torch
import torch.nn as nn
import torch.optim as optimclass SimpleModel(nn.Module):def __init__(self, input_dim, output_dim):super(SimpleModel, self).__init__()self.linear1 = nn.Linear(input_dim, 50)self.linear2 = nn.Linear(50, output_dim)def forward(self, x):x = torch.relu(self.linear1(x))x = self.linear2(x)return x# 初始化模型
input_dim = 10
output_dim = 1
model = SimpleModel(input_dim, output_dim)# 定義損失函數和優化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 生成示例數據
x = torch.randn(16, input_dim)
y = torch.randn(16, output_dim)# 前向傳播
output = model(x)
loss = criterion(output, y)# 檢查損失是否為 inf
if torch.isinf(loss):print("Loss is infinite. Please check the initialization and input data.")
else:print(f"Loss: {loss.item()}")

通過這些方法,您可以確保模型的權重初始化適當,并避免損失為 inf 的情況。如果您有更多問題或需要進一步的幫助,請告訴我!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42343.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL 對一個經常有數據更新和刪除操作的表,怎樣優化以減少磁盤空間的占用?

文章目錄 一、定期清理不再需要的數據二、使用合適的數據類型三、壓縮數據四、刪除重復數據五、分區表六、索引優化七、碎片整理八、歸檔歷史數據九、監控和評估 在數據庫管理中,當面對一個經常進行數據更新和刪除操作的表時,磁盤空間的有效利用是一個重…

Pogo-DroneCANPWM模塊:可實現DroneCAN轉PWM,DroneCAN轉dshot,DroneCAN轉bdshot

關鍵詞:Ardupilot,Pixhawk,PWM,dshot,bdshot,DroneCANPWM,電調ESC,DroneCAN,UAVCAN,飛控,無人機,UAV Keywords:Ardupilot…

MSPM0G3507——OPENMV給M0傳數據(用數據包)互相通信(以循跡為例)

OPENMV端代碼 # main.py -- put your code here! import pyb, sensor, image, math, time from pyb import UART import ustruct from image import SEARCH_DS, SEARCH_EX import time import sensor, displayuart UART(3, 115200, bits8, parityNone, stop1, timeout_char10…

Scikit-learn高級教程:深入理解機器學習算法

目錄 引言Scikit-learn概述 什么是Scikit-learnScikit-learn的主要功能安裝和導入 數據預處理 數據加載數據清洗特征工程數據歸一化與標準化 監督學習算法 線性回歸邏輯回歸支持向量機決策樹與隨機森林k-近鄰算法樸素貝葉斯 無監督學習算法 K-means聚類層次聚類主成分分析&…

使用Redis進行分布式鎖時需要注意哪些問題?Redis分布式鎖的常見實現方式有哪些?

使用 Redis 進行分布式鎖時需要注意以下幾個問題: 鎖的過期時間設置:要合理設置鎖的過期時間,避免鎖因持有進程崩潰或網絡延遲等原因無法釋放,導致死鎖。原子性操作:獲取鎖和設置過期時間的操作需要保證原子性&#x…

C語言 猜測乒乓球隊比賽名單

兩個乒乓球隊進行比賽,各出三人,甲隊為A,B,C三人,乙隊為X ,Y ,Z三人,已抽簽決定比賽名單,有人向隊員打聽比賽的名單,A說他不和X比, C說他不和X&am…

計算機網絡性能指標概述:速率、帶寬、時延等

在計算機網絡中,性能指標是衡量網絡效率和質量的重要參數。本文將綜合三篇關于計算機網絡性能指標的文章,詳細介紹速率、帶寬、吞吐量、時延、時延帶寬積、往返時延(RTT) 和利用率的概念及其在網絡中的應用。 1. 速率(…

開源六軸協作機械臂myCobot280實現交互式乘法!讓學習充滿樂趣

本文經作者Fumitaka Kimizuka 授權我們翻譯和轉載。 原文鏈接:myCobotに「頷き」「首振り」「首傾げ」をしてもらう 🤖 - みかづきブログ?カスタム 引言 Fumitaka Kimizuka 創造了一個乘法表系統,幫助他的女兒享受學習乘法表的樂趣。她可以…

大語言模型基礎

大語言基礎 GPT : Improving Language Understanding by Generative Pre-Training 提出背景 從原始文本中有效學習的能力對于減輕自然語言處理中對監督學習的依賴至關重要。很多深度學習方法需要大量人工標注的數據,限制了它們在很多領域的應用,收集更…

cs231n作業2 雙層神經網絡

雙層神經網絡 我們選用ReLU函數和softmax函數: 步驟: 1、LOSS損失函數(前向傳播)與梯度(后向傳播)計算 Forward: 計算score,再根據score計算loss Backward:分別對W2、b2、W1、b1求…

學懂C#編程:WPF應用開發系列——WPF之ComboBox控件的詳細用法

WPF(Windows Presentation Foundation)中的ComboBox控件是一個下拉列表控件,允許用戶從一組預定義的選項中選擇一個選項。以下是ComboBox控件的詳細用法,并附帶示例說明。 ComboBox的基本用法 1. XAML定義: 在XAML中…

multisim中關于74ls192n和DSWPK開關仿真圖分析(減法計數器)

🏆本文收錄于「Bug調優」專欄,主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案,希望能夠助你一臂之力,幫你早日登頂實現財富自由🚀;同時,歡迎大家關注&&收藏&&…

直播預告 | VMware大規模遷移實戰,HyperMotion助力業務高效遷移

2006年核高基專項啟動,2022年國家79號文件要求2027年央國企100%完成信創改造……國家一系列信創改造政策的推動,讓服務器虛擬化軟件巨頭VMware在中國的市場份額迅速縮水。 加之VMware永久授權的取消和部分軟件組件銷售策略的變更,導致VMware…

開發一個HTTP模塊

開發一個HTTP模塊 HTTP模塊的數據結構ngx_module_t模塊的數據結構ngx_http_module_t數據結構ngx_command_s 數據結構 定義一個HTTP模塊處理用戶請求返回值獲取URI和參數方法名URIURL協議版本 獲取HTTP頭獲取HTTP包體 發送響應發送HTTP頭發送內存中的字符串作為包體返回一個Hell…

什么時候考慮將mysql數據遷移到ES?

文章目錄 對ES的一些疑問問題1:ES相比mysql本身有哪些優勢?問題2:哪些場景適合用ES而不是mysql?問題3:mysql逐行掃描,根據過濾條件檢查記錄中對應字段是否滿足要求屬于正排索引,根據二叉樹索引檢索記錄的方式屬于正排索引還是倒排…

SpringBoot整合DataX數據同步(自動生成job文件)

SpringBoot整合Datax數據同步 文章目錄 SpringBoot整合Datax數據同步1.簡介設計理念 DataX3.0框架設計DataX3.0核心架構核心模塊介紹DataX調度流程 2.DataX3.0插件體系3.數據同步1.編寫job的json文件2.進入bin目錄下,執行文件 4.SpringBoot整合DataX生成Job文件并執…

生產力工具|VS Code安裝及使用指南

一、VS Code介紹 (一)軟件介紹 Visual Studio Code(簡稱VS Code)是由Microsoft開發的免費開源代碼編輯器,適用于Windows、macOS和Linux操作系統。它支持多種編程語言,如JavaScript、Python、C等&#xff0…

知識社區在線提問小程序模板源碼

藍色的知識問答,問答交流,知識社區,在線提問手機app小程序網頁模板。包含:社區主頁、提問、我的、綁定手機,實名認證等。 知識社區在線提問小程序模板源碼

ubuntu 檢查硬盤的通電時長、健康度

ubuntu 檢查硬盤的通電時長、健康度 在Ubuntu系統中,檢查硬盤的通電時長和健康度通常需要使用SMART(Self-Monitoring, Analysis, and Reporting Technology)工具。SMART是硬盤制造商內置的一套硬盤保護技術,用于監控硬盤的健康狀況…

品質至上!中國星坤連接器的發展之道!

在電子連接技術領域,中國星坤以其卓越的創新能力和對品質的不懈追求,贏得了業界的廣泛認可。憑借在高精度連接器設計和制造上的領先地位,星坤不僅獲得了多項實用新型專利,更通過一系列國際質量管理體系認證,彰顯了其產…