web-dev-qa-db-fra.com

Comment la couche aplatie fonctionne-t-elle en keras?

J'utilise backend tensorflow.

Application de convolution, pooling maximum, aplatissement et une couche dense de manière séquentielle. la convolution nécessite une entrée 3D (hauteur, largeur, color_channels_depth).

Après convolution, cela devient (hauteur, largeur, Number_of_filters).

Après avoir appliqué la hauteur de regroupement maximal, la largeur change. Mais après l'application de la couche aplatie, que se passe-t-il exactement? par exemple.

Si l'entrée avant aplatir est (24,24,32) alors comment l'aplatir?

Est-ce séquentiel comme (24 * 24) pour la hauteur, le poids pour chaque numéro de filtre de manière séquentielle ou d'une autre manière? un exemple serait apprécié avec les valeurs réelles.

13
ssg

L'opérateur Flatten() déroule les valeurs à partir de la dernière dimension (au moins pour Theano, "channel first", et non "channel last" comme TF. Je ne peux pas exécuter TensorFlow dans mon environnement). Ceci équivaut à numpy.reshape avec la commande 'C':

‘C’ signifie lire/écrire les éléments en utilisant l’ordre des index de type C, avec le dernier index d’axe changeant le plus rapidement, revenant au premier index d’axe changement le plus lent.

Voici un exemple autonome illustrant l'opérateur Flatten avec l'API fonctionnelle Keras. Vous devriez être capable de vous adapter facilement à votre environnement. 

import numpy as np
from keras.layers import Input, Flatten
from keras.models import Model
inputs = Input(shape=(3,2,4))

# Define a model consisting only of the Flatten operation
prediction = Flatten()(inputs)
model = Model(inputs=inputs, outputs=prediction)

X = np.arange(0,24).reshape(1,3,2,4)
print(X)
#[[[[ 0  1  2  3]
#   [ 4  5  6  7]]
#
#  [[ 8  9 10 11]
#   [12 13 14 15]]
#
#  [[16 17 18 19]
#   [20 21 22 23]]]]
model.predict(X)
#array([[  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
#         11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,
#         22.,  23.]], dtype=float32)
24
dhinckley

Il est séquentiel comme 24 * 24 * 32 et le remodèle comme indiqué dans le code suivant. 

def batch_flatten(x):
    """Turn a nD tensor into a 2D tensor with same 0th dimension.
    In other words, it flattens each data samples of a batch.
    # Arguments
        x: A tensor or variable.
    # Returns
        A tensor.
    """
    x = tf.reshape(x, tf.stack([-1, prod(shape(x)[1:])]))
    return x
2
Harsha Pokkalla

Aplatir un tenseur signifie supprimer toutes les dimensions sauf une.

Une couche aplatie de Keras redessine le tenseur pour lui donner une forme égale au nombre d'éléments contenus dans le tenseur. 

C'est la même chose que de créer un tableau 1d d'éléments. 

Par exemple, dans le modèle VGG16, vous trouverez peut-être facile à comprendre:

>>> model.summary()
Layer (type)                     Output Shape          Param #
================================================================
vgg16 (Model)                    (None, 4, 4, 512)     14714688
________________________________________________________________
flatten_1 (Flatten)              (None, 8192)          0
________________________________________________________________
dense_1 (Dense)                  (None, 256)           2097408
________________________________________________________________
dense_2 (Dense)                  (None, 1)             257
===============================================================

Notez la forme de la couche aplatie_1 (Aucune, 8192), où 8192 correspond à 4 * 4 * 512.


PS, None signifie n'importe quelle dimension, mais vous pouvez généralement le lire comme 1. Vous pouvez trouver plus de détails dans ici .

0
prosti