CNTK - Création du premier réseau neuronal

Ce chapitre développera la création d'un réseau neuronal dans CNTK.

Construire la structure du réseau

Afin d'appliquer les concepts CNTK pour construire notre premier NN, nous allons utiliser NN pour classer les espèces de fleurs d'iris en fonction des propriétés physiques de la largeur et de la longueur des sépales, ainsi que de la largeur et de la longueur des pétales. L'ensemble de données que nous utiliserons ensemble de données d'iris qui décrit les propriétés physiques de différentes variétés de fleurs d'iris -

  • Longueur sépale
  • Largeur sépale
  • Longueur des pétales
  • Largeur des pétales
  • Classe ie iris setosa ou iris versicolor ou iris virginica

Ici, nous allons construire un NN régulier appelé NN feedforward. Voyons les étapes de mise en œuvre pour construire la structure de NN -

Step 1 - Tout d'abord, nous allons importer les composants nécessaires tels que nos types de couches, les fonctions d'activation et une fonction qui nous permet de définir une variable d'entrée pour notre NN, à partir de la bibliothèque CNTK.

from cntk import default_options, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import log_softmax, relu

Step 2- Après cela, nous créerons notre modèle en utilisant la fonction séquentielle. Une fois créé, nous l'alimenterons avec les couches que nous voulons. Ici, nous allons créer deux couches distinctes dans notre NN; un avec quatre neurones et un autre avec trois neurones.

model = Sequential([Dense(4, activation=relu), Dense(3, activation=log_sogtmax)])

Step 3- Enfin, afin de compiler le NN, nous allons lier le réseau à la variable d'entrée. Il a une couche d'entrée avec quatre neurones et une couche de sortie avec trois neurones.

feature= input_variable(4)
z = model(feature)

Appliquer une fonction d'activation

Il existe de nombreuses fonctions d'activation parmi lesquelles choisir et choisir la bonne fonction d'activation fera certainement une grande différence dans les performances de notre modèle d'apprentissage en profondeur.

Au niveau de la couche de sortie

Choisir un activation La fonction au niveau de la couche de sortie dépendra du type de problème que nous allons résoudre avec notre modèle.

  • Pour un problème de régression, nous devrions utiliser un linear activation function sur la couche de sortie.

  • Pour un problème de classification binaire, nous devrions utiliser un sigmoid activation function sur la couche de sortie.

  • Pour un problème de classification multi-classes, nous devrions utiliser un softmax activation function sur la couche de sortie.

  • Ici, nous allons construire un modèle pour prédire l'une des trois classes. Cela signifie que nous devons utilisersoftmax activation function au niveau de la couche de sortie.

Au niveau de la couche cachée

Choisir un activation La fonction au niveau de la couche cachée nécessite une certaine expérimentation pour surveiller les performances afin de voir quelle fonction d'activation fonctionne bien.

  • Dans un problème de classification, nous devons prédire la probabilité qu'un échantillon appartienne à une classe spécifique. C'est pourquoi nous avons besoin d'unactivation functioncela nous donne des valeurs probabilistes. Pour atteindre cet objectif,sigmoid activation function peut nous aider.

  • L'un des problèmes majeurs associés à la fonction sigmoïde est le problème du gradient de disparition. Pour surmonter ce problème, nous pouvons utiliserReLU activation function qui couvre toutes les valeurs négatives à zéro et fonctionne comme un filtre pass-through pour les valeurs positives.

Choisir une fonction de perte

Une fois que nous avons la structure de notre modèle NN, nous devons l'optimiser. Pour l'optimisation, nous avons besoin d'unloss function. contrairement àactivation functions, nous avons très peu de choix de fonctions de perte. Cependant, le choix d'une fonction de perte dépendra du type de problème que nous allons résoudre avec notre modèle.

Par exemple, dans un problème de classification, nous devrions utiliser une fonction de perte qui peut mesurer la différence entre une classe prédite et une classe réelle.

fonction de perte

Pour le problème de classification, nous allons résoudre avec notre modèle NN, categorical cross entropyla fonction de perte est le meilleur candidat. Dans CNTK, il est implémenté commecross_entropy_with_softmax qui peut être importé de cntk.losses package, comme suit -

label= input_variable(3)
loss = cross_entropy_with_softmax(z, label)

Métrique

Avec la structure de notre modèle NN et une fonction de perte à appliquer, nous avons tous les ingrédients pour commencer à faire la recette pour optimiser notre modèle d'apprentissage en profondeur. Mais, avant de plonger profondément dans ce sujet, nous devons en apprendre davantage sur les métriques.

cntk.metrics

CNTK a le package nommé cntk.metricsà partir de laquelle nous pouvons importer les métriques que nous allons utiliser. Pendant que nous construisons un modèle de classification, nous utiliseronsclassification_error matrice qui produira un nombre entre 0 et 1. Le nombre entre 0 et 1 indique le pourcentage d'échantillons correctement prédit -

Tout d'abord, nous devons importer la métrique depuis cntk.metrics paquet -

from cntk.metrics import classification_error
error_rate = classification_error(z, label)

La fonction ci-dessus a en fait besoin de la sortie du NN et de l'étiquette attendue comme entrée.