Frage

Ich habe eine Reihe von Listen wie [1,2,3,4] [2,3,4] [1,2] [2,3,4,6,8,10], deren Längen sind Offensichtlich Unsahmer.

Wie kann ich dies als Eingabe von Platzhalter in Tensorflow verwenden?

Wie ich es ausprobiert habe, wird die folgende Einstellung aufgenommen.

tf.constant ([[1,2], [1,2,3] ...], dtype = tf.int32)

Also denke ich Platzhalter kann nicht durch die obere Eingabe von Listen festgelegt werden.

Gibt es eine Lösung?

Bearbeiten:

Das Folgende ist mein Beispiel. Wie kann man es ohne Fehler laufen lassen?

enter image description here

War es hilfreich?

Lösung

Wenn Sie ein Numpy -Array wie folgt erstellen:

x_data = np.array( [[1,2],[4,5,6],[1,2,3,4,5,6]])

Der interne numpy DTYPE ist "Objekt":

array([[1, 2], [4, 5, 6], [1, 2, 3, 4, 5, 6]], dtype=object)

und dies kann nicht als Tensor im Tensorflow verwendet werden. In jedem Fall müssen die Tensoren in jeder Dimension gleiche Größe haben, sie können nicht "zerlumpt" und eine Form haben, die durch eine einzelne Zahl in jeder Dimension definiert ist. TensorFlow geht im Grunde genommen über alle seine Datentypen aus. Obwohl die Designer von TensorFlow es theoretisch schreiben könnten, akzeptieren es zerlumpte Arrays und beinhalten eine Konvertierungsfunktion, diese Art von Auto-Casting ist nicht immer eine gute Idee, da sie ein Problem im Eingabescode verbergen könnte.

Sie müssen also die Eingabedaten padeln, um sie zu einer verwendbaren Form zu machen. Bei einer schnellen Suche fand ich Dieser Ansatz im Stapelüberlauf, repliziert als Änderung in Ihrem Code:

import tensorflow as tf
import numpy as np

x = tf.placeholder( tf.int32, [3,None] )
y = x * 2

with tf.Session() as session:
    x_data = np.array( [[1,2],[4,5,6],[1,2,3,4,5,6]] )

    # Get lengths of each row of data
    lens = np.array([len(x_data[i]) for i in range(len(x_data))])

    # Mask of valid places in each row
    mask = np.arange(lens.max()) < lens[:,None]

    # Setup output array and put elements from data into masked positions
    padded = np.zeros(mask.shape)
    padded[mask] = np.hstack((x_data[:]))

    # Call TensorFlow
    result = session.run(y, feed_dict={x:padded})

    # Remove the padding - the list function ensures we 
    # create same datatype as input. It is not necessary in the case
    # where you are happy with a list of Numpy arrays instead
    result_without_padding = np.array(
       [list(result[i,0:lens[i]]) for i in range(lens.size)]
    )
    print( result_without_padding )

Ausgabe ist:

[[2, 4] [8, 10, 12] [2, 4, 6, 8, 10, 12]]

Sie müssen die Polsterung am Ende nicht entfernen - nur dann, wenn Sie Ihre Ausgabe im selben zerlumpten Array -Format anzeigen müssen. Beachten Sie auch, dass Sie, wenn Sie das resultierende Fütterung haben padded Daten zu komplexeren Routinen, Nullen - oder anderen Polsterdaten, wenn Sie sie ändern - können von jedem von Ihnen implementierten Algorithmus verwendet werden.

Wenn Sie viele kurze Arrays und nur ein oder zwei sehr lange haben, sollten Sie in Betracht ziehen, eine zu verwenden spärliche Tensordarstellung Speicher sparen und Berechnungen beschleunigen.

Andere Tipps

Als Alternative zur Verwendung von gepolsterten Arrays können Sie einfach alle Ihre Daten als eine große Spaghetti -Zeichenfolge füttern und dann Origami im Tensorflow -Diagramm durchführen

Beispiel:

import tensorflow as tf
import numpy as np

sess = tf.InteractiveSession()

noodle = tf.placeholder(tf.float32, [None])
chop_indices = tf.placeholder(tf.int32, [None,2])

do_origami = lambda list_idx: tf.gather(noodle, tf.range(chop_indices[list_idx,0], chop_indices[list_idx,1]))

print( [do_origami(list_idx=i).eval({noodle:[1,2,3,2,3,6], chop_indices:[[0,2],[2,3],[3,6]]}).tolist() for i in range(3)] )

Ergebnis:

[[1.0, 2.0], [3.0], [2.0, 3.0, 6.0]]

Wenn Sie jedoch eine variable Anzahl von inneren Listen haben, dann viel Glück. Sie können keine Liste von tf.whil_loop zurückgeben und Sie können nicht einfach ein Listenverständnis wie oben verwenden, sodass Sie die Berechnungen für jede innere Liste separat durchführen müssen.

import tensorflow as tf

sess = tf.InteractiveSession()

my_list = tf.Variable(initial_value=[1,2,3,4,5])

init = tf.global_variables_initializer()

sess.run(init)

sess.run(my_list)

Ergebnis: Array ([1, 2, 3, 4, 5])

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top