详解Keras3.0 Losses:Probabilistic losses(概率损失)

目录

Probabilistic losses

1、BinaryCrossentropy

2、CategoricalCrossentropy

 3、SparseCategoricalCrossentropy

4、Poisson class

5、binary_crossentropy 

6、sparse_categorical_crossentropy 

7、KLDivergence class


Probabilistic losses

概率损失函数是用于衡量模型预测的概率分布与真实概率分布之间的差异的函数。这些函数通常用于分类问题,其中模型输出的是每个类别的概率。

1、BinaryCrossentropy

二元交叉熵损失函数是一种用于二分类问题的的损失函数,它衡量了模型预测的概率分布与真实概率分布之间的差异。

计算公式为:

L(y, y_pred) = -y * log(y_pred) - (1 - y) * log(1 - y_pred)

其中,y是真实标签,y_pred是模型预测的概率值。

示例: 

# 真实标签
y_true = tf.constant([0, 1, 1, 0])

# 模型预测的概率值
y_pred = tf.constant([0.1, 0.9, 0.8, 0.2])

# 计算二元交叉熵损失
loss = keras.losses.BinaryCrossentropy()(y_true, y_pred)
print("二元交叉熵损失:", loss.numpy())

 在使用二元交叉熵损失函数时,需要确保真实标签和预测概率值的数据类型相同,通常为浮点数。

2、CategoricalCrossentropy

用于计算多分类问题的损失

计算公式为:

CategoricalCrossentropy = -Σ(y_true * log(y_pred))

其中,y_true表示真实标签,y_pred表示预测概率。

示例:

from keras.models import Sequential
from keras.layers import Dense
from keras.losses import CategoricalCrossentropy

# 创建一个简单的神经网络模型
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))

# 编译模型,设置损失函数为CategoricalCrossentropy
model.compile(optimizer='adam', loss=CategoricalCrossentropy(), metrics=['accuracy'])

# 生成模拟数据
import numpy as np
x_train = np.random.random((1000, 100))
y_train = np.random.randint(10, size=(1000, 1))
x_test = np.random.random((100, 100))
y_test = np.random.randint(10, size=(100, 1))

# 训练模型
model.fit(x_train, y_train, epochs=10, batch_size=32)

# 评估模型
loss, accuracy = model.evaluate(x_test, y_test)
print('Test loss:', loss)
print('Test accuracy:', accuracy)

确保输入数据的维度和标签的维度匹配。例如,对于具有10个类别的多分类问题,标签应该是一个形状为(样本数, 1)的二维数组,其中每个元素是一个介于0到9之间的整数。

 3、SparseCategoricalCrossentropy

用于多分类问题的损失函数之一。它主要用于处理整数类别标签,而不是one-hot编码的二进制向量。与CategoricalCrossentropy相比,SparseCategoricalCrossentropy在计算过程中不需要将类别标签转换为one-hot编码,因此在某些情况下可以节省内存和计算资源。

计算公式为:

SparseCategoricalCrossentropy(y_true, y_pred) = -sum(y_true * log(y_pred))

其中,y_true是真实标签,y_pred是预测概率分布。

示例:

from keras.losses import SparseCategoricalCrossentropy
import tensorflow as tf

# 创建模型
model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, activation='softmax', input_shape=(4,))
])

# 编译模型
model.compile(optimizer='adam', loss=SparseCategoricalCrossentropy())

# 准备数据
import numpy as np
x_train = np.random.random((1000, 4))
y_train = np.random.randint(0, 10, (1000,))

# 训练模型
model.fit(x_train, y_train, epochs=10)

确保y_true中的类别标签是整数,而不是one-hot编码的二进制向量 

4、Poisson class

这是一个类,是一种离散概率分布,用于描述在固定时间间隔或空间范围内,某事件发生的次数。

计算公式为:

P(X=k) = (λ^k * e^-λ) / k!

其中,X 是随机变量,表示事件发生的次数;k 是可能的取值;λ 是事件的平均发生率。

示例:

import math
from scipy.stats import poisson

# 计算泊松分布的概率质量函数值
lambd = 5  # 平均发生率
k = 3      # 事件发生次数
probability = poisson.pmf(k, lambd)
print("P(X=3) =", probability)

只适用于离散型随机变量,不适用于连续型随机变量,参数λ需要大于0,否则概率质量函数值为0,概率质量函数值随着事件发生次数的增加而趋近于0,因此在实际问题中,需要注意避免出现大量的事件。

5、binary_crossentropy 

用于计算二元分类问题的损失。

计算公式为:

binary_crossentropy = -(y * log(p) + (1 - y) * log(1 - p))

示例:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam

# 生成模拟数据
X = np.random.rand(100, 2)
y = np.random.randint(0, 2, size=(100, 1))

# 创建模型
model = Sequential()
model.add(Dense(32, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 编译模型,使用binary_crossentropy作为损失函数
model.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy'])

# 训练模型
model.fit(X, y, epochs=10, batch_size=32)

要求目标变量y的取值为0或1,如果y的取值范围不是(0, 1),需要先进行预处理,将其转换为二进制形式,用于多分类问题时,可以将目标变量y的取值视为概率分布,然后使用categorical_crossentropy作为损失函数。

6、sparse_categorical_crossentropy 

主要用于计算模型预测的概率分布与实际标签之间的交叉熵损失。这个损失函数适用于稀疏标签(即每个样本只有一个类别的标签),而不是密集标签(即每个样本有多个类别的标签)。

计算公式: 

sparse_categorical_crossentropy(y_true, y_pred) = -sum(y_true * log(y_pred)) 

示例:

import tensorflow as tf

# 假设我们有3个类别的标签
num_classes = 3

# 创建一个简单的模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(784,)),
    tf.keras.layers.Dense(num_classes, activation='softmax')
])

# 编译模型,使用sparse_categorical_crossentropy作为损失函数
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 生成一些模拟数据进行训练
import numpy as np
x_train = np.random.random((1000, 784))
y_train = np.random.randint(0, num_classes, (1000,))

# 训练模型
model.fit(x_train, y_train, epochs=10)

要求标签是整数类型,且从0开始。例如,如果有3个类别,那么标签应该是[0, 1, 2],如果模型输出的概率分布不是概率分布(即和不为1),那么在计算损失时可能会出现问题。因此,确保模型输出的概率分布是正确的。

7、KLDivergence class

这是一个类,用于计算KL散度损失

计算公式:

KL(P||Q) = Σ P(i) * log(P(i) / Q(i))

其中,P和Q是两个概率分布,i表示某个事件。

示例:

import numpy as np
from scipy.stats import entropy

# 定义两个概率分布P和Q
P = np.array([0.4, 0.6])
Q = np.array([0.3, 0.7])

# 计算KL散度
kl_divergence = entropy(P, Q)
print("KL散度:", kl_divergence)

 确保输入的概率分布P和Q都是有效的概率分布,即它们的元素之和为1。

你可能感兴趣的:(机器学习,深度学习,人工智能,keras)