メインコンテンツ

crossentropy

分類タスク用のクロスエントロピー損失

説明

クロスエントロピー演算は、単一ラベルおよび複数ラベルの分類タスクについて、ネットワーク予測とバイナリのターゲット値または one-hot 符号化されたターゲット値との間のクロスエントロピー損失を計算します。

関数 crossentropy は、dlarray データとして表された予測とターゲットとの間のクロスエントロピー損失を計算します。dlarray オブジェクトを使用すると、次元にラベルを付けることができるため、高次元のデータをより簡単に扱うことができます。たとえば、"S""T""C""B" のラベルを使用して、各次元が空間、時間、チャネル、バッチのどの次元に対応するかを示すことができます。特に指定がないその他の次元については、ラベル "U" を使用します。特定の次元に対して演算を行うオブジェクト関数 dlarray の場合、dlarray オブジェクトの形式を直接整えるか、DataFormat オプションを使用することで、次元ラベルを指定できます。

メモ

関数 trainnet を使用し、クロスエントロピー損失に基づいて学習させるには、損失関数を "crossentropy" に設定します。

loss = crossentropy(Y,targets) は、単一ラベルの分類タスク用に、予測を含む形式を整えた dlarray オブジェクト Y とターゲット値 targets との間の categorical クロスエントロピー損失を返します。出力 loss は、形式を整えていない dlarray スカラーです。

形式が整っていない入力データの場合は、DataFormat 引数を使用します。

loss = crossentropy(Y,targets,weights) は、計算された損失値に重みを適用します。計算された損失値に対し、入力のクラス、観測値、領域、または個々の要素による寄与を重み付けするには、この構文を使用します。

loss = crossentropy(___,Name=Value) は、前の構文の入力引数に加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、ClassificationMode="multilabel" は、複数ラベルの分類タスク用のクロスエントロピー損失を計算します。

すべて折りたたむ

10 個のクラスに関する 12 個の観測値の予測スコアから成る配列を作成します。

numClasses = 10;
numObservations = 12;

Y = rand(numClasses,numObservations);
Y = dlarray(Y,"CB");
Y = softmax(Y);

予測スコアのサイズと形式を表示します。

size(Y)
ans = 1×2

    10    12

dims(Y)
ans = 
'CB'

one-hot ベクトルとして符号化された、ターゲットの配列を作成します。

labels = randi(numClasses,[1 numObservations]);
targets = onehotencode(labels,1,ClassNames=1:numClasses);

ターゲットのサイズを表示します。

size(targets)
ans = 1×2

    10    12

予測とターゲットとの間のクロスエントロピー損失を計算します。

loss = crossentropy(Y,targets)
loss = 
  1×1 dlarray

    2.3343

10 個のクラスに関する 12 個の観測値の予測スコアから成る配列を作成します。

numClasses = 10;
numObservations = 12;
Y = rand(numClasses,numObservations);
Y = dlarray(Y,"CB");

予測スコアのサイズと形式を表示します。

size(Y)
ans = 1×2

    10    12

dims(Y)
ans = 
'CB'

0 と 1 から成る数値配列として符号化された、ターゲットのランダム配列を作成します。各観測値は複数のクラスをもつことができます。

targets = rand(numClasses,numObservations) > 0.75;
targets = single(targets);

ターゲットのサイズを表示します。

size(targets)
ans = 1×2

    10    12

予測とターゲットとの間のクロスエントロピー損失を計算します。複数ラベルの分類用のクロスエントロピー損失を指定するには、ClassificationMode 引数を "multilabel" に設定します。

loss = crossentropy(Y,targets,ClassificationMode="multilabel")
loss = 
  1×1 single dlarray

    9.8853

10 個のクラスに関する 12 個の観測値の予測スコアから成る配列を作成します。

numClasses = 10;
numObservations = 12;

Y = rand(numClasses,numObservations);
Y = dlarray(Y,"CB");
Y = softmax(Y);

予測スコアのサイズと形式を表示します。

size(Y)
ans = 1×2

    10    12

dims(Y)
ans = 
'CB'

one-hot ベクトルとして符号化された、ターゲットの配列を作成します。

labels = randi(numClasses,[1 numObservations]);
targets = onehotencode(labels,1,ClassNames=1:numClasses);

ターゲットのサイズを表示します。

size(targets)
ans = 1×2

    10    12

クラスの重みから成るベクトルを使用して、予測とターゲットとの間の加重クロスエントロピー損失を計算します。WeightsFormat 引数を使用して、"UC" (指定なし、チャネル) という重みの形式を指定します。

weights = rand(1,numClasses);
loss = crossentropy(Y,targets,weights,WeightsFormat="UC")
loss = 
  1×1 dlarray

    1.1261

入力引数

すべて折りたたむ

予測。形式が整った (または形式が整っていない) dlarray オブジェクト、または数値配列として指定します。Y が、形式が整った dlarray でない場合、DataFormat 引数を使用して次元形式を指定しなければなりません。

Y が数値配列の場合、targetsdlarray オブジェクトでなければなりません。

ターゲット分類ラベル。形式を整えた (または形式を整えていない) dlarray、あるいは数値配列として指定します。

one-hot 符号化されたラベルを含み、サイズと形式が Y と同じ配列として、ターゲットを指定します。たとえば、YnumObservationsnumClasses 列の配列である場合、観測値 n がクラス i に属するのであれば targets(n,i) = 1、そうでなければ targets(n,i) = 0 です。

targets が、形式を整えた dlarray の場合、その形式は Y の形式と同じでなければなりません。Y の形式を整えていない場合、その形式は DataFormat の形式と同じでなければなりません。

targets が、形式を整えていない dlarray または数値配列の場合、関数は、Y の形式または DataFormat の値を targets に適用します。

ヒント

形式が整った dlarray オブジェクトは、"S" (空間)、"C" (チャネル)、"B" (バッチ)、"T" (時間)、"U" (指定なし) の順序となるように、基となるデータの次元を自動的に並べ替えます。さらに、Y が、形式を整えた dlarray の場合、Ytargets の次元が必ず一致するように、形式を整えた dlarray として targets を指定します。

重み。dlarray オブジェクトまたは数値配列として指定します。

クラスの重みを指定するには、Y"C" (チャネル) 次元とサイズが同じである "C" (チャネル) 次元と、大きさが 1 の "U" (未指定) 次元をもつベクトルを指定します。形式が整った dlarray オブジェクトを使用するか、WeightsFormat 引数を使用して、クラスの重みの次元を指定します。

観測値の重みを指定するには、Y"B" (バッチ) 次元とサイズが同じである "B" (バッチ) 次元をもつベクトルを指定します。形式が整った dlarray オブジェクトを使用するか、WeightsFormat 引数を使用して、クラスの重みの "B" (バッチ) 次元を指定します。

入力の各要素の重みを個別に指定するには、Y と同じサイズの配列として重みを指定します。この場合、weights が、形式を整えていない dlarray オブジェクトであれば、この関数は Y と同じ形式を使用します。または、WeightsFormat 引数を使用して重みの形式を指定します。

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: ClassificationMode="multilabel",DataFormat="CB" は、複数ラベルの分類タスク用のクロスエントロピー損失を評価し、入力データの次元の順序を "CB" として指定します。

分類タスクのタイプ。以下のいずれかの値として指定します。

  • "single-label" — 各観測値は 1 つのクラス ラベルに排他的に割り当てられます (単一ラベルの分類)。この関数は、targets によって指定された単一カテゴリのターゲット値と Y に含まれる対応する予測との間の損失を計算し、観測値の数で平均化します。

  • "multilabel" — 各観測値は複数の独立したクラス ラベルに割り当てられます (複数ラベルの分類)。この関数は、targets によって指定された各カテゴリと Y に含まれるそれらのカテゴリに関する予測との間の損失の合計を計算し、観測値の数で平均化します。このタイプの分類タスクに関するクロスエントロピー損失は、バイナリ クロスエントロピー損失とも呼ばれます。

メモ

バイナリ分類用の分類モードを選択するには、ネットワークの最終の層を考慮しなければなりません。

  • 最後の層の出力サイズが 1 の場合 (例: シグモイド層)、"multilabel" を使用します。

  • 最後の層の出力サイズが 2 の場合 (例: ソフトマックス層)、"single-label" を使用します。

どの要素を損失の計算に含めるかを示すマスク。dlarray オブジェクト、logical 配列、または Y と同じサイズの数値配列として指定します。

この関数は、入力データの要素を損失の計算に含めるかどうかを、マスク内の対応する値が 1 であるか 0 であるかによって決定します。

Mask が、形式を整えた dlarray オブジェクトである場合、その形式は Y の形式と一致しなければなりません。Mask が、形式を整えていない dlarray オブジェクトである場合、この関数は Y と同じ形式を使用します。

DataFormat 引数を指定した場合、この関数は指定された形式もマスクに使用します。

Mask の各次元のサイズは、Y の対応する次元のサイズと一致していなければなりません。既定値は 1 から成る logical 配列です。

ヒント

形式を整えた dlarray オブジェクトは、"S" (空間)、"C" (チャネル)、"B" (バッチ)、"T" (時間)、"U" (指定なし) の順序となるように、基となるデータの次元を自動的に並べ替えます。たとえば、dlarray オブジェクトは、形式が "TSCSBS" であるデータの次元を "SSSCBT" という形式になるように自動的に並べ替えます。

また、Y が、形式を整えた dlarray である場合、Y とマスクの次元が必ず一致するように、形式を整えた dlarray としてマスクを指定します。

損失値配列の削減モード。"sum" または "none" として指定します。

Reduction 引数が "sum" の場合、関数は損失値の配列内のすべての要素を加算します。この場合、出力 loss はスカラーです。

Reduction 引数が "none" の場合、関数は損失値の配列を削減しません。この場合、出力 loss は、Y と同じサイズの、形式が整っていない dlarray オブジェクトです。

Reduction"sum" であるときに、縮小された損失を正規化するための除数。次のいずれかとして指定します。

  • "batch-size"Y に含まれる観測値の数で損失を除算して正規化する。

  • "all-elements"Y に含まれる要素の数で損失を除算して正規化する。

  • "mask-included" — 観測値の数と、観測値ごとのマスクによって損失の計算に含めるように指定された要素の数との積で、損失の値を個別に除算し、損失を正規化する。このオプションを使用するには、Mask オプションを使用してマスクを指定しなければなりません。

  • "none" — 損失を正規化しない。

データの次元の説明。文字ベクトルまたは string スカラーとして指定します。

データ形式は文字列で、各文字は対応するデータ次元のタイプを表します。

各文字は以下のとおりです。

  • "S" — 空間

  • "C" — チャネル

  • "B" — バッチ

  • "T" — 時間

  • "U" — 指定なし

たとえば、シーケンスのバッチを表し、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列があるとします。データは "CBT" (チャネル、バッチ、時間) の形式で記述できます。

"S" または "U" のラベルが付いた次元については、複数回指定できます。ラベル "C""B"、および "T" はそれぞれ 1 回まで使用できます。ソフトウェアは、2 番目の次元の後ろにある大きさが 1 の "U" 次元を無視します。

入力データが、形式を整えた dlarray オブジェクトでない場合は、DataFormat オプションを指定しなければなりません。

詳細については、深層学習のデータ形式を参照してください。

データ型: char | string

重みの次元の説明。文字ベクトルまたは string スカラーとして指定します。

データ形式は文字列で、各文字は対応するデータ次元のタイプを表します。

各文字は以下のとおりです。

  • "S" — 空間

  • "C" — チャネル

  • "B" — バッチ

  • "T" — 時間

  • "U" — 指定なし

たとえば、シーケンスのバッチを表し、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列があるとします。データは "CBT" (チャネル、バッチ、時間) の形式で記述できます。

"S" または "U" のラベルが付いた次元については、複数回指定できます。ラベル "C""B"、および "T" はそれぞれ 1 回まで使用できます。ソフトウェアは、2 番目の次元の後ろにある大きさが 1 の "U" 次元を無視します。

weights が数値ベクトルで、Y に大きさが 1 でない次元が 2 つ以上含まれている場合は、WeightsFormat オプションを指定しなければなりません。

weights がベクトルでない場合、または weightsY が両方ともベクトルである場合、WeightsFormat の既定値は Y の形式と同じです。

詳細については、深層学習のデータ形式を参照してください。

データ型: char | string

出力引数

すべて折りたたむ

クロスエントロピー損失。形式を整えていない dlarray として返されます。出力 loss は、基となるデータ型が入力 Y のデータ型と同じ、形式を整えていない dlarray です。

loss のサイズは、Reduction 引数によって異なります。

アルゴリズム

すべて折りたたむ

拡張機能

すべて展開する

バージョン履歴

R2019b で導入

すべて展開する