1
votes

Pourquoi Keras convertit-il la forme d'entrée de (3,3) en (?, 3,3)?

J'essaie actuellement de faire fonctionner les couches de keras personnalisées, vous pouvez voir une version simplifiée ici:

input_shape: (None, 3, 3)
input tensor: Tensor("inputs:0", shape=(?, 3, 3), dtype=float32)

Le résultat de la console est le suivant:

class MyLayer(Layer):

    def __init__(self, **kwargs):
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        print("input_shape: "+str(input_shape))
        self.kernel = self.add_weight(name='kernel',
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)

    def call(self, x):
        print("input tensor: "+str(x))
        return K.dot(x, self.kernel)


inputs = Input(shape=(3,3), dtype='float', name='inputs')
results = MyLayer(input_shape=(3,3))(inputs)


0 commentaires

3 Réponses :


1
votes

Cela n'a rien de mystérieux, c'est la dimension batch, puisque keras (et la plupart des frameworks DL), font des calculs sur des lots de données à la fois, car cela augmente le parallélisme, et il correspond directement à lots en descente de gradient stochastique.

Votre couche doit prendre en charge le calcul sur les lots, de sorte que la dimension du lot est toujours présente dans les données d'entrée et de sortie, et elle est automatiquement ajoutée par keras à la input_shape .


3 commentaires

Ah, cela a du sens. Maintenant, ce que je me demande, puis-je en quelque sorte référencer la taille du lot dans ma fonction d'appel? Dans mon exemple particulier, je n'utilise pas seulement K.dot pour calculer la sortie, mais je dois aplatir l'entrée en utilisant K.flatten. Comment puis-je aplatir toutes les entrées du lot sans connaître la taille du lot?


Vous pouvez utiliser K.reshape (input_tensor, (-1,9)). Ici, l'utilisation de -1 permet à la fonction K.reshape de déterminer automatiquement la forme de cet axe en fonction de la forme des autres axes. Dans votre cas, puisque vous souhaitez transformer de (Aucun, 3, 3) à (Aucun, 9), vous pouvez utiliser K.reshape (input_tensor, (-1, (3x3))). De plus, vous pouvez utiliser -1 pour un seul axe lorsque vous spécifiez le tuple de forme que vous passez à la fonction K.reshape ().


@ Poly-nom-nom-noo Je pense que K.flatten fonctionne déjà par lots, la plupart sinon toutes les fonctions backend fonctionnent de cette façon. Vous n'avez donc rien à faire de spécial pour prendre en charge les lots.



0
votes

Cette dimension nouvellement ajoutée fait référence à la dimension du lot, c'est-à-dire que dans votre cas, vous passerez des lots de tenseurs dimensionnels 3x3. Cette dimension supplémentaire Aucun fait référence à la dimension du lot, qui est inconnue lors de la création du graphique.

Si vous regardez l'explication de la couche d'entrée sur la page Web Core Layers pour Keras, https://keras.io/layers/core/ , vous verrez que l'argument de forme vous passent lors de la création de la couche d'entrée est définie comme suit:

forme: un tuple de forme (entier), sans compter la taille du lot. Par exemple, shape = (32,) indique que l'entrée attendue sera des lots de vecteurs à 32 dimensions.


0 commentaires

0
votes

Si vous souhaitez spécifier la taille du lot, vous pouvez le faire à la place:

inputs = Input (batch_shape = (batch_size, height, width, channel))


0 commentaires