このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
crossentropy
分類タスク用のクロスエントロピー損失
構文
説明
クロスエントロピー演算は、単一ラベルおよび複数ラベルの分類タスクについて、ネットワーク予測とターゲット値の間のクロスエントロピー損失を計算します。
関数 crossentropy
は、dlarray
データとして表された予測とターゲットとの間のクロスエントロピー損失を計算します。dlarray
オブジェクトを使用すると、次元にラベルを付けることができるため、高次元のデータをより簡単に扱うことができます。たとえば、"S"
、"T"
、"C"
、"B"
のラベルを使用して、各次元が空間、時間、チャネル、バッチのどの次元に対応するかを示すことができます。特に指定がないその他の次元については、ラベル "U"
を使用します。特定の次元に対して演算を行うオブジェクト関数 dlarray
の場合、dlarray
オブジェクトの形式を直接整えるか、DataFormat
オプションを使用することで、次元ラベルを指定できます。
メモ
関数 trainnet
を使用し、クロスエントロピー損失に基づいて学習させるには、損失関数を "crossentropy"
に設定します。
は、単一ラベルの分類タスク用に、予測を含む形式を整えた loss
= crossentropy(Y
,targets
)dlarray
オブジェクト Y
とターゲット値 targets
との間の categorical クロスエントロピー損失を返します。出力 loss
は、形式を整えていない dlarray
スカラーです。
形式を整えていない入力データの場合は、'DataFormat'
オプションを使用します。
Y
が、形式を整えていない dlarray
である場合、
は、次元形式 loss
= crossentropy(___,'DataFormat',FMT)FMT
も指定します。
は、前の構文の入力引数に加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、loss
= crossentropy(___,Name,Value
)'ClassificationMode','multilabel'
は、複数ラベルの分類タスク用のクロスエントロピー損失を計算します。
例
単一ラベルの分類用のクロスエントロピー損失
10 個のクラスに関する 12 個の観測値の予測スコアから成る配列を作成します。
numClasses = 10;
numObservations = 12;
Y = rand(numClasses,numObservations);
dlY = dlarray(Y,'CB');
dlY = softmax(dlY);
予測スコアのサイズと形式を表示します。
size(dlY)
ans = 1×2
10 12
dims(dlY)
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(dlY,targets)
loss = 1x1 dlarray 2.3343
複数ラベルの分類用のクロスエントロピー損失
10 個のクラスに関する 12 個の観測値の予測スコアから成る配列を作成します。
numClasses = 10;
numObservations = 12;
Y = rand(numClasses,numObservations);
dlY = dlarray(Y,'CB');
予測スコアのサイズと形式を表示します。
size(dlY)
ans = 1×2
10 12
dims(dlY)
ans = 'CB'
0 と 1 から成る数値配列として符号化された、ターゲットのランダム配列を作成します。各観測値は複数のクラスをもつことができます。
targets = rand(numClasses,numObservations) > 0.75; targets = single(targets);
ターゲットのサイズを表示します。
size(targets)
ans = 1×2
10 12
予測とターゲットとの間のクロスエントロピー損失を計算します。複数ラベルの分類用のクロスエントロピー損失を指定するには、'ClassificationMode'
オプションを 'multilabel'
に設定します。
loss = crossentropy(dlY,targets,'ClassificationMode','multilabel')
loss = 1x1 single dlarray 9.8853
加重クロスエントロピー損失
10 個のクラスに関する 12 個の観測値の予測スコアから成る配列を作成します。
numClasses = 10;
numObservations = 12;
Y = rand(numClasses,numObservations);
dlY = dlarray(Y,'CB');
dlY = softmax(dlY);
予測スコアのサイズと形式を表示します。
size(dlY)
ans = 1×2
10 12
dims(dlY)
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(dlY,targets,weights,'WeightsFormat','UC')
loss = 1x1 dlarray 1.1261
入力引数
Y
— 予測
dlarray
| 数値配列
予測。形式を整えた dlarray
、形式を整えていない dlarray
、または数値配列として指定します。Y
が、形式を整えた dlarray
でない場合、DataFormat
オプションを使用して次元形式を指定しなければなりません。
Y
が数値配列の場合、targets
は dlarray
でなければなりません。
targets
— ターゲット分類ラベル
dlarray
| 数値配列
ターゲット分類ラベル。形式を整えた (または形式を整えていない) dlarray
、あるいは数値配列として指定します。
one-hot 符号化されたラベルを含み、サイズと形式が Y
と同じ配列として、ターゲットを指定します。たとえば、Y
が numObservations
行 numClasses
列の配列である場合、観測値 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
の場合、Y
と targets
の次元が必ず一致するように、形式を整えた dlarray
として targets
を指定します。
weights
— 重み
dlarray
| 数値配列
重み。dlarray
または数値配列として指定します。
クラス加重を指定するには、サイズが Y
の 'C'
(チャネル) 次元と同じである 'C'
(チャネル) 次元をもつベクトルを指定します。形式を整えた dlarray
オブジェクトを使用するか、'WeightsFormat'
オプションを使用して、クラス加重の 'C'
(チャネル) 次元を指定します。
観測値の重みを指定するには、サイズが Y
の 'B'
(バッチ) 次元と同じである 'B'
(バッチ) 次元をもつベクトルを指定します。形式を整えた dlarray
オブジェクトを使用するか、'WeightsFormat'
オプションを使用して、クラス加重の 'B'
(バッチ) 次元を指定します。
入力の各要素の重みを個別に指定するには、Y
と同じサイズの配列として重みを指定します。この場合、weights
が、形式を整えていない dlarray
オブジェクトであれば、この関数は Y
と同じ形式を使用します。または、'WeightsFormat'
オプションを使用して加重形式を指定します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name
を引用符で囲みます。
例: 'ClassificationMode','multilabel','DataFormat','CB'
は、複数ラベルの分類タスク用のクロスエントロピー損失を評価し、入力データの次元の順序を 'CB'
として指定します。
ClassificationMode
— 分類タスクのタイプ
"single-label"
(既定値) | "multilabel"
分類タスクのタイプ。以下のいずれかの値として指定します。
"single-label"
— 各観測値は 1 つのクラス ラベルに排他的に割り当てられます (単一ラベルの分類)。この関数は、targets
によって指定された単一カテゴリのターゲット値とY
に含まれる対応する予測との間の損失を計算し、観測値の数で平均化します。"multilabel"
— 各観測値は複数の独立したクラス ラベルに割り当てられます (複数ラベルの分類)。この関数は、targets
によって指定された各カテゴリとY
に含まれるそれらのカテゴリに関する予測との間の損失の合計を計算し、観測値の数で平均化します。このタイプの分類タスクに関するクロスエントロピー損失は、バイナリ クロスエントロピー損失とも呼ばれます。
メモ
バイナリ分類用の分類モードを選択するには、ネットワークの最終の層を考慮しなければなりません。
最後の層の出力サイズが 1 の場合 (例: シグモイド層)、
"multilabel"
を使用します。最後の層の出力サイズが 2 の場合 (例: ソフトマックス層)、
"single-label"
を使用します。
Mask
— どの要素を損失の計算に含めるかを示すマスク
dlarray
| logical 配列 | 数値配列
どの要素を損失の計算に含めるかを示すマスク。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
としてマスクを指定します。
NormalizationFactor
— 縮小された損失を正規化するための序数
"batch-size"
(既定値) | "all-elements"
| "mask-included"
| "none"
DataFormat
— データの次元の説明
文字ベクトル | string スカラー
データの次元の説明。文字ベクトルまたは string スカラーとして指定します。
データ形式は文字列で、各文字は対応するデータ次元のタイプを表します。
各文字は以下のとおりです。
"S"
— 空間"C"
— チャネル"B"
— バッチ"T"
— 時間"U"
— 指定なし
たとえば、シーケンスのバッチを含み、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列があるとします。この配列の形式を "CBT"
(チャネル、バッチ、時間) として指定できます。
"S"
または "U"
のラベルが付いた次元については、複数回指定できます。"C"
、"B"
、"T"
のラベルについては、1 回のみ使用できます。ソフトウェアは、2 番目の次元の後ろにある大きさが 1 の "U"
次元を無視します。
入力データが、形式を整えた dlarray
オブジェクトでない場合は、DataFormat
オプションを指定しなければなりません。
詳細については、Deep Learning Data Formatsを参照してください。
データ型: char
| string
WeightsFormat
— 重みの次元の説明
文字ベクトル | 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
がベクトルでない場合、または weights
と Y
がベクトルである場合、WeightsFormat
の既定値は Y
の形式と同じです。
詳細については、Deep Learning Data Formatsを参照してください。
データ型: char
| string
出力引数
loss
— クロスエントロピー損失
dlarray
クロスエントロピー損失。形式を整えていない dlarray
として返されます。出力 loss
は、基となるデータ型が入力 Y
のデータ型と同じ、形式を整えていない dlarray
です。
loss
のサイズは、'Reduction'
オプションによって異なります。
アルゴリズム
クロスエントロピー損失
関数 crossentropy
は、入力の各要素 Yj について、次の式を使用してクロスエントロピーの対応する要素ごとの損失値を計算します。
ここで、Tj は、Yj に対応するターゲット値です。
その後、この関数は、損失値をスカラーに縮小するため、次の式を使用して要素ごとの損失を縮小します。
ここで、N は正規化係数、mj は要素 j のマスク値、wj は要素 j の重み値です。
損失を縮小しないことを選択した場合、この関数は、次のように損失値に対してマスクと重みを直接適用します。
次の表に、各種タスクにおける損失の計算式を示します。
タスク | 説明 | 損失 |
---|---|---|
単一ラベルの分類 | 互いに排他的なクラスのクロスエントロピー損失。これは、観測値が 1 つのラベルのみをもつ場合に役立ちます。 |
ここで、N および K はそれぞれ観測値とクラスの数です。 |
複数ラベルの分類 | 独立したクラスのクロスエントロピー損失。これは、観測値が複数のラベルをもつことができる場合に役立ちます。 |
ここで、N および K はそれぞれ観測値とクラスの数です。 |
重み付きクラスを使用した単一ラベルの分類 | クラス加重を加味したクロスエントロピー損失。これは、クラスの分布が不均衡なデータセットを使用する場合に役立ちます。 |
ここで、N および K はそれぞれ観測値とクラスの数で、wi はクラス i の重みを表します。 |
sequence-to-sequence 分類 | マスクされたタイムステップを加味したクロスエントロピー損失。これは、パディングされたデータに対応する損失値を無視する場合に役立ちます。 |
ここで、N、S、および K は観測値、タイム ステップ、クラスの数で、mnt は観測値 n のタイム ステップ t のマスク値を表します。 |
深層学習配列の形式
深層学習のほとんどのネットワークと関数は、入力データの各次元に対して異なる方法で演算を行います。
たとえば、LSTM 演算は入力データの時間次元を反復処理し、バッチ正規化演算は入力データのバッチ次元を正規化します。
ラベルが付いた次元をもつ入力データ、または追加のレイアウト情報をもつ入力データを指定するには、"データ形式" を使用します。
データ形式は文字列で、各文字は対応するデータ次元のタイプを表します。
各文字は以下のとおりです。
"S"
— 空間"C"
— チャネル"B"
— バッチ"T"
— 時間"U"
— 指定なし
たとえば、シーケンスのバッチを含み、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列があるとします。この配列の形式を "CBT"
(チャネル、バッチ、時間) として指定できます。
形式を整えた入力データを作成するには、dlarray
オブジェクトを作成し、2 番目の引数を使用して形式を指定します。
形式を整えていないデータを使用して追加のレイアウト情報を指定するには、引数 DataFormat
および WeightsFormat
を使用して形式を指定します。
詳細については、Deep Learning Data Formatsを参照してください。
拡張機能
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意および制限:
以下の入力引数の少なくとも 1 つが、
gpuArray
型の基になるデータをもつgpuArray
またはdlarray
である場合、この関数は GPU で実行されます。Y
targets
weights
'Mask'
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2019b で導入R2023b: TargetCategories
は非推奨
TargetCategories
は推奨されません。代わりに ClassificationMode
を使用してください。コードを更新するには、TargetCategories="exclusive"
のすべてのインスタンスを ClassificationMode="single-label"
に置き換え、TargetCategories="independent"
のすべてのインスタンスを ClassificationMode="multilabel"
に置き換えます。プロパティの間に違いがない場合は、コードをさらに更新する必要があります。関数 crossentropy
の既定の動作は以前と変わりません。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)