Keras explication d'entrée: forme d'entrée, unités, taille de lot, dim, etc

Pour tout Keras couche (Layer classe), quelqu'un peut m'expliquer comment comprendre la différence entre input_shape, units, dim, etc.?

Par exemple, le document indique units spécifier la forme de sortie d'un calque.

Dans l'image du réseau neuronal ci-dessous hidden layer1 a 4 unités. Est-ce que cela se traduit directement par l'attribut units de l'objet Layer? 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 peut-on comprendre et visualiser les attributs du modèle - en particulier les couches - avec l'image ci-dessous? entrez la description de l'image ici

61
demandé sur jeffhale 2017-06-25 17:29:03

2 réponses

Unités:

La quantité de "neurones", ou de "cellules", ou tout ce que la couche A à l'intérieur.

C'est une propriété de chaque couche, et oui, elle est liée à la forme de 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 de 3 dimensions, contenant 30 éléments dans la première dimension, 4 dans la seconde et 10 dans la troisième, totalisant 30*4*10 = 1200 éléments ou nombres.

La forme d'entrée

Ce qui circule entre les couches sont des tenseurs. Tenseur peut être vu 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 (30,50,50,3). Ensuite, votre tenseur de couche d'entrée, doit avoir cette forme (voir les détails dans la section" formes dans keras").

Chaque type de couche nécessite l'entrée avec un certain nombre de dimensions:

  • Dense les couches nécessitent des entrées comme (batch_size, input_size)
    • ou (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)
  • 1D circonvolutions et couches récurrentes utiliser (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. Seulement, vous savez cela, en fonction de vos données de formation.

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 définiront la forme de sortie (la forme du tenseur qui est produit par la couche et qui sera l'entrée de la couche suivante).

Chaque type de calque fonctionne d'une manière particulière. Couches denses de sortie de forme basée sur des "unités", convolutifs couches de sortie forme basée sur "filtres". Mais il est toujours basé sur une propriété de couche. (Voir la documentation pour ce que chaque couche produit)

Montrons ce qui se passe avec les calques "denses", qui sont le type indiqué dans votre graphique.

Une couche dense a une forme de sortie de (batch_size,units). Donc, oui, les unités, la propriété de la couche, définit également la sortie forme.

  • 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 poids seront entièrement calculés 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 certains 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 avait un nombre de multiplication dessus, tous les nombres ensemble formeraient la matrice de poids.

Formes en 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).

Depuis le la forme d'entrée est la seule que vous devez définir, Keras l'exigera 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 devrait être capable de gérer n'importe quelle taille de lot, de sorte que vous définissez uniquement les autres dimensions:

input_shape = (50,50,3)
    #regardless of how many images I have, each image has this shape        

En option, 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) ou batch_shape=(30,50,50,3). Cela limite vos possibilités de formation à ce lot unique taille, donc il devrait être utilisé seulement quand vraiment nécessaire.

De toute façon que vous choisissez, les tenseurs dans le modèle auront la dimension de lot.

Donc, même si vous avez utilisé input_shape=(50,50,3), lorsque keras vous envoie des messages, ou lorsque vous imprimez le modèle de résumé, 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, le numéro que vous avez défini apparaîtra au lieu de None)

Aussi, 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 là.

  • ainsi, lors de la définition de la forme d'entrée, vous ignorez la taille du lot: input_shape=(50,50,3)
  • Lorsque vous effectuez des opérations directement sur les tenseurs, la forme sera de nouveau (30,50,50,3)
  • Lorsque keras vous envoie un message, la forme sera (None,50,50,3) ou (30,50,50,3), en fonction du type de le message qu'il vous envoie.

Dim

Et à la fin, qu'est-ce que dim?

Si votre forme d'entrée n'a qu'une seule dimension, Vous n'avez pas besoin de la donner en tant que tuple, vous donnez input_dim en tant que nombre scalaire.

Donc, dans votre modèle, où votre couche d'entrée a 3 éléments, vous pouvez utiliser l'un de ces deux:

  • {[30] } -- la virgule est nécessaire lorsque vous n'avez qu'une seule dimension
  • input_dim = 3

, Mais lorsque vous traitez directement avec les tenseurs, souvent dim se réfèrent 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 modèles, ou L'API fonctionnelle Model. Je n'aime pas utiliser le modèle séquentiel, plus tard vous devrez l'oublier de toute façon parce que vous voudrez des modèles avec des branches.

PS: ici, j'ai ignoré d'autres aspects, tels que l'activation fonction.

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 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

Rappelez-vous que vous ignorez la taille des lots lors de la définition des calques:

  • inpTensor: (None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • finalOut: (None,1)
112
répondu Daniel Möller 2018-09-02 13:08:06

Dimension D'Entrée Clarifiée:

Pas une réponse directe, mais je viens de réaliser que la dimension D'entrée de mot pourrait être assez confuse, alors méfiez-vous:

It (Le mot dimension seul) peut faire référence à:

A) La dimension des données D'entrée (ou du flux) {[3] } telles que # N des axes du capteur pour rayonner le signal de la série temporelle, ou le canal de couleur RVB (3): suggested word=> "InputStream Dimension"

B) le nombre total /longueur des entités D'Entrée (ou couche D'entrée) (28 x 28 = 784 pour L'image couleur MINST) ou 3000 dans les valeurs du spectre transformé FFT, ou

"Dimension De La Couche D'Entrée / Caractéristique D'Entrée"

C) le dimensionnalité (#de dimension) de l'entrée (typiquement 3D comme prévu dans Keras LSTM) ou (#RowofSamples, #de Senors, #de valeurs..) 3 est la réponse.

"N Dimensionnalité de l'Entrée"

D) La Forme D'entrée spécifique (par exemple. (30,50,50,3) dans ces données d'image d'entrée non emballées, ou (30, 250, 3) si déballer Keras:

Keras a son input_dim fait référence à la Dimension de la couche D'entrée / Nombre de fonctionnalité 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 fait référence aux Pas de temps totaux

Le terme a été très déroutant, est correct et nous vivons dans un monde très déroutant!!

Je trouve que l'un des défis de L'apprentissage automatique est de traiter différentes langues ou dialectes et terminologies (comme si vous avez 5-8 versions très différentes de l'anglais, alors vous devez très haute compétence pour converser avec différents haut-parleurs). C'est probablement la même chose dans les langages de programmation.

0
répondu r poon 2018-08-07 14:17:06