sparse_softmax_cross_entropy_with_logitsとsoftmax_cross_entropy_with_logitsの違いは何ですか?


111

私は最近出会ったtf.nn.sparse_softmax_cross_entropy_with_logitsと私は違いが比較されているものを把握することはできませんtf.nn.softmax_cross_entropy_with_logits

使用時にトレーニングベクトルyワンホットエンコードする必要がある唯一の違いはありsparse_softmax_cross_entropy_with_logitsますか?

APIを読んでも、と比較して他の違いを見つけることができませんでしたsoftmax_cross_entropy_with_logits。しかし、なぜ追加の機能が必要なのでしょうか。

ワンホットエンコードされたトレーニングデータ/ベクトルが提供されている場合softmax_cross_entropy_with_logits、と同じ結果を生成するべきではありませんsparse_softmax_cross_entropy_with_logitsか?


1
両方を使用できる場合(たとえば、排他的なイメージラベルを使用)、それらのパフォーマンスを比較することに興味があります。スパースバージョンは、少なくともメモリに関してはより効率的であると思います。
Yibo Yang

1
この質問も参照してください。この質問では、テンソルフローのすべてのクロスエントロピー関数について説明しています(たくさんの関数があることがわかります)。
Maxim

回答:


175

2つの異なる関数を使用すると、同じ結果が得られるので便利です。

違いは簡単です:

  • の場合sparse_softmax_cross_entropy_with_logits、ラベルの形状は[batch_size]で、dtypeはint32またはint64でなければなりません。各ラベルは範囲内の整数です[0, num_classes-1]
  • の場合softmax_cross_entropy_with_logits、ラベルの形状は[batch_size、num_classes]およびdtype float32またはfloat64でなければなりません。

で使用されてsoftmax_cross_entropy_with_logitsいるラベルは、で使用されているラベルの1つのホットバージョンですsparse_softmax_cross_entropy_with_logits

もう1つの小さな違いはsparse_softmax_cross_entropy_with_logits、を使用すると、ラベルとして-1を指定して0、このラベルを失う可能性があることです。


15
-1は正しいですか?ドキュメントを読むと、「ラベルの各エントリは[0、num_classes]のインデックスである必要があります。他の値は、この演算がCPUで実行されると例外を発生させ、GPUの対応する損失および勾配行に対してNaNを返します。」
user1761806 2017

1
[0、num_classes)= [0、num_classes-1]
Karthik C

24

受け入れられた回答に2つのことを追加したいと思います。TFのドキュメントにも記載されています。

最初:

tf.nn.softmax_cross_entropy_with_logits

注:クラスは相互に排他的ですが、それらの確率は必ずしもそうである必要はありません。必要なのは、ラベルの各行が有効な確率分布であることだけです。そうでない場合、勾配の計算は不正確になります。

第二:

tf.nn.sparse_softmax_cross_entropy_with_logits

注:この操作では、特定のラベルの確率は排他的と見なされます。つまり、ソフトクラスは許可されず、ラベルベクトルは、ロジットの各行(各ミニバッチエントリ)の真のクラスに対して単一の特定のインデックスを提供する必要があります。


4
クラスが相互に排他的でない場合、何を使用する必要がありますか。複数のカテゴリーラベルを組み合わせる場合はどうでしょうか。
Hayro、2017

私もこれを読みました。つまり、クラス確率をクロスエントロピーに適用するのではなく、ワンホットベクトルではありません。
Shamane Siriwardhana 2017年

@Hayro-1つのホットエンコーディングを実行できないことを意味しますか?別のモデルを見る必要があると思います。これは、「4つのバイナリロジスティック回帰分類子を作成する方が適切だ」と述べています。まず、クラスを分離できることを確認します。
アシュリー

21

どちらの関数も同じ結果を計算し、sparse_softmax_cross_entropy_with_logitsは、ワンホットエンコーディングで変換する代わりに、スパースラベルのクロスエントロピーを直接計算します

これを確認するには、次のプログラムを実行します。

import tensorflow as tf
from random import randint

dims = 8
pos  = randint(0, dims - 1)

logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32)
labels = tf.one_hot(pos, dims)

res1 = tf.nn.softmax_cross_entropy_with_logits(       logits=logits, labels=labels)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos))

with tf.Session() as sess:
    a, b = sess.run([res1, res2])
    print a, b
    print a == b

ここではlogits、長さのランダムなベクトルを作成し、dimsワンホットエンコードされたラベルを生成します(ここでの要素posは1で、他は0です)。

その後、softmaxとスパースsoftmaxを計算し、それらの出力を比較します。数回再実行して、常に同じ出力が生成されることを確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.