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になる確率のベクトルまたはそのようなベクトルの配列でなければならない.
- 入力配列の次元が{d1,d2,…,dn}の"Index"形と"Probabilities"形については,最終次元 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の第3引数として与えることができる.
- 明示的な損失指定が与えられていない場合には,適切であれば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]]]入力が各色チャンネルがクラスを表す3チャンネル画像であり,ターゲットが各画素についての正しいクラスを表す指標の行列であるCrossEntropyLossLayerを含むグラフを作る:
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)
CrossEntropyLossLayer["Binary"]は,出力に使われる最終的なアクティベーションがElementwiseLayer[LogisticSigmoid]であるNetTrainによって自動的に使われる.数のベアを取ってTrueまたはFalseを生成するネットワークを作る:
net = NetChain[{LinearLayer[], LogisticSigmoid}, "Input" -> 2, "Output" -> "Boolean"]ペアの最初の数が2番目の数より大きいかどうかを判定するようにネットワークを訓練する:
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によって自動的に使われる.正規分布に従う3つのクラスタから人工的なデータ集合を作る:
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によって自動的に構築された訓練ネットワークには,指標タイプのCrossEntropyLossLayerが含まれている:
results["TrainingNet"][["LossNet1"]]trained = results["TrainedNet"]trained[{{1.5, 1}, {-1.5, 1}, {0, -3}}]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]スカラー確率 p に適用されたCrossEntropyLossLayer["Binary"]は,ベクトル確率{p,1-p}に適用されたCrossEntropyLossLayer["Probabilities"] と同じである:
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]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 Language. 2016. "CrossEntropyLossLayer." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2020. https://reference.wolfram.com/language/ref/CrossEntropyLossLayer.html.
APA
Wolfram Language. (2016). CrossEntropyLossLayer. Wolfram Language & System Documentation Center. Retrieved from 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: 08-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: 08-September-2026]}