430 votes

Explication des entrées Keras : input_shape, units, batch_size, dim, etc.

Pour toute couche Keras ( Layer ), quelqu'un peut-il expliquer comment comprendre la différence entre input_shape , units , dim etc.

Par exemple, le document dit units spécifier la forme de sortie d'une couche.

Dans l'image du réseau neuronal ci-dessous hidden layer1 a 4 unités. Cela se traduit-il directement par le units de l'attribut Layer objet ? Ou est-ce que units dans Keras égale la forme de chaque poids dans la couche cachée fois le nombre d'unités ?

En bref, comment comprendre/visualiser les attributs du modèle - en particulier les couches - avec l'image ci-dessous ? enter image description here

681voto

Daniel Points 2149

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)

14 votes

Une question sur le input_shape= Le paramètre reste : à quelle dimension se réfère la première valeur de l'argument ? Je vois des choses comme input_shape=(728, ) Ainsi, dans mon esprit, le premier argument fait référence aux colonnes (fixes) et le second aux lignes (libres de varier). Mais comment cela s'accorde-t-il avec l'ordre majeur des rangées des tableaux de Python ?

40 votes

Cette virgule ne crée pas une deuxième dimension. C'est juste une notation python pour créer une seconde dimension. tuple qui ne contient qu'un seul élément. input_shape(728,) est la même chose que batch_input=(batch_size,728) . Cela signifie que chaque échantillon a 728 valeurs.

0 votes

@DanielMöller : pourriez-vous préciser un peu quelle est la différence entre "éléments d'entrée" et "dimensions" ? Je pense que le graphique ci-dessus avait une couche d'entrée tridimensionnelle, ce qui fait que les éléments d'entrée sont en trois dimensions. dim=3 Je me demande donc ce que je manque ici, car je vois que vous écrivez que l'entrée est unidimensionnelle...

23voto

r poon Points 56

Dimension d'entrée clarifiée :

Ce n'est pas une réponse directe, mais je viens de réaliser que le terme "Dimension d'entrée" pouvait prêter à confusion, alors méfiez-vous :

Le mot "dimension" seul peut faire référence à :

a) La dimension des données d'entrée (ou flux) comme le nombre d'axes du capteur pour transmettre le signal de la série chronologique, ou les canaux de couleur RVB (3) : terme suggéré = "Dimension du flux d'entrée".

b) Le nombre total / la longueur totale des caractéristiques d'entrée (ou couche d'entrée) (28 x 28 = 784 pour l'image couleur MINST) ou 3000 dans les valeurs spectrales transformées par FFT, ou encore

"Couche d'entrée / Dimension de la caractéristique d'entrée"

c) Le dimensionnalité (# de dimensions) de l'entrée (typiquement 3D comme prévu dans Keras LSTM) ou (# de rangées d'échantillons, # de capteurs, # de valeurs ) 3 est la réponse.

"N Dimensionnalité de l'entrée"

d) Le Forme d'entrée SPECIFIQUE (par exemple, (30,50,50,3) dans ces données d'image d'entrée non enveloppées, ou (30, 2500, 3) si elles sont enveloppées. Keras :     

Dans Keras, input_dim fait référence à la dimension de la couche d'entrée / nombre de caractéristiques d'entrée.

    model = Sequential()
    model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
    model.add(Activation('relu')) 

Dans Keras LSTM, il s'agit du nombre total de pas de temps.

Le terme a été très confus, nous vivons dans un monde très confus ! !!

Je trouve que l'un des défis de l'apprentissage automatique est de traiter des langues ou des dialectes et des terminologies différents (par exemple, si vous avez 5 à 8 versions très différentes de l'anglais, vous devez avoir un niveau de compétence très élevé pour converser avec différents locuteurs). Il en va probablement de même pour les langages de programmation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X