各类损失函数和激活函数

各类损失函数和激活函数

01 激活函数

softmax 常用于二分类问题

softmax=eiei

将各个输出归一化为概率和为1的各数

import tensorflow as tf
a=tf.constant([1,2,3,4,5,6],dtype='float32') # 下面softmax函数,只接受浮点数输入,数值越大概率越大
s_a=tf.nn.softmax(a)
print(s_a)
tf.Tensor([0.00426978 0.01160646 0.03154963 0.08576079 0.233122 0.6336913 ], shape=(6,), dtype=float32)

sigmoid 常用于多标签分类问题

sigmoid(x)=11+ex

b=tf.constant([1,2,3,4,5,6],dtype='float32') # 数字越大概率越大
b_s=tf.nn.sigmoid(b)
print(b_s)
tf.Tensor([0.7310586 0.8807971 0.95257413 0.98201376 0.9933072 0.99752736], shape=(6,), dtype=float32)

02 损失函数

分类交叉熵损失函数

计算公式:

Loss=1Ni=1Nyilogy^

其中yi是真实值
主要用于二分类,如常见的手写数字识别,单张图中只有一个标签,虽然输出有很多,但是它一个标签是对的,所有概率之和为1,通常与softmax激活函数结合使用。

根据公式我们可以发现,因为yi,要么是0,要么是1。而当yi等于0时,结果就是0,当且仅当yi等于1时,才会有结果。也就是说categoricalcrossentropy只专注与一个结果,因而它一般配合softmax做单标签分类。

看一个例子:
tf.keras.losses.CategoricalCrossentropy 独热编码,y_pred只接受浮点数输入
tf.keras.losses.SparseCategoricalCrossentropy非独热编码的交叉损失函数

tf.keras.losses.CategoricalCrossentropy(
from_logits=False,
label_smoothing=0.0,
axis=-1,
reduction=losses_utils.ReductionV2.AUTO,
name='categorical_crossentropy'
)
# from_logits=True,表示输入为未经softmax转化为归一化的概率
# reduction:系统根据上下文决定输出,默认如果时批量的话,输出为均值。
# 如果为SUM则不除以批量尺寸

可以理解logits ——【batchsize,class_num】是未进入softmax的概率,一般是全连接层的输出,softmax的输入

# 例1
y_true = [[0, 1, 0], [0, 0, 1]] # shape为[batch_size, num_classes]
y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
# Using 'auto'/'sum_over_batch_size' reduction type.
cce = tf.keras.losses.CategoricalCrossentropy()
cce(y_true, y_pred).numpy()
1.1769392
# 例2
cce(y_true, y_pred, sample_weight=tf.constant([0.3, 0.7])).numpy()
0.8135988
# 例3
cce2=tf.keras.losses.CategoricalCrossentropy(
reduction=tf.keras.losses.Reduction.SUM)
cce2(y_true, y_pred).numpy()
2.3538785

由上面1和3两个例子可以看出,采用sum时,计算得到的损失结果为2倍关系,第二个没有除以批大小。
也可以对标签施以权重计算得到LOSS:

# 例4 Reduction为NONE
cce = tf.keras.losses.CategoricalCrossentropy(
reduction=tf.keras.losses.Reduction.NONE)
cce(y_true, y_pred).numpy()
array([0.05129331, 2.3025851 ], dtype=float32)

这个例子说明采用None时,两个值为两个样本分别的损失

# 例5
y_true=[0,1,0]
y_pred=[1.0,3,5]
y_pred_s=tf.nn.softmax(y_pred)
print(y_pred_s)
cce=tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce2=tf.keras.losses.CategoricalCrossentropy()
print(cce(y_true,y_pred).numpy())
print(cce2(y_true,y_pred_s).numpy())
# 可见两者结果一致,如果from_logits=True,表示这个没有经过softmax处理,损失函数在计算之前会归一化
print(cce2(y_true,y_pred).numpy())
# 这里结果就不一致了,说明接受到的参数from_logits=False,认为给的y_pred已经经过softmax处理过
tf.Tensor([0.01587624 0.11731043 0.86681336], shape=(3,), dtype=float32)
2.1429317
2.1429317
1.0986123

二值分类交叉熵损失函数

计算公式:

Loss=1Ni=1Nyilogyi^+(1yi)log(1yi^)

y_true = [0, 1, 0, 0]
y_pred = [-18.6, 0.51, 2.94, -12.8]
bce = tf.keras.losses.BinaryCrossentropy(from_logits=True)
bce(y_true, y_pred).numpy()
0.865458
posted @   Vandaci  阅读(161)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示