嵌入式學習-土堆PyTorch(7)-day23

損失函數的調用

import torch
from torch import nn
from torch.nn import L1Lossinputs = torch.tensor([1.0,2.0,3.0])
target = torch.tensor([1.0,2.0,5.0])inputs = torch.reshape(inputs, (1, 1, 1, 3))
target = torch.reshape(target, (1, 1, 1, 3))
#損失函數
loss = L1Loss(reduction='sum')
#MSELoss均值方差
loss_mse = nn.MSELoss()
result1 = loss(inputs, target)
result2 = loss_mse(inputs, target)
print(result1, result2)

?實際應用

import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2ddataset = torchvision.datasets.CIFAR10(root='./data_CIF', train=False, download=True, transform=torchvision.transforms.ToTensor())
dataloader = torch.utils.data.DataLoader(dataset, batch_size=1)class Tudui(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2)self.maxpool1 = nn.MaxPool2d(kernel_size=2)self.conv2 = nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2)self.maxpool2 = nn.MaxPool2d(kernel_size=2)self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2)self.maxpool3 = nn.MaxPool2d(kernel_size=2)self.flatten = nn.Flatten()self.linear1 = nn.Linear(in_features=1024, out_features=64)self.linear2 = nn.Linear(in_features=64, out_features=10)self.model1 = nn.Sequential(Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),nn.MaxPool2d(kernel_size=2),nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),nn.MaxPool2d(kernel_size=2),nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),nn.MaxPool2d(kernel_size=2),nn.Flatten(),nn.Linear(in_features=1024, out_features=64),nn.Linear(in_features=64, out_features=10))def forward(self, x):x = self.model1(x)return x
loss = nn.CrossEntropyLoss()
tudui = Tudui()
for data in dataloader:imgs,targets = dataoutputs = tudui(imgs)result1 = loss(outputs, targets)print(result1)#反向傳播result1.backward()#梯度grad會改變,從而通過grad來降低loss

torch.nn.CrossEntropyLoss?

🧩 CrossEntropyLoss 是什么?

本質上是:

Softmax + NLLLoss(負對數似然) 的組合。

公式:

\text{Loss} = - \sum_{i} y_i \log(\hat{p}_i)

  • \hat{p}_i?:模型預測的概率(通過 softmax 得到)

  • y_i?:真實類別的 one-hot 標簽

PyTorch 不需要你手動做 softmax,它會直接從 logits(未經過 softmax 的原始輸出)算起,防止數值不穩定。


🏷? 常用參數

torch.nn.CrossEntropyLoss(weight=None, ignore_index=-100, reduction='mean')

參數含義
weight給不同類別加權(處理類別不均衡)
ignore_index忽略某個類別(常見于 NLP 的 padding)
reductionmean(默認平均)、sum(求和)、none(逐個樣本返回 loss)


🎨 最小使用例子

import torch
import torch.nn as nncriterion = nn.CrossEntropyLoss()# 假設 batch_size=3, num_classes=5
outputs = torch.tensor([[1.0, 2.0, 0.5, -1.0, 0.0],[0.1, -0.2, 2.3, 0.7, 1.8],[2.0, 0.1, 0.0, 1.0, 0.5]])  # logits
labels = torch.tensor([1, 2, 0])  # 真實類別索引loss = criterion(outputs, labels)
print(loss.item())
  • outputs:模型輸出 logits,不需要 softmax;

  • labels:真實類別(索引型),如 0, 1, 2,...

  • loss.item():輸出標量值。


💡 你需要注意:

?? 重點📌 說明
logits 直接輸入不要提前做 softmax
label 是類別索引不是 one-hot,而是整數(如 [1, 3, 0]
自動求 batch 平均默認 reduction='mean'
多分類用它最合適二分類也能用,但 BCEWithLogitsLoss 更常見


🎁 總結

優點缺點
? 簡單強大,適合分類? 不適合回歸任務
? 內置 softmax + log? label 不能是 one-hot
? 數值穩定性強? 類別極度不均衡需額外加 weight


🎯 一句話總結

CrossEntropyLoss 是深度學習中分類問題的“首選痛點衡量尺”,幫你用“正確標簽”去教訓“錯誤預測”,模型越聰明 loss 越小。

?公式:

?

1?? 第一部分:

- \log \left( \frac{\exp(x[\text{class}])}{\sum_j \exp(x[j])} \right)

這是經典 負對數似然(Negative Log-Likelihood):

  • 分子:你模型對正確類別 class 輸出的得分(logits),取 exp;

  • 分母:所有類別的 logits 做 softmax 歸一化;

  • 再取負 log —— 意思是“你對正確答案預測得越自信,loss 越小”。


2?? 推導為:

= - x[\text{class}] + \log \left( \sum_j \exp(x[j]) \right)

log(a/b) = log(a) - log(b) 的變形:

  • - x[\text{class}]:你對正確類輸出的分值直接扣掉;

  • +\log(\sum_j \exp(x[j])):對所有類別的總分值做歸一化。

這是交叉熵公式最常用的“log-sum-exp”形式。


📌 為什么這么寫?

  • 避免直接用 softmax(softmax+log 合并后可以避免數值不穩定 🚀)

  • 計算量更高效(框架底層可以優化)


🌟 直觀理解:

場景解釋
正確類分數高x[\text{class}]越大,loss 越小
錯誤類分數高\sum \exp(x[j])越大,loss 越大
目標壓低 log-sum-exp,拉高正確類別 logits

🎯 一句話總結:

交叉熵 = “扣掉正確答案得分” + “對所有類別歸一化”,越接近正確答案,loss 越小。
這就是你訓練神經網絡時 模型越來越聰明的數學依據 😎

舉例:

logits = torch.tensor([1.0, 2.0, 0.1])  # 模型輸出 (C=3)
label = torch.tensor([1])  # 真實類別索引 = 1

其中:

  • N=1(batch size)

  • C=3(類別數)

  • 正確類別是索引1,對應第二個值:2.0

🎁 完整公式回顧

\text{loss}(x, y) = -x[y] + \log \sum_{j} \exp(x[j])


🟣 第一步:Softmax + log 邏輯

softmax 本質上是:

p = \frac{\exp(x[\text{class}])}{\sum_j \exp(x[j])}

但是 PyTorch 的 CrossEntropyLoss 內部直接用:

\text{loss} = - \log p


🧮 你這個例子手動算:

logits = [1.0, 2.0, 0.1],class = 1,對應 logit = 2.0

第一部分:

- x[\text{class}] = -2.0

第二部分:

\log \sum_{j=1}^{3} \exp(x[j]) = \log (\exp(1.0) + \exp(2.0) + \exp(0.1))

先算:

  • exp(1.0)≈2.718

  • exp(2.0)≈7.389

  • exp(0.1)≈1.105

加起來:

∑=2.718+7.389+1.105=11.212

取對數:

log?(11.212)≈2.418

最終 loss:

loss=?2.0+2.418=0.418

🌟 你可以這樣理解

部分含義
?x[class]- x[\text{class}]?x[class]懲罰正確答案打分太低
log?∑exp?(x)\log \sum \exp(x)log∑exp(x)考慮所有類別的對比,如果錯誤類別打分高也被懲罰
最終目標“提升正確答案打分、降低錯誤答案打分”

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

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

相關文章

【2025最新】使用neo4j實現GraphRAG所需的向量檢索

學習筆記,比較混亂,介意慎點。 背景 在將UMLS或者LightRAG構造的數據庫存入neo4j之后,我開始將知識圖譜運用到實際場景的使用中、例如查詢、推理。然而,由于字符串匹配導致大量術語在檢索時出現缺失。導致檢索效果不佳。我們需要…

【AI深究】隨機森林(Random Forest)全網最詳細全流程詳解與案例(附Python代碼演示)|集成學習|數學原理、案例流程、代碼演示及結果解讀|參數與調優、工程啟示、單棵決策樹的對比、優缺點

大家好,我是愛醬。本篇將會系統地講解隨機森林(Random Forest)的原理、核心思想、數學表達、算法流程、代碼實現與工程應用。內容適合初學者和進階讀者,配合公式和可視化示例。 注:本文章含大量數學算式、詳細例子說明…

6.String、StringBuffer、StringBuilder區別及使用場景

String固定長度,引用的字符串內容無法改變例如,String s abc;s def;那么 s 字符串對應的地址已經改變了StringBuider 聲明一個對象時,指向堆中的一塊空間,包括兩個屬性 value 和 count其中 value 屬性類似動態數組,可…

Qualcomm Linux 藍牙指南學習--驗證 Fluoride 協議棧的功能(2)

前言 Qualcomm Technologies推出的Linux藍牙指南詳細介紹了基于Qualcomm RB3 Gen 2和IQ-9100 Beta開發套件的藍牙解決方案。該文檔涵蓋BlueZ和Fluoride協議棧的功能驗證流程,支持藍牙5.2核心規范,包括WCN6750/WCN6856/QCA6698AQ芯片組的特性。主要內容分為三部分: ?1. 功…

Spring Boot中REST與gRPC并存架構設計與性能優化實踐指南

Spring Boot中REST與gRPC并存架構設計與性能優化實踐指南 在微服務架構日益復雜的當下,單一協議往往難以滿足高并發低延遲與生態兼容的雙重需求。本文基于真實生產環境的項目經驗,分享了如何在Spring Boot中同時提供RESTful API和gRPC接口的架構設計、性…

Simulink仿真-model Setting關鍵配置

1.概述 Simulink 的仿真設置(Model Settings)是確保仿真準確性的關鍵配置,主要包括仿真時間、步長、解法器選擇等核心參數的設定。 ?可以通過快捷鍵?CtrlE?打開仿真設置界面2.核心參數 2.1 求解器Solver配置 時間范圍:設置仿真…

內網與外網是通過什么進行傳輸的?內外網文件傳輸的安全方法

在當前企業信息化建設日益深入的背景下,出于安全防護與合規管理的需要,很多單位將網絡劃分為內網(辦公網/生產網)與外網(互聯網/DMZ區)。這種網絡隔離策略雖然提升了安全性,但也帶來了內外網文件…

RabbitMQ面試精講 Day 4:Queue屬性與消息特性

【RabbitMQ面試精講 Day 4】Queue屬性與消息特性 開篇 歡迎來到"RabbitMQ面試精講"系列的第4天!今天我們將深入探討RabbitMQ中Queue的屬性配置與消息特性,這是理解和優化RabbitMQ使用的關鍵知識點。掌握這些內容不僅能幫助你在面試中展現深厚…

uniapp vue3 vite項目使用微信云開發(云函數)

1、在根目錄新建文件夾 cloudfunctions2、配置 manifest.json在項目根目錄的 manifest.json 文件中,找到微信小程序配置部分,添加 cloudfunctionRoot 字段,指向你的云函數目錄:{"mp-weixin": {"cloudfunctionRoot&…

AK視頻下載工具:免費高效,多平臺支持

近期小編又發現了一款更強大的新神器——AK視頻下載(電腦版),一起來了解下吧~ 軟件亮點 完全免費,無需安裝,操作便捷,直接打開即可使用。 支持多平臺視頻下載,包括抖音、B站、小紅書、快手等主…

7月21日星期一今日早報簡報微語報早讀

7月21日星期一,農歷六月廿七,早報#微語早讀。1、廣東佛山累計報告基孔肯雅熱確診病例1873例,均為輕癥;2、祝賀!石宇奇奪得日本羽毛球公開賽男單冠軍;3、中國和匈牙利順利完成引渡條約談判;4、科…

基于Milvus Lite的輕量級向量數據庫實戰指南

一、為什么選擇Milvus Lite? 在人工智能和語義搜索應用中,高效的向量檢索是核心需求。相比需要部署Docker的完整版Milvus,Milvus Lite提供: 零依賴:純Python實現,無需安裝Docker或外部組件 開箱即用&…

深度學習時代下的社交媒體情感分析:方法、工具與未來挑戰

摘要:基于Yue等學者2019年發表的權威綜述,本文系統總結情感分析的技術框架、實戰資源與前沿方向,附Python代碼示例。 一、情感分析為何重要? 情感分析(Sentiment Analysis)旨在從文本中提取主觀態度&…

Spring Boot 3.0新特性全面解析與實戰應用

Spring Boot 3.0新特性全面解析與實戰應用 引言 Spring Boot 3.0作為Spring生態系統的一個重要里程碑,帶來了眾多令人興奮的新特性和改進。本文將深入解析Spring Boot 3.0的核心變化,并通過實戰示例展示如何在項目中應用這些新特性。 核心變化概覽 Java版…

C# sqlsugar 主子表 聯合顯示 LeftJoin

在C#中使用SqlSugar ORM進行Left Join操作是一種常見需求,尤其是在處理復雜數據庫查詢時。SqlSugar是一個輕量級、高性能的ORM框架,支持多種數據庫。下面是如何使用SqlSugar進行Left Join操作的示例。1. 安裝SqlSugar首先,確保你的項目中已經…

【ROS1】08-ROS通信機制——服務通信

目錄 一、概念 二、何時使用服務 三、話題通信與服務通信的區別 四、案例 4.1 C實現 4.1.1 服務端 4.1.2 客戶端 4.1.3 測試執行 4.2 Python實現 4.2.1 服務端 4.2.2 客戶端 4.2.3 客戶端優化——動態傳參 4.2.4 客戶端優化——等待服務端啟動后再發起請求 一、概…

45.sentinel自定義異常

上文提到Blocked by Sentinel(flow limits) 限流異常,這樣返給用戶就不太友好,所以需要自定義異常。 默認情況下,發生限流、降級、授權攔截時,都會拋出異常到調用方。如果要自定義異常時的返回結果,需要實現BlockExceptionHandler接口: BlockException有很多子類: pac…

f4硬件配置spi

f4型號是stm32f407zgt6用spi來進行MOSI,主機發送從機接收時鐘頻率設置為1MHzMOSI為PC3,SCK為PB10,CS設置為output->PB12時鐘配置如下:波特率計算公式為:128M/(4*Prescaler) 要讓波特率為1M,10…

Redis的持久化-RDB

1.持久化一提到持久化,我們就會第一時間聯想到M有SQL的事務,MySQL事務有四個比較核心的特征:原子性(把多個操作打包成一個整體),一致性(事務執行之前和之后,數據都不能離譜&#xff…

前端內存泄漏

個人簡介 👀個人主頁: 前端雜貨鋪 🙋?♂?學習方向: 主攻前端方向,正逐漸往全干發展 📃個人狀態: 研發工程師,現效力于中國工業軟件事業 🚀人生格言: 積跬步…