各类损失函数和激活函数
01 激活函数
softmax
常用于二分类问题
将各个输出归一化为概率和为1的各数
| a=tf.constant([1,2,3,4,5,6],dtype='float32') |
| 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
常用于多标签分类问题
| 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) |
分类交叉熵损失函数
计算公式:
其中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' |
| ) |
| |
| |
| |
可以理解logits ——【batchsize,class_num】是未进入softmax的概率,一般是全连接层的输出,softmax的输入
| |
| y_true = [[0, 1, 0], [0, 0, 1]] |
| y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]] |
| |
| cce = tf.keras.losses.CategoricalCrossentropy() |
| cce(y_true, y_pred).numpy() |
| |
| cce(y_true, y_pred, sample_weight=tf.constant([0.3, 0.7])).numpy() |
| |
| cce2=tf.keras.losses.CategoricalCrossentropy( |
| reduction=tf.keras.losses.Reduction.SUM) |
| cce2(y_true, y_pred).numpy() |
由上面1和3两个例子可以看出,采用sum时,计算得到的损失结果为2倍关系,第二个没有除以批大小。
也可以对标签施以权重计算得到LOSS:
| |
| 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时,两个值为两个样本分别的损失
| |
| 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()) |
| |
| print(cce2(y_true,y_pred).numpy()) |
| |
| tf.Tensor([0.01587624 0.11731043 0.86681336], shape=(3,), dtype=float32) |
| 2.1429317 |
| 2.1429317 |
| 1.0986123 |
二值分类交叉熵损失函数
计算公式:
| 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() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理