底层视觉及图像增强-项目实践理论补充(十六-0-(34):交叉熵损失函数与软件思维的联系):从奥运大屏到手机小屏,快来挖一挖里面都有什么
-
- [🎯 第一阶段:建立直觉理解](#🎯 第一阶段:建立直觉理解)
-
- [1.1 用考试评分理解交叉熵](#1.1 用考试评分理解交叉熵)
- [🔬 第二阶段:数学原理深度解析(1小时)](#🔬 第二阶段:数学原理深度解析(1小时))
-
- [2.1 从软件开发理解交叉熵](#2.1 从软件开发理解交叉熵)
-
- [2.1.1 信息量:惊讶程度的度量](#2.1.1 信息量:惊讶程度的度量)
- [2.1.2 熵:平均惊讶程度](#2.1.2 熵:平均惊讶程度)
- [2.2 交叉熵的数学定义](#2.2 交叉熵的数学定义)
-
- [2.2.1 核心公式解析](#2.2.1 核心公式解析)
- [2.2.2 具体计算例子](#2.2.2 具体计算例子)
- [2.3 交叉熵的梯度特性](#2.3 交叉熵的梯度特性)
-
- [2.3.1 为什么交叉熵训练效果好?](#2.3.1 为什么交叉熵训练效果好?)
- [🛠️ 第三阶段:在深度学习中的应用](#🛠️ 第三阶段:在深度学习中的应用)
-
- [3.1 Softmax + 交叉熵的黄金组合](#3.1 Softmax + 交叉熵的黄金组合)
-
- [3.1.1 Softmax:把分数变成概率](#3.1.1 Softmax:把分数变成概率)
- [3.1.2 完整的分类流程](#3.1.2 完整的分类流程)
- [3.2 PyTorch中的实现](#3.2 PyTorch中的实现)
-
- [3.2.1 三种使用方式](#3.2.1 三种使用方式)
- [3.2.2 在LED项目中的应用](#3.2.2 在LED项目中的应用)
- [📊 第四阶段:可视化理解(30分钟)](#📊 第四阶段:可视化理解(30分钟))
-
- [4.1 交叉熵损失函数曲线](#4.1 交叉熵损失函数曲线)
- [4.2 与其他损失函数的对比](#4.2 与其他损失函数的对比)
- [🎯 第五阶段:](#🎯 第五阶段:)
-
- [5.1 技术原理类](#5.1 技术原理类)
- [5.2 工程实践类问题](#5.2 工程实践类问题)
代码仓库入口:
- 源码地址。
系列文章规划:
- 第一章节:底层视觉及图像增强-项目实践(十六-1:Real-ESRGAN在LED显示画质增强上的实战:从数据构建到模型微调):从奥运大屏,到手机小屏,快来挖一挖里面都有什么
第二章节:底层视觉及图像增强-项目实践<十六-2,谈些虚虚的,项目咋做?论文看哪些点?有哪些好工具能用?>(从LED显示问题到非LED领域影像画质优化):从LED大屏,到手机小屏,快来挖一挖里面都有什么
巨人的肩膀:
🎯 第一阶段:建立直觉理解
1.1 用考试评分理解交叉熵
传统评分(准确率):
学生答案: [A, B, C]
标准答案: [A, B, C]
得分: 3/3 = 100% ✅
学生答案: [A, B, D]
标准答案: [A, B, C]
得分: 2/3 = 67% ❌
交叉熵评分(更聪明的老师):
学生1:
- 第3题:选C的概率=0.9,选D的概率=0.1
- 标准答案是C
- 得分:-log(0.9) = 0.1(很好!)
学生2:
- 第3题:选C的概率=0.6,选D的概率=0.4
- 标准答案是C
- 得分:-log(0.6) = 0.51(一般)
学生3:
- 第3题:选C的概率=0.1,选D的概率=0.9
- 标准答案是C
- 得分:-log(0.1) = 2.3(很差!)
一句话说清交叉熵:
"交叉熵是衡量AI模型的'自信程度'与'实际情况'差异的损失函数 - 不仅要答对,还要自信地答对!"
🔬 第二阶段:数学原理深度解析(1小时)
2.1 从软件开发理解交叉熵
2.1.1 信息量:惊讶程度的度量
python
# 用调试bug理解信息量
def 计算信息量(事件概率):
"""
事件越不可能发生,发生时带来的信息量(惊讶程度)越大
"""
return -log(事件概率)
# 例子:
调试简单bug概率 = 0.9 # 信息量 = -log(0.9) ≈ 0.1 (不太惊讶)
调试复杂bug概率 = 0.1 # 信息量 = -log(0.1) ≈ 2.3 (很惊讶!)
2.1.2 熵:平均惊讶程度
python
class 项目复杂度评估:
def 计算熵(各种bug的概率分布):
"""
熵 = 平均信息量
表示系统的不确定性程度
"""
总熵 = 0
for bug概率 in bug概率分布:
总熵 += bug概率 * 计算信息量(bug概率)
return 总熵
# 例子:
简单项目 = [0.9, 0.1] # 熵 ≈ 0.47 (比较确定)
复杂项目 = [0.5, 0.5] # 熵 ≈ 0.69 (很不确定)
2.2 交叉熵的数学定义
2.2.1 核心公式解析
python
def 交叉熵(真实分布P, 预测分布Q):
"""
交叉熵 H(P, Q) = -Σ P(x) * log(Q(x))
物理意义:使用预测分布Q来编码真实分布P所需的平均比特数
"""
损失 = 0
for i in range(len(真实分布P)):
if 真实分布P[i] == 1: # 对于分类问题,真实分布是one-hot
损失 += -log(预测分布Q[i])
return 损失
2.2.2 具体计算例子
python
# 三分类问题例子
真实标签 = [1, 0, 0] # 属于第0类
预测概率 = [0.7, 0.2, 0.1] # 模型认为属于第0类的概率是0.7
交叉熵损失 = - (1 * log(0.7) + 0 * log(0.2) + 0 * log(0.1))
= -log(0.7) ≈ 0.357
# 如果预测更准确:
预测概率2 = [0.9, 0.05, 0.05]
交叉熵损失2 = -log(0.9) ≈ 0.105 # 损失更小!
# 如果预测错误:
预测概率3 = [0.1, 0.8, 0.1]
交叉熵损失3 = -log(0.1) ≈ 2.3 # 损失很大!
2.3 交叉熵的梯度特性
2.3.1 为什么交叉熵训练效果好?
python
class 梯度分析:
def 传统均方误差梯度(预测概率, 真实标签):
"""MSE的梯度比较平缓,训练慢"""
梯度 = 2 * (预测概率 - 真实标签) * 预测概率 * (1 - 预测概率)
return 梯度
def 交叉熵梯度(预测概率, 真实标签):
"""交叉熵的梯度更陡峭,训练快"""
梯度 = 预测概率 - 真实标签 # 简单直接!
return 梯度
# 例子:当预测概率=0.1,真实标签=1
MSE梯度 = 2*(0.1-1)*0.1*0.9 = -0.162
交叉熵梯度 = 0.1 - 1 = -0.9 # 梯度更大,收敛更快!
🛠️ 第三阶段:在深度学习中的应用
3.1 Softmax + 交叉熵的黄金组合
3.1.1 Softmax:把分数变成概率
python
import numpy as np
def softmax(原始分数):
"""
将神经网络的原始输出转换为概率分布
保证:所有概率之和为1,每个概率在0-1之间
"""
# 减去最大值避免数值不稳定
稳定分数 = 原始分数 - np.max(原始分数)
指数分数 = np.exp(稳定分数)
概率分布 = 指数分数 / np.sum(指数分数)
return 概率分布
# 例子:
原始输出 = [2.0, 1.0, 0.1]
概率分布 = softmax(原始输出) # [0.659, 0.242, 0.099] 总和=1
3.1.2 完整的分类流程
python
class 分类网络:
def 前向传播(输入图像):
# 1. 神经网络计算原始分数
原始分数 = 神经网络(输入图像) # 例如: [3.2, 1.3, -2.1]
# 2. Softmax转换为概率
预测概率 = softmax(原始分数) # 例如: [0.875, 0.118, 0.007]
# 3. 计算交叉熵损失
损失 = 交叉熵损失(预测概率, 真实标签)
return 预测概率, 损失
def 反向传播(预测概率, 真实标签):
# 交叉熵的梯度计算非常简单!
梯度 = 预测概率 - 真实标签 # 这就是为什么训练快的原因
return 梯度
3.2 PyTorch中的实现
3.2.1 三种使用方式
python
import torch
import torch.nn as nn
# 方式1:分开使用 Softmax + CrossEntropy
def 方式1_分开实现(模型输出, 真实标签):
# 模型输出: [batch_size, num_classes] 原始分数
# 真实标签: [batch_size] 类别索引(0,1,2...)
# 手动计算
probabilities = torch.softmax(模型输出, dim=1)
loss = -torch.log(probabilities[range(len(真实标签)), 真实标签]).mean()
return loss
# 方式2:使用PyTorch的CrossEntropyLoss(推荐!)
def 方式2_官方实现(模型输出, 真实标签):
criterion = nn.CrossEntropyLoss()
loss = criterion(模型输出, 真实标签) # 内部自动做softmax
return loss
# 方式3:带权重的交叉熵(处理类别不平衡)
def 方式3_带权重(模型输出, 真实标签, 类别权重):
# 对于LED缺陷检测:坏点样本少,给予更高权重
weights = torch.tensor([1.0, 2.0, 2.0, 3.0, 3.0]) # 背景,偏色,跳灰,过曝,坏点
criterion = nn.CrossEntropyLoss(weight=weights)
loss = criterion(模型输出, 真实标签)
return loss
3.2.2 在LED项目中的应用
python
class LED缺陷检测损失函数:
def __init__(self):
# LED缺陷类别:背景, 偏色, 跳灰, 过曝, 坏点
# 坏点和过曝样本较少,需要更高权重
self.weights = torch.tensor([1.0, 1.5, 1.5, 2.0, 3.0])
self.criterion = nn.CrossEntropyLoss(weight=self.weights)
def __call__(self, 预测结果, 真实标注):
"""
预测结果: [batch, 5, height, width] - 5个类别的原始分数
真实标注: [batch, height, width] - 每个像素的类别索引(0-4)
"""
# 调整维度以适应CrossEntropyLoss
batch, classes, h, w = 预测结果.shape
预测扁平 = 预测结果.view(batch, classes, -1) # [batch, 5, h*w]
标注扁平 = 真实标注.view(batch, -1) # [batch, h*w]
loss = self.criterion(预测扁平, 标注扁平)
return loss
📊 第四阶段:可视化理解(30分钟)
4.1 交叉熵损失函数曲线
python
import matplotlib.pyplot as plt
import numpy as np
# 可视化交叉熵损失
def 可视化交叉熵():
预测概率 = np.linspace(0.01, 0.99, 100)
交叉熵损失 = -np.log(预测概率)
plt.figure(figsize=(10, 6))
plt.plot(预测概率, 交叉熵损失, 'b-', linewidth=2, label='交叉熵损失')
plt.xlabel('预测概率 (真实类别)')
plt.ylabel('损失值')
plt.title('交叉熵损失函数曲线')
plt.grid(True)
# 标记关键点
plt.plot(0.9, -np.log(0.9), 'ro', markersize=8, label='自信正确 (损失=0.1)')
plt.plot(0.5, -np.log(0.5), 'go', markersize=8, label='不确定 (损失=0.69)')
plt.plot(0.1, -np.log(0.1), 'ro', markersize=8, label='自信错误 (损失=2.3)')
plt.legend()
plt.show()
可视化交叉熵()
4.2 与其他损失函数的对比
python
def 对比不同损失函数():
预测概率 = np.linspace(0.01, 0.99, 100)
真实概率 = 1 # 假设真实类别概率为1
# 不同损失函数
交叉熵 = -np.log(预测概率)
均方误差 = (预测概率 - 真实概率)**2
绝对值误差 = np.abs(预测概率 - 真实概率)
plt.figure(figsize=(12, 8))
plt.plot(预测概率, 交叉熵, 'r-', linewidth=3, label='交叉熵损失')
plt.plot(预测概率, 均方误差, 'g--', linewidth=2, label='均方误差')
plt.plot(预测概率, 绝对值误差, 'b:', linewidth=2, label='绝对值误差')
plt.xlabel('预测概率 (真实类别)')
plt.ylabel('损失值')
plt.title('不同损失函数对比')
plt.legend()
plt.grid(True)
plt.show()
对比不同损失函数()
🎯 第五阶段:
5.1 技术原理类
Q: 为什么在分类问题中交叉熵比均方误差更好?
回答:
"交叉熵在分类问题中优势明显,主要体现在三个方面:
-
梯度特性优越:
- 交叉熵梯度:
∇ = 预测概率 - 真实概率,直接明了 - MSE梯度:
∇ = 2*(预测概率-真实概率)*预测概率*(1-预测概率),包含sigmoid导数项,容易梯度消失
- 交叉熵梯度:
-
惩罚机制合理:
- 交叉熵对'自信错误'惩罚很重:预测概率0.1时损失2.3
- MSE对'自信错误'惩罚不足:预测概率0.1时损失0.81
-
信息论基础 :
交叉熵衡量两个概率分布的差异,这与分类问题的本质完全契合"
Q: Softmax函数中为什么要减去最大值?
回答:
"这是数值稳定性的重要技巧,称为'数值稳定Softmax':
python
# 不稳定的原始版本
原始分数 = [1000, 1001, 1002] # 数值很大
指数值 = exp(1000), exp(1001), exp(1002) # 指数爆炸!溢出!
# 稳定版本
稳定分数 = [1000-1002, 1001-1002, 1002-1002] = [-2, -1, 0]
指数值 = exp(-2), exp(-1), exp(0) # 数值安全
数学上等价,因为:
softmax(x_i) = exp(x_i)/Σexp(x_j) = exp(x_i - max(x))/Σexp(x_j - max(x))"
5.2 工程实践类问题
Q: 在LED缺陷检测中,如何处理类别不平衡问题?
回答:
"在我们的LED缺陷检测项目中,我们采用了多策略应对类别不平衡:
- 加权交叉熵:
python
# 根据训练集统计设置权重
类别权重 = {
'背景': 1.0, # 60% 样本
'偏色': 2.0, # 15% 样本
'跳灰': 2.0, # 15% 样本
'过曝': 3.0, # 7% 样本
'坏点': 5.0 # 3% 样本 - 最重要!
}
-
Focal Loss改进 :
进一步增加难样本的权重,让模型更关注难以分类的缺陷
-
数据增强 :
对少数类样本进行过采样和增强"
Q: 交叉熵损失在语义分割中如何应用?
你的回答:
"在LED缺陷的语义分割中,我们将其视为像素级分类问题:
python
# 输入维度说明
预测结果: [4, 5, 512, 512] # batch=4, 5个类别, 高512, 宽512
真实标注: [4, 512, 512] # 每个像素的类别索引(0-4)
# 计算损失
loss = CrossEntropyLoss()(预测结果, 真实标注)
# 这等价于对 4*512*512 = 1,048,576 个像素分别计算交叉熵然后求平均
这种设计让模型能够精确到像素级别地检测LED屏幕上的各种缺陷"
交叉熵的核心思想是"不仅要正确,还要自信地正确"。这种思想不仅适用于AI,也适用于我们做技术决策!
-
如果想了解一些成像系统、图像、人眼、颜色等等的小知识,快去看看视频吧 :
- 抖音:数字图像哪些好玩的事,咱就不照课本念,轻轻松松谝闲传
- 快手:数字图像哪些好玩的事,咱就不照课本念,轻轻松松谝闲传
- B站:数字图像哪些好玩的事,咱就不照课本念,轻轻松松谝闲传
- 认准一个头像,保你不迷路:

- 认准一个头像,保你不迷路:
-
您要是也想站在文章开头的巨人的肩膀啦,可以动动您发财的小指头,然后把您的想要展现的名称和公开信息发我,这些信息会跟随每篇文章,屹立在文章的顶部哦
