Unités :
La quantité de "neurones", de "cellules" ou de tout autre élément contenu dans la couche.
C'est une propriété de chaque couche, et oui, elle est liée à la forme de la sortie (comme nous le verrons plus tard). Dans votre image, à l'exception de la couche d'entrée, qui est conceptuellement différente des autres couches, vous avez :
- Couche cachée 1 : 4 unités (4 neurones)
- Couche cachée 2 : 4 unités
- Dernière couche : 1 unité
Formes
Les formes sont des conséquences de la configuration du modèle. Les formes sont des tuples représentant le nombre d'éléments d'un tableau ou d'un tenseur dans chaque dimension.
Ex : une forme (30,4,10)
désigne un tableau ou un tenseur à 3 dimensions, contenant 30 éléments dans la première dimension, 4 dans la deuxième et 10 dans la troisième, soit un total de 30*4*10 = 1200 éléments ou nombres.
La forme d'entrée
Ce qui circule entre les couches sont des tenseurs. Les tenseurs peuvent être vus comme des matrices, avec des formes.
Dans Keras, la couche d'entrée elle-même n'est pas une couche, mais un tenseur. C'est le tenseur de départ que vous envoyez à la première couche cachée. Ce tenseur doit avoir la même forme que vos données d'entraînement.
Exemple : si vous avez 30 images de 50x50 pixels en RVB (3 canaux), la forme de vos données d'entrée est la suivante (30,50,50,3)
. Ensuite, votre tenseur de couche d'entrée, doit avoir cette forme (voir les détails dans la section "shapes in keras").
Chaque type de couche nécessite une entrée avec un certain nombre de dimensions :
-
Dense
nécessitent des entrées comme (batch_size, input_size)
- o
(batch_size, optional,...,optional, input_size)
- Les couches convolutionnelles 2D ont besoin d'entrées comme :
- si vous utilisez
channels_last
: (batch_size, imageside1, imageside2, channels)
- si vous utilisez
channels_first
: (batch_size, channels, imageside1, imageside2)
- Les convolutions 1D et les couches récurrentes utilisent
(batch_size, sequence_length, features)
Maintenant, la forme d'entrée est la seule que vous devez définir, car votre modèle ne peut pas la connaître. Vous êtes le seul à le savoir, sur la base de vos données d'entraînement.
Toutes les autres formes sont calculées automatiquement en fonction des unités et des particularités de chaque couche.
Relation entre les formes et les unités - La forme de sortie
Étant donné la forme d'entrée, toutes les autres formes sont des résultats de calculs de couches.
Les "unités" de chaque couche vont définir la forme de la sortie (la forme du tenseur qui est produit par la couche et qui sera l'entrée de la couche suivante).
Chaque type de couche fonctionne d'une manière particulière. Les couches denses ont une forme de sortie basée sur des "unités", les couches convolutionnelles ont une forme de sortie basée sur des "filtres". Mais c'est toujours basé sur une propriété de la couche. (Voir la documentation pour savoir ce que chaque couche produit)
Montrons ce qui se passe avec les couches "denses", qui sont celles qui figurent dans votre graphique.
Une couche dense a une forme de sortie de (batch_size,units)
. Donc, oui, les unités, propriété de la couche, définissent également la forme de la sortie.
- Couche cachée 1 : 4 unités, forme de sortie :
(batch_size,4)
.
- Couche cachée 2 : 4 unités, forme de sortie :
(batch_size,4)
.
- Dernière couche : 1 unité, forme de sortie :
(batch_size,1)
.
Poids
Les pondérations seront entièrement calculées automatiquement en fonction des formes d'entrée et de sortie. Encore une fois, chaque type de couche fonctionne d'une certaine manière. Mais les poids seront une matrice capable de transformer la forme d'entrée en forme de sortie par une opération mathématique.
Dans une couche dense, les poids multiplient toutes les entrées. C'est une matrice avec une colonne par entrée et une ligne par unité, mais ce n'est souvent pas important pour les travaux de base.
Dans l'image, si chaque flèche portait un numéro de multiplication, tous les numéros réunis formeraient la matrice de poids.
Formes dans Keras
Plus tôt, j'ai donné un exemple de 30 images, 50x50 pixels et 3 canaux, ayant une forme d'entrée de (30,50,50,3)
.
Comme la forme d'entrée est la seule que vous devez définir, Keras la demandera dans la première couche.
Mais dans cette définition, Keras ignore la première dimension, qui est la taille du lot. Votre modèle doit être capable de traiter n'importe quelle taille de lot, vous ne définissez donc que les autres dimensions :
input_shape = (50,50,3)
#regardless of how many images I have, each image has this shape
Optionnellement, ou lorsque cela est requis par certains types de modèles, vous pouvez passer la forme contenant la taille du lot via batch_input_shape=(30,50,50,3)
o batch_shape=(30,50,50,3)
. Cela limite vos possibilités de formation à cette taille de lot unique, et ne doit donc être utilisé que lorsque cela est vraiment nécessaire.
Quel que soit votre choix, les tenseurs du modèle auront la dimension du lot.
Donc, même si vous avez utilisé input_shape=(50,50,3)
lorsque keras vous envoie des messages, ou lorsque vous imprimez le résumé du modèle, il affichera (None,50,50,3)
.
La première dimension est la taille du lot, c'est None
car elle peut varier en fonction du nombre d'exemples que vous donnez pour la formation. (Si vous avez défini explicitement la taille du lot, alors le nombre que vous avez défini apparaîtra à la place de None
)
De même, dans les travaux avancés, lorsque vous opérez directement sur les tenseurs (à l'intérieur des couches Lambda ou dans la fonction de perte, par exemple), la dimension de la taille du lot sera présente.
- Ainsi, lorsque vous définissez la forme d'entrée, vous ignorez la taille du lot :
input_shape=(50,50,3)
- Lorsque l'on effectue des opérations directement sur les tenseurs, la forme sera à nouveau
(30,50,50,3)
- Quand keras vous envoie un message, la forme sera
(None,50,50,3)
o (30,50,50,3)
en fonction du type de message qu'il vous envoie.
Dim
Et au final, ce qui est dim
?
Si votre forme d'entrée n'a qu'une seule dimension, vous n'avez pas besoin de la donner comme un tuple, vous donnez input_dim
comme un nombre scalaire.
Ainsi, dans votre modèle, où votre couche d'entrée comporte 3 éléments, vous pouvez utiliser n'importe lequel de ces deux éléments :
-
input_shape=(3,)
-- La virgule est nécessaire lorsque vous n'avez qu'une seule dimension.
input_dim = 3
Mais en traitant directement avec les tenseurs, souvent dim
fera référence au nombre de dimensions d'un tenseur. Par exemple, un tenseur de forme (25,10909) a 2 dimensions.
Définir votre image dans Keras
Keras a deux façons de le faire, Sequential
ou l'API fonctionnelle Model
. Je n'aime pas utiliser le modèle séquentiel, plus tard vous devrez de toute façon l'oublier car vous voudrez des modèles avec des branches.
PS : ici j'ai ignoré d'autres aspects, comme les fonctions d'activation.
Avec le modèle séquentiel :
from keras.models import Sequential
from keras.layers import *
model = Sequential()
#start from the first hidden layer, since the input is not actually a layer
#but inform the shape of the input, with 3 elements.
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input
#further layers:
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer
Avec le modèle d'API fonctionnel :
from keras.models import Model
from keras.layers import *
#Start defining the input tensor:
inpTensor = Input((3,))
#create the layers and pass them the input tensor to get the output tensor:
hidden1Out = Dense(units=4)(inpTensor)
hidden2Out = Dense(units=4)(hidden1Out)
finalOut = Dense(units=1)(hidden2Out)
#define the model's start and end points
model = Model(inpTensor,finalOut)
Formes des tenseurs
N'oubliez pas que vous ne tenez pas compte de la taille des lots lorsque vous définissez les couches :
- inpTensor :
(None,3)
- hidden1Out :
(None,4)
- hidden2Out :
(None,4)
- finalOut :
(None,1)