chainer.functions.softmax_cross_entropy(x, t, normalize=True, cache_score=True, class_weight=None, ignore_label=-1, reduce='mean', enable_double_backprop=False)[source]

プレ-ソフトマックス活性化のための交差エントロピー損失。

 

Parameters:
  • x (Variable or numpy.ndarray or cupy.ndarray) – エレメントが非正規化対数確率を表す多次元配列を保持するVariable: variableの第1軸は、サンプル数を表し、第2軸はクラス数を表す。次元数が2の時、この関数 は通常のソフトマックス交差エントロピーを計算するが、次元数が2以上の場合、複製したソフトマックスの交差エントロピーを計算する。
  • t (Variable or numpy.ndarray or cupy.ndarray) – グランドトゥルースラベルの numpy.int32 ベクトルを保持するvariable。t[i] == ignore_labelの場合、対応する x[i]は無視される。
  • normalize (bool) –  True の場合、この関数は全てのインスタンスの交差エントロピーを正規化する。 False の場合、バッチサイズに添って、正規化のみ行う。
  • cache_score (bool) –  Trueが設定されている場合、この関数は逆方向への演算の際に使用するために、順方向の演算結果を貯めておく。これによって、計算コストは削減されるが、メモリ消費量は増える。enable_double_backprop オプションが  True の場合、このオプションは強制的にオフにされ、この関数は中間値をキャッシュしない。
  • class_weight (Variable or numpy.ndarray or cupy.ndarray) – 第2次元に沿って、損失値を掛ける定荷重の配列。この配列の shapeは (x.shape[1],)でなければならない。この値が Noneでない場合、各クラス荷重 class_weight[i] は実際に y[:, i] に掛けられる。これは、 x の対数ソフトマックス出力に相当し、実際の損失値を計算する前の x と同じshapeとなる。
  • ignore_label (int) – 無視するラベル値。デフォルト値は -1。 引数 tの詳細もお読みください。
  • reduce (str) – 損失値を次元削減するかどうか決定する文字列。 'mean'が設定されている場合、それぞれの交差エントロピーの合計を計算しnormalize オプションに添って、それを正規化する。 'no'の場合、この関数は各インスタンスの交差エントロピーを計算し、それを正規化しない。(normalize オプションは無視される。) この場合、 無視されたインスタンスの損失値は、ターゲット値として ignore_label を持ち、 0が設定される。
  • enable_double_backprop (bool) –  Trueが設定されている場合、 この関数は高階微分をサポートする実装を用いる。Falseの場合、 single-backprop 実装を用いる。. この関数は single-backprop バージョンを使用する。 そちらのほうが速いと予想されるためだ。そのため、2階以上の微分が必要な場合、このオプションを明示的に設定しなければならない。
Returns:

交差エントロピー損失のスカラ配列を持つvariable。  reduce'mean' の場合、スカラ配列。 If reduce'no'の場合、 shape は xと同様になる。

Return type:

Variable

Note

この関数は xでのみ微分可能です。

 

Example

 


>>>
x = np.array([[-1, 0, 1, 2], [2, 0, 1, -1]]).astype('f')
>>> x array([[-1., 0., 1., 2.], [ 2., 0., 1., -1.]], dtype=float32)
>>> t = np.array([3, 0]).astype('i')
>>> t
array([3, 0], dtype=int32)
>>> y = F.softmax_cross_entropy(x, t)
>>> y
variable(0.4401897192001343)
>>> log_softmax = -F.log_softmax(x)
>>> expected_loss = np.mean([log_softmax[row, column].data
                 for row, column in enumerate(t)])
>>> y.array == expected_loss
True