4

私はオブジェクトが画像に存在するかどうかを予測するDNNを構築しています。マイネットワークは、2つの隠し層を持っており、最後の層は、次のようになります。ランクの不一致:ラベルのランク(受け取った2)は、ロジットのランクマイナス1(受け取った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)) 

をしかし、実行時に、私は次のエラーを得た:

Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2).

私はそれを期待するのかわからラベル層を再形成ではなく、必要がありますね。私はdocumentationに見上げると、それは言う:

logits: Unscaled log probabilities of rank r and shape [d_0, d_1, ..., d_{r-2}, num_classes] and dtype float32 or float64. labels: Tensor of shape [d_0, d_1, ..., d_{r-2}] and dtype int32 or int64. Each entry in labels must be an index in [0, num_classes).

私はちょうど単一のクラスを持っている場合は、どのような私のラベルは(今それだけで0または1である)のようになりますか?すべてのヘルプはtf.nn.sparse_softmax_cross_entropy_with_logits用ドキュメント*から

答えて

3

を感謝:

"A common use case is to have logits of shape [batch_size, num_classes] and labels of shape [batch_size]. But higher dimensions are supported."

だから私はあなたのラベルテンソルは、形状[None]のものでなければならないと仮定します。 [None, 1]の形状または[None]のテンソルは、同じ数の要素を含むことに注意してください。具体的にダミー値を

例入力:

>>> logits = np.array([[11, 22], [33, 44], [55, 66]]) 
>>> labels = np.array([1, 0, 1]) 
ミニバッチで3例があります

、第例えばlogits 11及び22であり、2つのクラスがあります:0と1

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

+0

私はこれを試しましたが、別のエラーが発生しました。Tensor u'Output:0 'のシェイプ(44,1)の値を'(?、) 'の形で送ることができません。ここで、44はバッチサイズです。 –

+0

私は、シェイプ(?、)のプレースホルダーテンソルにshape(44,1)というラベルのnumpy配列を与えていると思います。 label.flatten()でラベルnumpy配列を平坦化してみてください。これで(44,1)が(44、)に変わります –

0

なぜべきで

"A common use case is to have logits of shape [batch_size, num_classes] and labels of shape [batch_size]. But higher dimensions are supported."

herehereを含む多くのチュートリアルでは、ラベルのサイズは[None,10]であり、ログのサイズは[None,10]です。

+2

その場合、tf.nn.sparse_softmax_cross_entropy_with_logitsの代わりにtf.nn.softmax_cross_entropy_with_logitsを使用してください –

1

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

関連する問題