2017-07-18 6 views
0

Ich möchte fragen, ob tf.one_hot() Funktion SparseTensor als "Indizes" -Parameter unterstützt. Ich möchte eine Multi-Label-Klassifikation machen (jedes Beispiel hat mehrere Labels), die einen cross_entropy-Verlust berechnen muss.Unterstützt tf.one_hot() SparseTensor als Indexparameter?

Ich versuche, direkt die SparseTensor in der „Indizes“ Parameter zu setzen, aber es stellt sich die folgende Fehlermeldung:

Typeerror: Fehler Objekt vom Typ Tensor zu konvertieren. Inhalt: SparseTensor (Indizes = Tensor ("read_batch_features/fifo_queue_Dequeue: 106", Form = (?, 2), dtype = int64, Gerät =/job: worker), Werte = Tensor ("string_to_index_Lookup: 0", shape = (? ,), dtype = int64, Gerät =/job: worker), dichte_form = Tensor ("read_batch_features/fifo_queue_Dequeue: 108", form = (2,), dtype = int64, Gerät =/job: worker)). Erwägen Sie, Elemente auf einen unterstützten Typ zu übertragen.

Irgendwelche Vorschläge zur möglichen Ursache?

Danke.

Antwort

0

one_hot unterstützt keinen SparseTensor als Indexparameter. Sie können jedoch den Indizes/Werte-Tensor des spärlichen Tensors als den Indexparameter übergeben, der Ihr Problem lösen könnte.

0

Sie könnten einen anderen SparseTensor der Form (batch_size, num_classes) aus dem ursprünglichen SparseTensor aufbauen. Zum Beispiel, wenn Sie Ihre Klassen in einer einzigen String-Funktion Spalte halten (durch Leerzeichen getrennt), können Sie die folgende verwenden:

import tensorflow as tf 

all_classes = ["class1", "class2", "class3"] 
classes_column = ["class1 class3", "class1 class2", "class2", "class3"] 

table = tf.contrib.lookup.index_table_from_tensor(
    mapping=tf.constant(all_classes) 
) 
classes = tf.constant(classes_column) 
classes = tf.string_split(classes) 
idx = table.lookup(classes) # SparseTensor of shape (4, 2), because each of the 4 rows has at most 2 classes 
num_items = tf.cast(tf.shape(idx)[0], tf.int64) # num items in batch 
num_entries = tf.shape(idx.indices)[0] # num nonzero entries 

y = tf.SparseTensor(
    indices=tf.stack([idx.indices[:, 0], idx.values], axis=1), 
    values=tf.ones(shape=(num_entries,), dtype=tf.int32), 
    dense_shape=(num_items, len(all_classes)), 
) 
y = tf.sparse_tensor_to_dense(y, validate_indices=False) 

with tf.Session() as sess: 
    tf.tables_initializer().run() 
    print(sess.run(y)) 

    # Outputs: 
    # [[1 0 1] 
    # [1 1 0] 
    # [0 1 0] 
    # [0 0 1]] 

Hier ist die idx ein SparseTensor ist. Die erste Spalte ihrer Indizes idx.indices[:, 0] enthält die Zeilennummern des Stapels und ihre Werte idx.values enthält den Index der entsprechenden Klassen-ID. Wir kombinieren diese beiden zu dem neuen y.indices.

Für eine vollständige Implementierung der Multi-Label-Klassifizierung, siehe "Option 2" von https://stackoverflow.com/a/47671503/507062

Verwandte Themen