像 Keras 这样的深度学习框架降低了大众的进入门槛,并将 DL 模型的开发民主化给没有经验的人,他们可以依靠合理的默认值和简化的 API 来首当其冲地承担繁重的工作,并产生不错的结果。
在使用 Keras 损失函数进行分类时,新的深度学习从业者之间会出现一个常见的混淆,例如 CategoricalCrossentropy
和 SparseCategoricalCrossentropy
:
loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False)
什么是
from_logits
标志指的是什么?
答案相当简单,但需要查看我们尝试使用损失函数分级的网络输出。
Logits 和 SoftMax 概率
长话短说:
概率被归一化——即有一个范围在
[0..1]
. Logits 没有标准化,并且可以有一个范围[-inf...+inf]
.
根据网络的输出层:
output = keras.layers.Dense(n, activation='softmax')(x)
output = keras.layers.Dense(n)(x)
输出 Dense
层将 或 返回:
- 概率: 输出通过 SoftMax 函数将输出归一化为一组概率
n
, 所有加起来1
. - Logits:
n
激活。
这种误解可能源于允许您向层添加激活的简写语法, 似乎 作为单层,即使它只是以下内容的简写:
output = keras.layers.Dense(n, activation='softmax')(x)
dense = keras.layers.Dense(n)(x)
output = keras.layers.Activation('softmax')(dense)
您的损失函数必须被告知它是否应该期望归一化分布(输出通过 SoftMax 函数)或 logits。 因此, from_logits
旗帜!
什么时候应该 from_logits=真?
如果您的网络标准化输出概率,您的损失函数应该设置 from_logits
至 False
,因为它不接受 logits。 这也是所有接受标志的损失类的默认值,因为大多数人添加一个 activation='softmax'
到他们的输出层:
model = keras.Sequential([
keras.layers.Input(shape=(10, 1)),
keras.layers.Dense(10, activation='softmax')
])
input_data = tf.random.uniform(shape=[1, 1])
output = model(input_data)
print(output)
结果是:
tf.Tensor(
[[[0.12467965 0.10423233 0.10054766 0.09162105 0.09144577 0.07093797
0.12523937 0.11292477 0.06583504 0.11253635]]], shape=(1, 1, 10), dtype=float32)
由于该网络导致归一化分布——当将输出与目标输出进行比较时,并通过分类损失函数对它们进行分级(针对适当的任务)—— 你应该设置 from_logits
至 False
,或者保留默认值。
另一方面,如果您的网络没有在输出上应用 SoftMax:
model = keras.Sequential([
keras.layers.Input(shape=(10, 1)),
keras.layers.Dense(10)
])
input_data = tf.random.uniform(shape=[1, 1])
output = model(input_data)
print(output)
结果是:
tf.Tensor(
[[[-0.06081138 0.04154852 0.00153442 0.0705068 -0.01139916
0.08506121 0.1211026 -0.10112958 -0.03410497 0.08653068]]], shape=(1, 1, 10), dtype=float32)
你需要设置 from_logits
至 True
让损失函数正确处理输出。
何时在输出上使用 SoftMax?
大多数从业者在输出上应用 SoftMax 以给出归一化的概率分布,因为在许多情况下,这就是您将使用网络的目的——尤其是在简化的教育材料中。 但是,在某些情况下,您 别 想要将函数应用于输出,在应用 SoftMax 或其他函数之前以不同的方式处理它。
一个值得注意的例子来自 NLP 模型,其中输出张量中可以存在一个真正的大词汇表概率。 应用 SoftMax 他们都是 并贪婪地得到 argmax
通常不会产生很好的结果。
但是,如果您观察 logits,请提取 Top-K(其中 K 可以是任何数字,但通常介于 [0...10]
),然后才将 SoftMax 应用于 前k 词汇表中可能的标记会显着改变分布,通常会产生更真实的结果。
查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!
这被称为 Top-K 抽样,虽然它不是理想的策略,但通常明显优于贪婪抽样。
走得更远——计算机视觉的实用深度学习
你好奇的天性让你想走得更远? 我们建议查看我们的 套餐: “使用 Python 进行计算机视觉的实用深度学习”.
另一个计算机视觉课程?
我们不会对 MNIST 数字或 MNIST 时尚进行分类。 他们很久以前就发挥了作用。 在让高级黑盒架构承担性能负担之前,太多的学习资源专注于基本数据集和基本架构。
我们想专注于 揭秘, 实际性, 理解, 直觉 和 真实项目. 想学 形成一种 你可以有所作为? 我们将带您从大脑处理图像的方式到编写研究级的乳腺癌深度学习分类器,再到“产生幻觉”的深度学习网络,通过实际工作教您原理和理论,为您配备成为应用深度学习解决计算机视觉问题的专家的专业知识和工具。
里面是什么?
- 视觉的首要原则以及如何教计算机“看”
- 计算机视觉的不同任务和应用
- 让您的工作更轻松的交易工具
- 为计算机视觉寻找、创建和利用数据集
- 卷积神经网络的理论与应用
- 处理数据集中的域转移、共现和其他偏差
- 迁移学习并利用他人的训练时间和计算资源为您谋取利益
- 构建和训练最先进的乳腺癌分类器
- 如何将健康的怀疑态度应用于主流思想并理解广泛采用的技术的含义
- 使用 t-SNE 和 PCA 可视化 ConvNet 的“概念空间”
- 公司如何使用计算机视觉技术取得更好结果的案例研究
- 适当的模型评估、潜在空间可视化和识别模型的注意力
- 执行领域研究,处理您自己的数据集并建立模型测试
- 尖端架构、想法的发展、是什么让它们与众不同以及如何实现它们
- KerasCV – 用于创建最先进的管道和模型的 WIP 库
- 如何解析和阅读论文并自己实现它们
- 根据您的应用选择型号
- 创建端到端机器学习管道
- 使用 Faster R-CNN、RetinaNets、SSD 和 YOLO 进行对象检测的景观和直觉
- 实例和语义分割
- 使用 YOLOv5 进行实时对象识别
- 训练 YOLOv5 目标检测器
- 使用 KerasNLP(行业强大的 WIP 库)使用 Transformers
- 将 Transformers 与 ConvNet 集成以生成图像的标题
- 深梦
结论
在这个简短的指南中,我们查看了 from_logits
Keras 损失类的争论,这经常会向新从业者提出问题。
混淆可能源于允许在层本身的定义内在其他层之上添加激活层的简写语法。 我们终于看到了何时应该将参数设置为 True
or False
,以及何时应将输出保留为 logits 或通过激活函数(如 SoftMax)传递。