Pytorch基礎(九)——損失函數

一、概念

損失函數在深度學習領域是用來計算搭建模型預測的輸出值和真實值之間的誤差。
具體實現過程:在一個批次(batch)前向傳播完成后,得到預測值,然后損失函數計算出預測值和真實值之間的差值,反向傳播去更新權值和偏置等參數,以降低差值,不斷向真實值接近,最終得到效果良好的模型。
常見的損失函數包括:MSE(均方差, 也可以叫L2Loss),Cross Entropy Loss(交叉熵),L1 Loss(L1平均絕對值誤差),Smooth L1 Loss(平滑的L1 loss),BCELoss (Binary Cross Entropy)等。下面分別對這些損失函數舉例說明。
只寫了一部分,后面陸續增加。。

二、Pytorch舉例

2.1 MSELoss

MSELoss 就是計算真實值和預測值的均方差,也可以叫L2 Loss。
特點:MSE收斂速度比較快,能提供最大似然估計,是回歸問題、模式識別、圖像處理中最常使用的損失函數。
在這里插入圖片描述

import torch
from torch import nn
from torch.nn import MSELossinputs = torch.tensor([1, 2, 3], dtype=torch.float32)
outputs = torch.tensor([2, 2, 4], dtype=torch.float32)# MSE
# size_average為True,表示計算批前向傳播后損失函數的平均值,如果為False,則計算損失函數的和。
# 同樣,reduce為True,返回標量;reduce為False, size_average參數失效,直接返回向量形式的loss
# reduction目的為減少tensor中元素的數量。為none,表示不減少;為'sum',表示求和;為'mean',表示求平均值loss_mse = nn.MSELoss()
result_mse = loss_mse(inputs, outputs)
print(result_mse)loss_mse1 = nn.MSELoss(reduction='sum')
result_mse1 = loss_mse1(inputs, outputs)
print(result_mse1)loss_mse2 = nn.MSELoss(size_average=False, reduce=False, reduction='sum')
result_mse2 = loss_mse2(inputs, outputs)
print(result_mse2)

輸出

tensor(0.6667)
tensor(2.)
tensor([1., 0., 1.])

2.2 L1Loss

L1Loss是計算預測值和真實值的平均絕對誤差。
特點:對異常點的魯棒性更強,但在殘差為零處不可導,收斂速度比較慢。在這里插入圖片描述

loss_l1 = L1Loss()
result_l1 = loss_l1(inputs, outputs)
print(result_l1)
tensor(0.6667)

2.3 SmoothL1loss

SmoothL1loss是L1Loss 和MSE的混合,最早在Fast R-CNN中提出。
特點:收斂速度穩定,模型更容易收斂到局部最優,防止梯度爆炸。
在這里插入圖片描述

# beta默認為1,表示指定要在L1和L2損失之間更改的閾值。
loss_smol1 = SmoothL1Loss()
result_smol1 = loss_smol1(inputs, outputs)
print(result_smol1)
tensor(0.3333)

2.4 CrossEntropyLoss

CrossEntropyLoss表示概率分布之間的距離,當交叉熵越小說明二者之間越接近,對于高維輸入比較有用。一般都需要激活函數將輸入轉變為(0,1)之間。
經典公式:
在這里插入圖片描述
其實這個表示BCELoss(二分類交叉熵)。

pytorch的公式表示的是多分類問題:
1)當目標targets 包括類索引,ignore_index才可以設置.
在這里插入圖片描述
2)表示每個類別的概率;當每個小批項目需要超過單個類別的標簽時非常有用,例如混合標簽、標簽平滑等。
在這里插入圖片描述
其中: x為輸入值,y為目標值,C代表類別數量,w為權值參數。

# weight :為每個類指定的手動重縮放權重。
# ignore_index:ignore_index表示指定忽略目標值,但不影響輸入梯度。
# label_smoothing :在[0.0,1.0]之間的浮點型。指定計算損失時的平滑量,其中 0.0 表示不平滑。 如重新思考計算機視覺的初始架構中所述,目標成為原始基本事實和均勻分布的混合。 
# 交叉熵損失
x = torch.tensor([0.5, 0.2, 0.3])
x = torch.reshape(x, (1, 3))
print(x)
y = torch.tensor([1])loss_cross = CrossEntropyLoss()
result_cross = loss_cross(x, y)
print(result_cross)
tensor([[0.5000, 0.2000, 0.3000]])
tensor(1.2398)

三、參考文章

目標檢測回歸損失函數簡介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss
損失函數(八)

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

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

相關文章

用程序猿思維、程序設計師思維兩種方式寫求斐波那契數列的方法。

//用Java實現斐波那契數列(Fibonacci) public class Test {public int f(int n)//n代表第幾個數字。程序返回它相應的值{return n>2?f(n-1)f(n-2):1;//看似如此優雅的一句程序}//程序設計師的思維:會重構上面的代碼。讓他們更易讀。推薦!&#xff01…

【圖像處理】——圖像的差集、并集、補集、交集以及兩個圖像相減出現負數的處理方法

目錄 目錄 1、交集 2、差集 3、并集 4、補集 5、差為負值,和超過255的解決辦法

Pytorch基礎(十)——優化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念 Pytorch中優化器的目的:將損失函數計算出的差值Loss減小。 優化過程:優化器計算網絡參數的梯度,然后使用一定的算法策略來對參數進行計算,用新的參數來重新進行訓練,最終降低Loss。 其中官網提供了13種優化算…

【圖像處理】——改變圖像的大小(降采樣重采樣)下采樣和上采樣

轉載自:https://jingyan.baidu.com/article/a3a3f81139be1f8da2eb8ade.html 上采樣、下采樣和金字塔加速參考:https://blog.csdn.net/Eastmount/article/details/89341077 目錄 1、拉伸圖片——重采樣 2、縮小圖片 1)三次插值法cv2.INTER_CUBIC

一段代碼到可執行程序所有經歷

如果你寫的代碼是hello.c,你的程序將經歷下面的步驟到達硬盤或者內存成為可執行文件。 第一步:hello.c(文本)經過預編譯生成hello.i(文本) 第二步:hello.i(文本)經過編譯…

js獲取url參數值

今天碰到要在一個頁面獲取另外一個頁面url傳過來的參數,一開始很本能的想到了用 split("?")這樣一步步的分解出需要的參數。 后來想了一下,肯定會有更加簡單的方法的!所以在網上找到了兩個很又簡單實用的方法,mark下 方…

[PyCharm]unindent does not match any outer indentation level解決方法

轉載:https://www.jianshu.com/p/b34f30717eb2 問題出現原因 1、代碼前后縮進量不一致 2、tab和space混用(如果一段代碼既使用space又使用tab進行縮進,會發生錯誤,這個時候PyCharm會自動進行判斷,根據設置的預先縮進…

為什么要選擇Apache Pulsar(二)

這是介紹Apache Pulsar關鍵特性系列文章的第二篇。Pulsar是由Yahoo開發并開源的下一代發布訂閱消息系統。在第一篇文章里,我們介紹了Pulsar對消息模型的靈活支持、多租戶、多地域復制和持久性。在這一篇文章里,我們將繼續介紹Pulsar的IO隔離機制、伸縮性…

Yolov5目標檢測模型運行遇到的相關問題匯總

一、yolov5-5.0常見錯誤 1. pycocotools工具包無法安裝 具體報錯如下: requirements: pycocotools>2.0 not found and is required by YOLOv5 pkg_resources.DistributionNotFound: The pycocotools>2.0 distribution was not found and is required by th…

PHP反射之類的反射

最近在琢磨如何用PHP實現站點的插件功能,需要用到反射,于是現學了一下,筆記如下: class Person {public $name Lily;public $gender male;public $age 20;public function eat(){echo Lily is eating!;}public function run(){…

數據結構(復習)--------關于平衡二叉樹(轉載)

在上一個專題中,我們在談論二叉查找樹的效率的時候。不同結構的二叉查找樹,查找效率有很大的不同(單支樹結構的查找效率退化成了順序查找)。如何解決這個問題呢?關鍵在于如何最大限度的減小樹的深度。正是基于這個想法…

mysql外鍵

效果 a,b,c 如果c設置到a的外鍵,那么只能在刪除c的記錄后,才能刪除a的記錄。 https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails CREATE TABLE IF NOT EXISTS advertisers ( adverti…

C++總結筆記(一)—— 基礎知識匯總

很長時間沒有再復習C的基礎知識&#xff0c;現在將一些容易遺忘的知識點做一個簡單的匯總。 1、注釋 ??分為單行注釋和多行注釋 //cout<<endl;/*int i1;cout<<i<<endl;*/2、常量 ??宏常量&#xff1a;#define &#xff0c;宏常量沒有類型&#xff0c;…

微軟自帶iscsi客戶端對iqn的要求

節點名稱&#xff1a;Microsoft iSCSI 發起程序嚴格遵守為 iSCSI 節點名稱指定的規則。這些規則也適用于 Microsoft iSCSI 發起程序節點名稱以及發現的任何目標節點名稱。構建 iSCSI 節點名稱的規則&#xff08;如 iSCSI 規范以及“iSCSI 名稱的字符串配置文件”Internet 草稿中…

【Python數據結構】——鏈表

僅僅為了記錄 # 定義一個類&#xff0c;用于創建鏈表的結點 class LNode():def __init__(self,elem,next_ None):# 類的初始化方法,在實例化類的時候會自動調用self.elem elemself.next next_list1 LNode(1)# 類的實例化&#xff0c;LNode(1)為第一個鏈表結點&#xff0c;…

天貓雙11憑什么達到1682億?這些支撐技術或許可以告訴你

歷年「雙 11」都會掀起一股買買買的購物熱潮 阿里巴巴將這個原本普通的日子賦予了非凡的意義 今年&#xff0c;天貓以 1682 億的成交額再破記錄 而在這一系列瘋狂“秒殺”動作的背后 有一個叫云化架構的技術體系支撐著十幾億人的消費狂歡 12 月 8 日 ArchSummit 阿里技術專場 來…

PageLayoutControl的基本操作

整理了下對PageLayoutControl的基本功能操作 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071…

C++總結筆記(二)——指針

一、概念 1.1 指針的原理 找到一個比較精練的概述指針原理的句子&#xff1a; 指針變量就是在內存中保存變量的地址&#xff0c;然后通過地址來訪問數據。 int a 1; int* p &a; cout << p << endl;009DFEB4可以知道變量p在內存中的值就是a的地址&#xff…

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag

Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag轉載于:https://www.cnblogs.com/zhujiabin/p/5085688.html