Tp2: Deep Learning: Tensorflow
Tp2: Deep Learning: Tensorflow
Tp2: Deep Learning: Tensorflow
TensorFlow
TensorFlow est utilisé dans une grande variété d'applications d'apprentissage automatique,
y compris la vision par ordinateur, le traitement du langage naturel, la reconnaissance
vocale, la recommandation, la détection d'anomalies, etc. Il est largement adopté par
l'industrie et la recherche pour ses performances, sa flexibilité et sa robustesse.
Keras
Keras est l’une des bibliothèques Python les plus puissantes et les plus faciles à utiliser pour
les modèles d’apprentissage profond et qui permet l’utilisation des réseaux de neurones de
manière simple. Keras englobe les bibliothèques de calcul numérique Theano et
TensorFlow. Pour définir un modèle de deep learning, on définit les caractéristiques
suivantes :
Nombre de couches ;
Types des couches ;
Nombre de neurones dans chaque couche;
Fonctions d’activation de chaque couche ;
Taille des entrées et des sorties.
Le type de couches qu’on va utiliser est le type dense. Les couches denses sont les plus
populaires car il s’agit d’une couche de réseau neuronal ordinaire où chacun de ses neurones
est connecté aux neurones de la couche précédente et de la couche suivante.
Pour ce qui est du nombre de neurones dans la couche d’entrée il est le même que le
nombre de caractéristiques de l’ensemble de données. Dans la suite de ce tutoriel, nous
allons essayer de construire un modèle d’apprentissage profond.
Exercice 1
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
plt.tight_layout()
plt.show()
# Compilation du modele
model.compile(optimizer='adam',
loss=
keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
# Entrainement du modele
model.fit(X_train, y_train, epochs=10)
# Evaluation du modele
test_loss, test_acc = model.evaluate(X_test, y_test)
print('Test accuracy:', test_acc)
print(predictions[:10])
print(y_test[:10])
Exercice 2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
1. Dataset
2. Fonctions du modele
def initialisation(X):
W = np.random.randn(X.shape[1], 1)
b = np.random.randn(1)
return (W, b)
def model(X, W, b):
Z = X.dot(W) + b
A = 1 / (1 + np.exp(-Z))
return A
Loss = []
for i in range(n_iter):
A = model(X, W, b)
Loss.append(log_loss(A, y))
dW, db = gradients(A, X, y)
W, b = update(dW, db, W, b, learning_rate)
y_pred = predict(X, W, b)
print(accuracy_score(y, y_pred))
plt.plot(Loss)
plt.show()
return (W, b)
W, b = artificial_neuron(X, y)
3. Frontiere de décision
x1 = np.linspace(-1, 4, 100)
x2 = ( - W[0] * x1 - b) / W[1]
Exercice 3
Pour appliquer un modèle de deep learning, l’ensemble de données ne doit contenir que
des variables numériques. Alors, on va encoder les variables catégorielles. Dans un
premier temps, on affiche le type de données de chaque colonne de la dataset.
Alors, on va sélectionner des variables qui représenteront notre dataset (pour ne pas
avoir beaucoup de colonnes après l’encodage des valeurs catégorielles ce qui pourrait
impliquer le sur-apprentissage du modèle) puis on transforme ces données catégorielles
en utilisant la fonction get_dummies() de la bibliothèque pandas.
On standardise ensuite les variables afin de les avoir sur la même échelle.
#Standardisation
variables_pred = train.columns
for col in variables_pred:
col_moyenne = train[col].mean()
col_ecart_type = train[col].std()
if col_ecart_type == 0:
col_ecart_type = 1e-20
train[col] = (train[col] - col_moyenne) / col_ecart_type
test[col] = (test[col] - col_moyenne) / col_ecart_type
modele = keras.Sequential([
layers.Dense(64, activation = 'relu', input_shape =
[train.shape[1]]),
layers.Dropout(0.3, seed = 2),
layers.Dense(64, activation = 'swish'),
layers.Dense(64, activation = 'relu'),
layers.Dense(64, activation = 'swish'),
layers.Dense(64, activation = 'relu'),
layers.Dense(64, activation = 'swish'),
layers.Dense(1)])
On crée une instance du Sequential() de la bibliothèque Keras, celle-ci superpose un
ensemble de couches pour en créer un seul modèle. On lui passe en paramètre une liste
de couches qu’on souhaite utiliser pour notre modèle.
Comme vous allez le remarquer dans ce modèle, on a créé plusieurs couches denses et
une seule couche de type Dropout. La première couche est la couche d’entrée, son
nombre de neurones est égal au nombre de caractéristiques de l’ensemble de données.
Remarque :
Pour la couche Dropout, on a diminué de 30% le nombre des données d’entrée afin
d’éviter le phénomène du overfitting. La graine prend une valeur de 2 pour avoir des
résultats plus reproductibles.
Finalement, la dernière couche dense avec un seul neurone est la couche de sortie. Par
défaut, elle prend la fonction d’activation linéaire.
Compilation du modèle
L’étape suivante est la compilation du modèle. Pour ce faire, il faut choisir :
La fonction de perte : utilisée pour diminuer l’erreur. Plus l’erreur est faible plus le
modèle est précis ;
L’optimiseur : aide à obtenir de meilleurs résultats pour la fonction de perte ;
Métriques : utilisées pour évaluer le modèle.
Dans le code suivant nous avons utilisé la fonction de perte comme étant l’erreur
quadratique moyenne avec l’optimiseur RMSprop qu’on lui donne un taux
d’apprentissage de 0,001. Et pour la métrique nous avons utilisé l’erreur absolue
moyenne qui va avec la fonction de perte.
Entrainement du modèle
Dans ce qui suit, on entraine le modèle sur le jeu de données train. Celui-ci passe 70
fois sur l’ensemble de données pour en tirer le meilleur résultat possible. Ensuite, 20%
des données d’entrainement sont utilisées pour la validation.
La fonction fit() affiche la valeur de la fonction de perte et la métrique pour chaque
époque.
training = modele.fit (train, train_cible, epochs = 70,
validation_split = 0.2)
Prévision
Avant de commencer d’utiliser le modèle pour nos prévisions, nous allons illustrer
comment la fonction de perte et la mae vont changer. Remarquons que ces valeurs ont
diminué au fil du temps, alors le modèle est devenu plus précis.
historique = pd.DataFrame(training.history)
historique['epoque'] = training.epoch
On prend une unité des valeurs de test pour avoir sa prédiction en utilisant notre modèle.
Ensuite, on affiche la valeur de la prédiction et la valeur actuelle pour les comparer.
test1 = test.iloc[[10]]
test_prediction = modele.predict(test1).squeeze()
test_label = test_cible.iloc[10]
print("Prédiction du modèle = {:.2f}".format(test_prediction))
print("Valeur actuelle = {:.2f}".format(test_label))
Travail à réaliser