web-dev-qa-db-ja.com

ランクの不一致:ラベルのランク(2を受け取った)は、ロジットのランクから1を引いた(2を受け取った)に等しくなければなりません

オブジェクトが画像に存在するかどうかを予測するためにDNNを構築しています。私のネットワークには2つの隠れ層があり、最後の層は次のようになります。

  # Output layer
  W_fc2 = weight_variable([2048, 1])
  b_fc2 = bias_variable([1])

  y = tf.matmul(h_fc1, W_fc2) + b_fc2

次に、ラベルのプレースホルダーがあります:

y_ = tf.placeholder(tf.float32, [None, 1], 'Output')

トレーニングをバッチで実行します(したがって、出力レイヤーの形状の最初の引数はNoneです)。

次の損失関数を使用します。

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
    y[:, :1], y_[:, :1], name='xentropy')
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
predict_hand = tf.greater(y, 0.5)
correct_prediction = tf.equal(tf.to_float(predict_hand), y_)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

しかし、実行時に次のエラーが発生しました:

ランクの不一致:ラベルのランク(受信2)は、ロジットのランクから1(受信2)を引いたものに等しくなければなりません。

ラベルレイヤーの形状を変更する必要があると思いますが、それが何を期待しているかはわかりません。 documentation で調べたところ、次のように書かれています:

logits:ランクrおよび形状[d_0、d_1、...、d_ {r-2}、num_classes]およびdtype float32またはfloat64のスケールなしログ確率。ラベル:形状[d_0、d_1、...、d_ {r-2}]およびdtype int32またはint64のテンソル。ラベルの各エントリは、[0、num_classes)のインデックスでなければなりません。

クラスが1つだけの場合、ラベルはどのように表示されますか(現在は0または1です)。助けていただければ幸いです

9

tf.nn.sparse_softmax_cross_entropy_with_logitsのドキュメント*から:

「一般的な使用例は、形状[batch_size、num_classes]のロジットと形状[batch_size]のラベルを持つことです。しかし、より高い次元がサポートされています。」

したがって、ラベルテンソルの形状は[None]である必要があります。形状[None, 1]または形状[None]の特定のテンソルには、同じ数の要素が含まれることに注意してください。

具体的なダミー値を使用した入力例:

>>> logits = np.array([[11, 22], [33, 44], [55, 66]])
>>> labels = np.array([1, 0, 1])

ミニバッチに3つの例がある場合、最初の例のlogitsは11と22であり、0と1の2つのクラスがあります。

* https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits

7

問題は、ネットワークのアクティベーション機能にある可能性があります。 sparse_softmaxの代わりにtf.nn.softmax_cross_entropy_with_logitsを使用します。これで問題は解決します。

5
Rubens_Zimbres

要するに、ここにit の実装があります

    cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
            logits=hypothesis,labels=tf.argmax(Y,1)))

sparse_softmax_cross_entropy_with_logits

ロジットとラベル間のスパースソフトマックスクロスエントロピーを計算します

クラスが相互排他的である個別の分類タスクの確率誤差を測定します(各エントリは正確に1つのクラスにあります)。

たとえば、各CIFAR-10画像には1つのラベルのみがラベル付けされます。画像には犬またはトラックを使用できますが、両方は使用できません。

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

soft softmax分類確率分布の各エントリについては、softmax_cross_entropy_with_logits

警告:この操作は、効率化のために内部的にロジットに対してソフトマックスを実行するため、スケールなしのロジットが必要です。誤った結果が生成されるため、softmaxの出力でこのopを呼び出さないでください。

一般的な使用例は、形状[batch_size、num_classes]のロジットと形状[batch_size]のラベルを持つことです。しかし、より高い次元がサポートされています。

混乱を避けるために、この関数には名前付き引数のみを渡す必要があることに注意してください。

softmax_cross_entropy_with_logits_v2 および softmax_cross_entropy_with_logits

ロジットとラベル間のソフトマックスクロスエントロピーを計算します。 (非推奨)

この関数IS非推奨。将来のバージョンでは削除されます。

更新の手順:

TensorFlowの将来のメジャーバージョンでは、デフォルトでbackpropのラベル入力にグラデーションが流れるようになります。バックプロパゲーションはロジットにのみ発生します。ロジットとラベルの両方への逆伝播を可能にするクロスエントロピー損失を計算するには、softmax_cross_entropy_with_logits_v2を参照してください。

クラスが相互に排他的である個別の分類タスクの確率エラーを測定します(各エントリは正確に1つのクラスにあります)。

たとえば、各CIFAR-10画像には1つのラベルのみがラベル付けされています。画像は犬またはトラックのいずれかで、両方ではありません。

softmax_cross_entropy_with_logits_v2の同じ実装です。

    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
            logits=hypothesis,labels=Y))
2
Hong Cheng

どうして〜しなきゃいけない

「一般的な使用例は、形状[batch_size、num_classes]のロジットと形状[batch_size]のラベルを持つことです。しかし、より高い次元がサポートされています。」

here および here を含む多くのチュートリアルでは、ラベルのサイズは[None,10]およびロジットのサイズは[None,10] 同様に。

1
Nicky Lim