Revenir au contenu principal

TensorFlow™ sur Databricks

Illustration

Espaces réservés

Jusqu'à présent, nous avons utilisé des variables pour gérer nos données, mais il existe une structure plus simple, l'espace réservé (ou placeholder). Un espace réservé est simplement une variable à laquelle nous attribuerons des données ultérieurement. Il permet de créer des opérations et de développer un graphe de calcul sans avoir de données. Dans la terminologie de TensorFlow, nous injectons des données dans le graphe au moyen de ces espaces réservés.

 

import tensorflow as tf

x = tf.placeholder("float",  None)
y = x * 2

with tf.Session() as session:
    result = session.run(y,  feed_dict={x: [1, 2, 3]})
    print(result)

 

Cet exemple a un fonctionnement un peu différent de celui des précédents. Examinons-le en détail.

Tout d'abord, nous importons le tensorflow, comme d'habitude. Ensuite, nous créons un espace réservé appelé x. C'est un emplacement de la mémoire où nous stockerons une valeur par la suite.

Nous allons ensuite créer un tenseur correspondant à la multiplication de x par 2. Notez que nous n'avons pas encore défini de valeur initiale pour x.

Nous avons défini l'opération y et nous pouvons l'exécuter dans une session. Créons un objet de session et exécutons uniquement la variable y. Cette approche a un avantage : si nous avons défini un grand graphe d'opérations, cela nous permet d'exécuter un petit segment du graphe seulement. Cette évaluation de sous-graphe est d'ailleurs l'un des grands intérêts de TensorFlow, qui n'est pas présent dans bien d'autres bibliothèques du même type.

Pour exécuter y, il faut connaître les valeurs de x. Nous allons les définir dans l'argument feed_dict de run. Nous déclarons que les valeurs de x sont [1, 2 ,3]. Nous exécutons y, ce qui nous donne le résultat  [2, 4, 6].

Les espaces réservés n'ont pas besoin d'avoir une taille statique. Modifions notre programme pour autoriser x à avoir n'importe quelle longueur. Changeons la définition de x :

 

x = tf.placeholder("float",  None)

 

Maintenant que les valeurs de x sont définies dans feed_dict, nous pouvons avoir n'importe quel nombre de valeurs. Le code devrait toujours fonctionner et délivrer la même réponse, mais il fonctionnera aussi quel que soit le nombre de valeurs dans feed_dict.

Les espaces réservés peuvent également avoir plusieurs dimensions, ce qui permet de stocker des tableaux. Dans l'exemple suivant, nous créons une matrice de 3 par 2 et nous y stockons des nombres. Nous utilisons ensuite la même opération qu'avant pour doubler les nombres par élément.

 

import tensorflow as tf

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

with tf.Session() as session:
    x_data = [[1, 2, 3],
              [4, 5, 6],]
    result = session.run(y,  feed_dict={x: x_data})
    print(result)

 

La première dimension de l'espace réservé est None, ce qui signifie que nous pouvons avoir n'importe quel nombre de lignes. La deuxième dimension est fixée à 3, ce qui veut dire que chaque ligne doit contenir trois colonnes de données.

Nous pouvons l'étendre à un nombre arbitraire de dimensions None. Dans cet exemple, nous chargeons l'image de notre dernière leçon, puis nous créons un espace réservé qui va accueillir une tranche de cette image. Cette image est un segment 2D de l'image, mais chaque « pixel » comporte trois composants (rouge, vert, bleu). Il nous faut donc None pour les deux premières dimensions, mais il nous faut 3 (quoique None fonctionnerait aussi) pour la dernière dimension. Nous utilisons ensuite la méthode slice de TensorFlow pour extraire un sous-segment de l'image et intervenir dessus.

 

import tensorflow as tf
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import os

# First, load the image again
dir_path = os.path.dirname(os.path.realpath(__file__))
filename = dir_path + "/MarshOrchid.jpg"
raw_image_data = mpimg.imread(filename)

image = tf.placeholder("uint8",  [None, None, 3])
slice = tf.slice(image,  [1000, 0, 0], [3000, -1, -1])

with tf.Session() as session:
    result = session.run(slice,  feed_dict={image: raw_image_data})
    print(result.shape)

plt.imshow(result)
plt.show()

 

  1. Vous retrouverez les autres fonctions de TensorFlow pour les tableaux dans la documentation officielle.
  2. Découpez l'image en quatre « coins » et rassemblez-la ensuite.
  3. Convertissez l'image en niveau de gris. Pour ce faire, vous pouvez afficher uniquement l'un des trois canaux de couleur. Mais vous pouvez aussi calculer la moyenne des trois canaux et en faire la couleur grise.