Question

I ai un certain nombre de listes, telles que [1,2,3,4], [2,3,4], [1,2], [2,3,4,6,8,10], dont les longueurs sont évidemment unsame.

Comment puis-je utiliser comme entrée d'espace réservé dans tensorflow?

Comme je l'ai essayé, le paramètre suivant soulèvera l'erreur.

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

Je suppose que espace réservé ne peut pas être réglé par l'entrée supérieure des listes.

Y at-il une solution?

Modifier :

Ce qui suit est mon exemple. Comment faire fonctionner sans erreur?

 entrer image description ici

Était-ce utile?

La solution

Lorsque vous créez un tableau numpy comme ceci:

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

Le DTYPE Numpy interne est "objet":

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

et cela ne peut pas être utilisé comme Tensor dans tensorflow. Dans tous les cas, tenseurs doit avoir la même taille dans chaque dimension, ils ne peuvent pas être « loqueteux » et doit avoir une forme définie par un seul numéro dans chaque dimension. Tensorflow assume essentiellement ce sur tous ses types de données. Bien que les concepteurs de tensorflow pourraient écrire dans faire de la théorie, il accepte des tableaux en haillons et comprennent une fonction de conversion, ce genre d'auto-coulée n'est pas toujours une bonne idée, car il pourrait se cacher un problème dans le code d'entrée.

Vous devez tampon les données d'entrée pour en faire une forme utilisable. Sur une recherche rapide, j'ai trouvé cette approche dans Stack Overflow , reproduit comme un changement à votre 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 )

sortie est la suivante:

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

Vous ne devez pas enlever le rembourrage à la fin - faire que si vous avez besoin de montrer votre sortie dans le même format de tableau en haillons. Notez également que lorsque vous nourrissez les données résultantes padded à des routines plus complexes, les zéros - ou d'autres données de remplissage si vous le changer - peut s'utilisé par tout algorithme que vous avez mis en œuvre

.

Si vous avez beaucoup de tableaux courts et seulement un ou deux très longues, alors vous voudrez peut-être envisager d'utiliser un représentation tenseur clairsemée pour économiser de la mémoire et de la vitesse des calculs.

Autres conseils

Comme une alternative à l'utilisation de tableaux rembourrés, vous pouvez simplement nourrir toutes vos données comme une grande chaîne spaghetti, puis faire l'origami à l'intérieur du graphique tensorflow

Exemple:

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)] )

Résultat:

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

Si vous avez un nombre variable de listes internes, mais, alors bonne chance. Vous ne pouvez pas retourner une liste de tf.while_loop et vous ne pouvez pas utiliser une compréhension de la liste comme ci-dessus afin que vous auriez à faire les calculs séparément pour chaque liste intérieure.

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)

Résultat: array ([1, 2, 3, 4, 5])

Licencié sous: CC-BY-SA avec attribution
scroll top