13
votes

Valeurs du tenseur d'impression TF 2.0

J'apprends la dernière version de Tensorflow (2.0) et j'ai essayé d'exécuter un code simple pour découper une matrice. En utilisant le décorateur @ tf.function, j'ai créé la classe suivante:

Tensor("sub:0", shape=(20, 1), dtype=float64)

Ainsi, lorsque vous exécutez le code à l'aide d'une matrice numpy, je ne peux pas récupérer les nombres.

time = np.linspace(0,10,20)
magntiudes = np.random.normal(0,1,size=20)
x = np.vstack([time, magntiudes]).T


d = Data()
d.load_data(x)

Production:

class Data:
def __init__(self):
    pass

def back_to_zero(self, input):
    time = tf.slice(input, [0,0], [-1,1])
    new_time = time - time[0][0]
    return new_time

@tf.function
def load_data(self, inputs):
    new_x = self.back_to_zero(inputs)
    print(new_x)

J'ai besoin d'obtenir ce tenseur dans un format numpy, mais TF 2.0 n'a pas la classe tf.Session pour utiliser les méthodes run () ou eval ().

Merci pour toute aide que vous pouvez m'offrir!


0 commentaires

3 Réponses :


13
votes

A l'intérieur du graphe indiqué par le décorateur @tf.function , vous pouvez utiliser tf.print pour imprimer les valeurs de votre tenseur.

class Data:
    def __init__(self):
        pass

    def back_to_zero(self, input):
        time = tf.slice(input, [0,0], [-1,1])
        new_time = time - time[0][0]
        return new_time

    @tf.function
    def load_data(self, inputs):
        new_x = self.back_to_zero(inputs)
        tf.print(new_x) # print inside the graph context
        return new_x

time = np.linspace(0,10,20)
magntiudes = np.random.normal(0,1,size=20)
x = np.vstack([time, magntiudes]).T

d = Data()
data = d.load_data(x)
print(data) # print outside the graph context

Voici comment le code peut être réécrit

tf.print(new_x)

le type tenseur en dehors du contexte tf.decorator est de type tensorflow.python.framework.ops.EagerTensor . Pour le convertir en un tableau numpy, vous pouvez utiliser data.numpy()


2 commentaires

Salut Edkeveked. J'ai ajouté l'instruction tf.print à l'intérieur de la fonction tf.function mais cela ne montre rien.


L'instruction tf.print renvoie uniquement <tf.Operation 'PrintV2_3' type=PrintV2> :-( Qu'est-ce que j'ai fait de mal?



0
votes

Le problème est que vous ne pouvez pas obtenir les valeurs du tenseur directement à l'intérieur du graphique. Donc, vous faites comme @edkeveked suggéré en utilisant tf.print ou changez votre code comme suit:

class Data:
    def __init__(self):
        pass

    def back_to_zero(self, input):
        time = tf.slice(input, [0,0], [-1,1])
        new_time = time - time[0][0]

        return new_time

    @tf.function
    def load_data(self, inputs):
        new_x = self.back_to_zero(inputs)

        return new_x

time = np.linspace(0,10,20)
magntiudes = np.random.normal(0,1,size=20)
x = np.vstack([time, magntiudes]).T

d = Data()
data = d.load_data(x)
print(data.numpy())


1 commentaires

Gorjan, merci pour votre réponse. Votre solution me montre l'erreur suivante: l'objet "Tensor" n'a pas d'attribut "numpy"



1
votes

Le même problème, comment simplement imprimer la valeur d'un tenseur? J'ai perdu déjà une demi-journée. Se déplacer lentement mais sûrement vers Pytorch ...


0 commentaires