python
def compute_entropy(prob_map):
"""
"""
#
epsilon = 1e-8
#
prob_map = F.softmax(prob_map, dim=1) #
# -sum(p_k * log(p_k))
entropy_map = -torch.sum(prob_map * torch.log(prob_map + epsilon), dim=1) #
#
K = prob_map.shape[1] #
max_entropy = torch.log(torch.tensor(K, dtype=torch.float32)) #
#
normalized_entropy_map = entropy_map / max_entropy #
return 1.0 - normalized_entropy_map #
这段代码实现了计算概率图的信息熵并进行归一化处理的功能。让我逐行详细解释:
python
`def compute_entropy(prob_map): """ """ # 定义一个极小值,防止log(0)产生无穷大 epsilon = 1e-8 # 对概率图应用softmax函数,确保各类别概率和为1 prob_map = F.softmax(prob_map, dim=1) # 计算信息熵:-sum(p_k * log(p_k)) entropy_map = -torch.sum(prob_map * torch.log(prob_map + epsilon), dim=1) # 获取类别数量K K = prob_map.shape[1] # 计算最大可能的熵值:log(K) max_entropy = torch.log(torch.tensor(K, dtype=torch.float32)) # 将熵值归一化到[0,1]区间 normalized_entropy_map = entropy_map / max_entropy # 返回1-归一化熵值,这样高置信度对应高值 return 1.0 - normalized_entropy_map`
让我用具体例子来说明:
假设我们有一个3类分割的概率图:
python
`# prob_map形状为[1, 3, 2, 2],即1个样本,3个类别,2x2图像 # 经过softmax后每个像素位置的概率分布如下: 位置(0,0): [0.2, 0.3, 0.5] # 类别1概率0.2, 类别2概率0.3, 类别3概率0.5 位置(0,1): [0.8, 0.1, 0.1] # 类别1概率0.8, 类别2概率0.1, 类别3概率0.1 位置(1,0): [0.33,0.33,0.34] # 类别1概率0.33,类别2概率0.33,类别3概率0.34 位置(1,1): [0.4, 0.4, 0.2] # 类别1概率0.4, 类别2概率0.4, 类别3概率0.2`
计算每个位置的信息熵:
位置(0,0): 0.2, 0.3, 0.5
- 熵 = -(0.2×log(0.2) + 0.3×log(0.3) + 0.5×log(0.5))
- ≈ -(0.2×(-1.61) + 0.3×(-1.20) + 0.5×(-0.69))
- ≈ -(−0.32 − 0.36 − 0.35) = 1.03
位置(0,1): 0.8, 0.1, 0.1
- 熵 = -(0.8×log(0.8) + 0.1×log(0.1) + 0.1×log(0.1))
- ≈ -(0.8×(-0.22) + 0.1×(-2.30) + 0.1×(-2.30))
- ≈ -(−0.18 − 0.23 − 0.23) = 0.64
位置(1,0): 0.33, 0.33, 0.34
- 熵 ≈ -(0.33×(-1.11) + 0.33×(-1.11) + 0.34×(-1.07))
- ≈ 1.10
位置(1,1): 0.4, 0.4, 0.2
- 熵 ≈ -(0.4×(-0.92) + 0.4×(-0.92) + 0.2×(-1.61))
- ≈ 1.04
归一化处理:
最大可能熵值 = log(3) ≈ 1.10
归一化后:
- 位置(0,0): 1.03/1.10 ≈ 0.94
- 位置(0,1): 0.64/1.10 ≈ 0.58
- 位置(1,0): 1.10/1.10 = 1.00
- 位置(1,1): 1.04/1.10 ≈ 0.95
最终结果(1-归一化熵):
位置(0,0): 1.0 - 0.94 = 0.06
位置(0,1): 1.0 - 0.58 = 0.42
位置(1,0): 1.0 - 1.00 = 0.00
位置(1,1): 1.0 - 0.95 = 0.05
可以看出,熵值越低(不确定性越小)的位置,最终结果越接近1,表示模型对该位置的预测越有信心。