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!
3 Réponses :
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()
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?
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())
Gorjan, merci pour votre réponse. Votre solution me montre l'erreur suivante: l'objet "Tensor" n'a pas d'attribut "numpy"
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 ...