CrossEntropyLossLayer["Index"]
表示一个网络层,通过比较输入类概率向量与表示目标类的指数计算交叉熵损失.
CrossEntropyLossLayer["Probabilities"]
表示一个网络层,通过比较输入类概率向量与目标类概率向量计算交叉熵损失.
CrossEntropyLossLayer["Binary"]
表示一个网络层,通过比较输入概率标量与目标概率标量计算二值交叉熵损失,其中每个概率表示一个二值选择.
CrossEntropyLossLayer
CrossEntropyLossLayer["Index"]
表示一个网络层,通过比较输入类概率向量与表示目标类的指数计算交叉熵损失.
CrossEntropyLossLayer["Probabilities"]
表示一个网络层,通过比较输入类概率向量与目标类概率向量计算交叉熵损失.
CrossEntropyLossLayer["Binary"]
表示一个网络层,通过比较输入概率标量与目标概率标量计算二值交叉熵损失,其中每个概率表示一个二值选择.
更多信息和选项
- CrossEntropyLossLayer 开放下列端口以便在 NetGraph 等中使用:
-
"Input" n 階的实数数组 "Target" n 階的实数数组或 n-1 階的整数数组 "Loss" 实数 - 当在多维输入上操作时,CrossEntropyLossLayer 有效地线性作用于任何额外的数组维度以产生损失数组并返回这些损失的平均值.
- 对于 CrossEntropyLossLayer["Binary"],输入和目标应为 0 和 1 之间的标量值,或者这些数值的数组.
- 对于 CrossEntropyLossLayer["Index"],输入应为总和为 1 的概率 {p1,…,pc} 的向量,或者这种向量的数组. 目标应该是 1 和 c 之间的整数,或者这种整数的数组.
- 对于 CrossEntropyLossLayer["Probabilities"],输入和目标应为总和为 1 的概率向量,或者这种向量的数组.
- 对于 "Index" 和 "Probabilities" 的形式,其中输入数组的维数为 {d1,d2,…,dn},最终维数 dn 用于标出类的索引. 输出损失取作剩余维数 {d1,…,dn-1} 的均值.
- CrossEntropyLossLayer[…][<|"Input"->in,"Target"target|>] 显式计算应用层的输出.
- CrossEntropyLossLayer[…][<|"Input"->{in1,in2,…},"Target"->{target1,target2,…}|>] 显式计算每对 ini 和 targeti 的输出.
- 当 NumericArray 作为输入时,输出将是 NumericArray.
- CrossEntropyLossLayer 通常用于 NetGraph 内部,以构建训练网络.
- CrossEntropyLossLayer 可以运算在包含 "Varying" 维度的数组上.
- 在训练特定网络时,CrossEntropyLossLayer[…] 可以作为 NetTrain 的第三个参数提供.
- 在适当时候,如果未提供显式损失规范,NetTrain 将自动使用 CrossEntropyLossLayer. 将会基于输出端口的最后激活和任何附加的 NetDecoder 形式从 "Binary"、"Probabilities" 和 "Index" 中选择其一.
- CrossEntropyLossLayer[form,"port"->shape] 允许指定输入或目标端口的形式. shape 的可能形式为:
-
"Real" 单个实数 "Integer" 单个实数 n 长度为 n 的向量 {n1,n2,…} 维数为 n1×n2×… 的数组 "Varying" 长度可变的向量 {"Varying",n2,n3,…} 一个数组其第一个维度是可变的,其余维度是 n2×n3×… NetEncoder[…] 编码器 NetEncoder[{…,"Dimensions"{n1,…}}] 映射在维数为 n1×… 数组上的编码器 - Options[CrossEntropyLossLayer] 给出构造层的默认选项列表. Options[CrossEntropyLossLayer[…]] 提供用于在某些数据上运算网络层的默认选项列表.
- Information[CrossEntropyLossLayer[…]] 提供有关该层的报告.
- Information[CrossEntropyLossLayer[…],prop] 给出 CrossEntropyLossLayer[…]的属性 prop 的值. 可能的属性与 NetGraph 相同.
范例
打开所有单元 关闭所有单元基本范例 (3)
创建一个接受概率向量和索引的 CrossEntropyLossLayer 对象:
CrossEntropyLossLayer["Index"]创建 CrossEntropyLossLayer,其中输入为概率向量,目标为索引:
loss = CrossEntropyLossLayer["Index"]loss[<|"Input" -> {0.1, 0.2, 0.7}, "Target" -> 3|>]创建一个 CrossEntropyLossLayer,对从字符串生成的序列进行计算:
enc = NetEncoder[{"Characters", "ab"}];loss = CrossEntropyLossLayer["Index", "Target" -> enc]loss[<|"Input" -> {{1, 0}, {0.5, 0.5}, {0, 1}, {1, 0}}, "Target" -> "abba"|>]loss[<|"Input" -> {{1, 0}, {0, 1}, {0, 1}, {1, 0}}, "Target" -> "abba"|>]范围 (5)
创建 CrossEntropyLossLayer,其中输入和目标为单一的概率:
loss = CrossEntropyLossLayer["Binary", "Input" -> "Real"]loss[<|"Input" -> 0.2, "Target" -> 0.8|>]loss[<|"Input" -> {0.2, 0.1, 0.1}, "Target" -> {0.8, 0.9, 0.1}|>]创建 CrossEntropyLossLayer,其中输入为概率向量,目标为索引:
loss = CrossEntropyLossLayer["Index", "Input" -> {3}]loss[<|"Input" -> {0.1, 0.2, 0.7}, "Target" -> 3|>]创建一个 CrossEntropyLossLayer,对由字符串生成的向量进行操作:
loss = CrossEntropyLossLayer["Probabilities", "Input" -> {3}]loss[<|"Input" -> {0.1, 0.2, 0.7}, "Target" -> {0.1, 0.3, 0.6}|>]创建 CrossEntropyLossLayer,其中输入和目标为表示二值类概率矩阵的图像:
enc = NetEncoder[{"Image", {6, 11}, ColorSpace -> "Grayscale"}];
loss = CrossEntropyLossLayer["Binary", "Input" -> enc, "Target" -> enc]loss[<|"Input" -> [image], "Target" -> [image]|>]pairs = Tuples[{[image], [image], [image], [image], [image], [image], [image], [image], [image]}, 2];losses = loss[AssociationThread[{"Input", "Target"}, Transpose[pairs]]];pairs[[Ordering[losses, 10]]]pairs[[Ordering[losses, -10]]]创建含有 CrossEntropyLossLayer 的图,其中输入是一个各颜色通道表示一个类的 3-通道图像,目标是表示各个像素正确类的索引矩阵:
net = NetGraph[
<|"t1" -> TransposeLayer[{3 1, 1 2}], "loss" -> CrossEntropyLossLayer["Index"]|>,
{NetPort["Input"] -> "t1" -> NetPort[{"loss", "Input"}],
NetPort["Target"] -> NetPort[{"loss", "Target"}]}, "Input" -> NetEncoder[{"Image", 8}]]度量目标图像和矩阵上的损失,其中区域上主要是红色、绿色和蓝色,分别匹配目标上的索引 1、2 和 3:
net[<|"Input" -> [image], "Target" -> (| | | | | | | | |
| - | - | - | - | - | - | - | - |
| 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| 1 | 1 | 2 | 2 | 2 | 3 | 3 | 3 |
| 1 | 1 | 2 | 2 | 2 | 2 | 3 | 3 |
| 1 | 1 | 2 | 2 | 2 | 2 | 3 | 3 |
| 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 |
| 1 | 1 | 1 | 1 | 1 | 1 | 3 | 3 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 |)|>]net[<|"Input" -> [image], "Target" -> (| | | | | | | | |
| - | - | - | - | - | - | - | - |
| 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| 1 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| 1 | 1 | 2 | 2 | 2 | 3 | 3 | 3 |
| 1 | 1 | 2 | 2 | 2 | 2 | 3 | 3 |
| 1 | 1 | 2 | 2 | 2 | 2 | 3 | 3 |
| 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 |
| 1 | 1 | 1 | 1 | 1 | 1 | 3 | 3 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 3 |)|>]应用 (2)
当用于输出的最后激活为 ElementwiseLayer[LogisticSigmoid] 时, CrossEntropyLossLayer["Binary"] 自动被 NetTrain 使用. 创建网络,接受一个数据对,生成 True 或 False:
net = NetChain[{LinearLayer[], LogisticSigmoid}, "Input" -> 2, "Output" -> "Boolean"]results = NetTrain[net, Flatten@Table[{i, j} -> (i > j), {i, 5}, {j, 5}], All]由 NetTrain 自动构建的训练网络含有二值类型的 CrossEntropyLossLayer:
results["TrainingNet"][["LossNet1"]]trained = results["TrainedNet"]Graphics[Table[Text[If[trained[{i, j}], Style["T", Red], Style["F", Blue]], {i, j}], {i, 15}, {j, 15}], Frame -> True]Plot3D[trained[{x, y}, None], {x, 0, 10}, {y, 0, 10}, NormalsFunction -> None, ImagePadding -> {{20, 5}, {0, 0}}]当用于输出的最后激活为 SoftmaxLayer 时,CrossEntropyLossLayer["Index"] 自动被 NetTrain 使用. 从三个正态分布聚类创建人工数据集:
makeCluster[class_, μ_, ρ_] := RandomVariate[MultinormalDistribution[μ, {{1, 2ρ}, {2ρ, 4}}], 600] -> class;clusters = makeCluster@@@{{Red, {1.5, 1.5}, -.2}, {Green, {-1.5, 1}, .1}, {Blue, {0, -2.5}, .8}};plot = ListPlot[Keys[clusters], PlotStyle -> {RGBColor[0.8, 0., 0.], RGBColor[0., 0.8, 0.], RGBColor[0., 0., 0.8]}, AspectRatio -> 1, Frame -> True, PlotRange -> {{-5, 5}, {-5, 5}}]trainingData = Flatten[Thread /@ clusters];
RandomSample[trainingData, 6]创建一个网络,计算位于各个聚类上点的概率,使用 "Class" 解码器将输入分类为 Red、Green 或 Blue:
net = NetChain[{30, Ramp, 3, SoftmaxLayer[]}, "Input" -> {2}, "Output" -> NetDecoder[{"Class", {Red, Green, Blue}}]]results = NetTrain[net, trainingData, All]由 NetTrain 自动构建的训练网络含有 index-type 的 CrossEntropyLossLayer:
results["TrainingNet"][["LossNet1"]]trained = results["TrainedNet"]trained[{{1.5, 1}, {-1.5, 1}, {0, -3}}]显示特征空间中的等高线,其中每个类都达到了 0.75 的后验概率:
Show[plot, Quiet@Table[ContourPlot[trained[{x, y}, {"Probabilities", color}] == 0.75, {x, -5, 5}, {y, -5, 5}, ContourStyle -> {Thick, Darker[color, .3]}], {color, {Red, Green, Blue}}]]属性和关系 (4)
这里是由 CrossEntropyLossLayer["Binary"] 计算的函数:
bceLoss = -(#Target * Log[#Input] + (1 - #Target) * Log[1 - #Input])&;bceLoss[<|"Input" -> 0.2, "Target" -> 1|>]CrossEntropyLossLayer["Binary"][<|"Input" -> 0.2, "Target" -> 1|>]在目标固定为 1 的情况下,当输入接近 1 时损失被最小化:
Plot[Evaluate@bceLoss[<|"Input" -> p, "Target" -> 1|>], {p, 0, 1}]ContourPlot[Evaluate@bceLoss[<|"Input" -> input, "Target" -> target|>], {input, 0, 1}, {target, 0, 1}, Contours -> 10, PlotLegends -> Automatic, PlotRangePadding -> 0, FrameLabel -> Automatic]把 CrossEntropyLossLayer["Binary"] 应用到标量概率 p 等价于把 CrossEntropyLossLayer["Probabilities"] 应用到向量概率 {p,1-p}:
CrossEntropyLossLayer["Binary"][<|"Input" -> 0.3, "Target" -> 0.2|>]CrossEntropyLossLayer["Probabilities"][<|"Input" -> {0.3, 0.7}, "Target" -> {0.2, 0.8}|>]ceLoss = -Total[#Target * Log@#Input]&;
ceLoss[<|"Input" -> {input, 1 - input}, "Target" -> {target, 1 - target}|>]这里是由 CrossEntropyLossLayer["Probabilities"] 计算的函数:
ceLoss = -Total[#Target * Log@#Input]&;data = <|"Input" -> {0.1, 0.2, 0.7}, "Target" -> {0.12, 0.3, 0.6}|>;
ceLoss[data]CrossEntropyLossLayer["Probabilities"][data]采用独热 (one-hot) 编码的情况下,CrossEntropyLossLayer["Probabilities"] 等价于 CrossEntropyLossLayer["Index"]:
denseEntropy = CrossEntropyLossLayer["Probabilities", "Target" -> NetEncoder[{"Class", {1, 2, 3}, "UnitVector"}]];
sparseEntropy = CrossEntropyLossLayer["Index"];data = <|"Input" -> {0.1, 0.2, 0.7}, "Target" -> 3|>;
denseEntropy[data] == sparseEntropy[data]CrossEntropyLossLayer["Index"] 比 CrossEntropyLossLayer["Probabilities"] 快,且在类别数量较大的情况下使用的内存要少的多.
技术笔记
相关指南
-
▪
- 神经网络层
文本
Wolfram Research (2016),CrossEntropyLossLayer,Wolfram 语言函数,https://reference.wolfram.com/language/ref/CrossEntropyLossLayer.html (更新于 2020 年).
CMS
Wolfram 语言. 2016. "CrossEntropyLossLayer." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2020. https://reference.wolfram.com/language/ref/CrossEntropyLossLayer.html.
APA
Wolfram 语言. (2016). CrossEntropyLossLayer. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/CrossEntropyLossLayer.html 年
BibTeX
@misc{reference.wolfram_2026_crossentropylosslayer, author="Wolfram Research", title="{CrossEntropyLossLayer}", year="2020", howpublished="\url{https://reference.wolfram.com/language/ref/CrossEntropyLossLayer.html}", note=[Accessed: 14-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_crossentropylosslayer, organization={Wolfram Research}, title={CrossEntropyLossLayer}, year={2020}, url={https://reference.wolfram.com/language/ref/CrossEntropyLossLayer.html}, note=[Accessed: 14-September-2026]}