2017-08-15 3 views
1

Ich versuche, einen benutzerdefinierten Schätzer für mein ML-Engine-Paket zu erstellen, und ich habe Probleme, meine Decoder-Eingangsfolge im richtigen Format richtig zu konstruieren. Betrachten Sie Folgendes, wobei label1, label2 eine Sequenz von Labels sein soll.TensorFlow embedding_rnn_decoder 'Tensor' -Objekt ist nicht iterierbar

label1, label2 = tf.decode_csv(rows, record_defaults=[[""], [""]]) 
labels = tf.stack([label1, label2], axis=1) 
label_index = tf.contrib.lookup.index_table_from_file(
    vocabulary_file = label_file) 
label_idx = label_index.lookup(labels) 
features = dict(zip(['decoder_input'], [label_idx])) 

Diese "Features" werden dann als Decoder-Eingang wie folgt übergeben. Wenn ich den decoder_input als Eingabe in meinen benutzerdefinierten Schätzer verwende, stoße ich auf den Fehler 'TypeError:' Tensor '-Objekt ist nicht iterierbar.' hier:

outputs, state = tf.contrib.legacy_seq2seq.embedding_rnn_decoder(
    decoder_inputs = features['decoder_input'], 
    initial_state = curr_layer, 
    cell = tf.contrib.rnn.GRUCell(hidden_units), 
    num_symbols = n_labels, 
    embedding_size = embedding_dims, # should not be hard-coded 
    feed_previous = False) 

Der vollständige Stack-Trace (unten) lässt vermuten, dass der Teil des Codes das Problem verursacht für 'for i in decoder_inputs' from line 296 ist so scheint es ziemlich klar für mich, dass das Problem in ist, wie ich meine decoder_input im input_fn construct() . Ich kann jedoch nicht herausfinden, wie man das Tensor-Objekt zu einer iterierbaren Sequenzliste macht.

Stacktrace:

File "/Users/user/anaconda/envs/tensorflow- 

    cloud/lib/python2.7/sitepackages/tensorflow/contrib/legacy_seq2seq/python/ops/seq2seq.py", line 296, in embedding_rnn_decoder 
    for i in decoder_inputs) 
    File "/Users/user/anaconda/envs/tensorflow-cloud/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 541, in __iter__ 
    raise TypeError("'Tensor' object is not iterable.") 
TypeError: 'Tensor' object is not iterable. 

Kann jemand helfen vor Ort, wie ich richtig meine Etiketten formatiert werden sollte, so dass sie iterable sind? Die Dokumentation besagt, dass decoder_inputs "Eine Liste von 1D im Batch-Format int32 Tensors (Decoder-Eingänge)" sein sollte. also dachte ich, dass es bei staIs eine geeignetere art gibt, die labelfolge zu erzeugen als tf.stack()?

+0

Es sieht so aus, als erwarte das Feature ['decoder_input'] eine Liste. Was ist das bei dir? – Aaron

+0

Ja, es sucht nach einer Liste von 1D-Tensoren. Ich glaube, dass das, was ich eingereicht habe, nur ein 1D-Tensor mit Form [2] ist, der mehr oder weniger aus tf.stack ([label1, label2], axis = 1) generiert wird - ich denke, meine Frage wäre genauer, wie Erstellen Sie eine Liste von 1D-Tensoren. Ist es so einfach wie [label1, label2] anstelle von tf.stack ([label1, label2])? – reese0106

+0

Es will es als Liste. Wenn es nur ein oder zwei Elemente gibt, gibt es nicht viel Grund, ein RNN zu verwenden. Wenn Sie möchten, dass der RNN mit einer einzigen Eingabe arbeitet, wickeln Sie ihn einfach in eckige Klammern, damit er ihn als eine Liste von Tensoren sieht. – Aaron

Antwort

1

Die label_idx Werte ist keine Liste daher sind Sie mit diesem Problem konfrontiert:

Unten Beispiel soll klären, besser:

label_idx = 1 

features = dict(zip(['decoder_input'], [label_idx])) 

features['decoder_input'] 

# 1 output 

wo, als ob ich label_idx auf eine Liste zu ändern:

label_idx = [1] 

features = dict(zip(['decoder_input'], [label_idx])) 

features['decoder_input'] 

# [1] output 

Sie können auch vereinfachen, wie Sie das Wörterbuch erstellen:

features = {'decoder_input': [label_idx]} # if label_idx is a value 
features = {'decoder_input': label_idx} # if label_idx is a list 
Verwandte Themen