Les données dans Tensorflow

Méthodetf.data

tf.data permet de construire une classe tf.data.Dataset représentant une séquence d'éléments. Par exemple un élément dans la régression linéaire est un couple xi, yi.

ExempleCréation d'un objet Dataset

L'objet de type Dataset contiendra nos données. Pour notre exemple de régression linéaire, l'objet contiendra les N couples (xi, yi). on utilise la méthode from_tensor_slices de la classe tf.data.Dataset :

1
x = np.array([1, 5, 8, 9 ,10, 15,13, 3,-2],np.float32)
2
y = np.array([-2,-5, -7, -12 ,-15, -5, -12,-10,-5],np.float32)
3
dataset = tf.data.Dataset.from_tensor_slices(( x , y ))

Utilisation de Dataset dans la descente du gradient

MéthodeUtilisation

Nous allons appliquer la descente du gradient en utilisant un objet Dataset dans le programme suivant :

1
import tensorflow as tf
2
import numpy as np
3
4
class Model(object):
5
    def __init__(self, a, b):
6
        self.a = a
7
        self.b = b
8
    def __call__(self, x):
9
        return self.a * x + self.b
10
11
def train(model, inputs, outputs, learning_rate):
12
    with tf.GradientTape() as t:
13
        t.watch([model.a, model.b])
14
        current_loss = perte(model(inputs), outputs)
15
    da, db = t.gradient(current_loss, [model.a, model.b])
16
    model.a = tf.add(model.a,tf.constant(-learning_rate * da))
17
    model.b = tf.add(model.b,tf.constant(-learning_rate * db))
18
        
19
def perte(predicted_y, target_y):
20
    return tf.reduce_mean(tf.square(predicted_y - target_y))
21
  
22
x = np.array([1, 5, 8, 9 ,10, 15,13, 3,-2],np.float32)
23
y = np.array([-2,-5, -7, -12 ,-15, -5, -12,-10,-5],np.float32)
24
dataset = tf.data.Dataset.from_tensor_slices(( x , y ))
25
batch_size = 9
26
num_epochs = 3
27
dataset = dataset.repeat( num_epochs ).batch( batch_size )
28
iterator = dataset.__iter__() 
29
learning_rate = 0.01
30
31
model = Model(tf.Variable(7.3),tf.Variable(5.5))
32
33
print('Perte: ', perte(model(x), y).numpy())
34
print('(a, b) : (', model.a.numpy(),', ',model.b.numpy(),')')
35
36
for epoch in range(num_epochs):
37
    x_batch , y_batch = iterator.get_next()
38
    print('Donnees ajustees :', x_batch,'/',y_batch)
39
    train(model, x_batch, y_batch, learning_rate)
40
print('Perte: ', perte(model(x), y).numpy())
41
print('(a, b) : (', model.a.numpy(),', ',model.b.numpy(),')')
42
43
44

Le résultat de l'exécution est :

Perte: 5729.852

(a, b) : ( 7.3 , 5.5 )

Donnees ajustees : tf.Tensor([ 1. 5. 8. 9. 10. 15. 13. 3. -2.], shape=(9,), dtype=float32) / tf.Tensor([ -2. -5. -7. -12. -15. -5. -12. -10. -5.], shape=(9,), dtype=float32)

Donnees ajustees : tf.Tensor([ 1. 5. 8. 9. 10. 15. 13. 3. -2.], shape=(9,), dtype=float32) / tf.Tensor([ -2. -5. -7. -12. -15. -5. -12. -10. -5.], shape=(9,), dtype=float32)

Donnees ajustees : tf.Tensor([ 1. 5. 8. 9. 10. 15. 13. 3. -2.], shape=(9,), dtype=float32) / tf.Tensor([ -2. -5. -7. -12. -15. -5. -12. -10. -5.], shape=(9,), dtype=float32)

Perte: 162.49437

(a, b) : ( -2.4932983 , 4.371428 )

Dans le programme précédent, l'objet dataset est crée à l'aide des lignes suivantes:

1
2
x = np.array([1, 5, 8, 9 ,10, 15,13, 3,-2],np.float32)
3
y = np.array([-2,-5, -7, -12 ,-15, -5, -12,-10,-5],np.float32)
4
dataset = tf.data.Dataset.from_tensor_slices(( x , y ))
5

x et y sont des tableaux numpy contenant les données.

Ensuite on décide d'effectuer, 3 (num_epochs) itérations de l'algorithme du descente du gradient en utilisant les 9 données (batch size):

1
batch_size = 9
2
num_epochs = 3
3
dataset = dataset.repeat( num_epochs ).batch( batch_size )
4
iterator = dataset.__iter__() 

On prépare les données à l'aide de la ligne dataset.repeat( num_epochs ).batch( batch_size ) et on aura accès aux données pour chaque itération à l'aide de l'objet iterator.

Les données seront accessibles dans la boucle à l'aide de la méthode get_next() :

1
for epoch in range(num_epochs):
2
    x_batch , y_batch = iterator.get_next()
3

Dans une première approche, une boucle a été supprimée :le nombre de données du lot est égal au nombre de données disponibles, le lot (batch size) consomme toutes les données disponibles.