web-dev-qa-db-fra.com

Quel est l'avantage d'utiliser une InputLayer (ou une Input) dans un modèle Keras avec des tenseurs Tensorflow?

Un modèle Keras peut être utilisé comme une fonction Tensorflow sur un Tensor, via l'API fonctionnelle, comme décrit ici .

On peut donc faire:

from keras.layers import InputLayer

a = tf.placeholder(dtype=tf.float32, shape=(None, 784))

model = Sequential()
model.add(InputLayer(input_tensor=a, input_shape=(None, 784)))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))

output = model.output

Quel est un tenseur:

<tf.Tensor 'dense_24/Softmax:0' shape=(?, 10) dtype=float32>

Mais cela fonctionne également sans InputLayer:

a = tf.placeholder(dtype=tf.float32, shape=(None, 784))

model = Sequential()
model.add(Dense(32, activation='relu', input_shape=(784,)))
model.add(Dense(10, activation='softmax'))

output = model(a)

fonctionne et output a la même forme que précédemment:

<tf.Tensor 'sequential_9/dense_22/Softmax:0' shape=(?, 10) dtype=float32>

Je suppose que le premier formulaire permet:

  • pour attacher explicitement les inputs et outputs comme attributs du modèle (du même nom), afin que nous puissions les réutiliser ailleurs. Par exemple avec d'autres opérations TF.
  • pour transformer les tenseurs donnés en entrées en entrées Keras, avec des métadonnées supplémentaires (telles que _keras_history comme indiqué dans le code source ).

Mais ce n'est pas quelque chose que nous ne pouvons pas faire avec le deuxième formulaire, donc, y a-t-il une utilisation spéciale de InputLayer (et Input a fortiori) (sauf pour plusieurs entrées)?
De plus, le InputLayer est délicat car il utilise input_shape différemment des autres couches de kéros: nous spécifions la taille du lot (None ici), ce qui n'est généralement pas le cas ...

14
Phylliade

Il semblerait que InputLayer ait quelques utilisations:

  • Tout d'abord, il vous permet de donner des tenseurs tensorflow purs tels quels, sans spécifier leur forme. Par exemple. tu aurais pu écrire

    model.add(InputLayer(input_tensor=a))
    

    C'est sympa pour plusieurs raisons évidentes, entre autres moins de duplication.

  • Deuxièmement, ils vous permettent d'écrire des réseaux non séquentiels avec une seule entrée, par ex.

          a
         / \
        /   \
       /     \
    conv1   conv2
      |       |
    

    Sans InputLayer, vous devez alimenter explicitement conv1 et conv2 le même tenseur, ou créez une couche d'identité arbitraire au-dessus du modèle. Ni l'un ni l'autre n'est tout à fait agréable.

  • Enfin, ils suppriment la distinction arbitraire entre "couches qui sont également des entrées" et "couches normales". Si vous utilisez InputLayer, vous pouvez écrire du code où il y a une distinction claire entre quelle couche est l'entrée et quelle couche fait quelque chose. Cela améliore la lisibilité du code et facilite la refactorisation. Par exemple, le remplacement du premier calque devient aussi simple que le remplacement de tout autre calque, vous n'avez pas besoin de penser à input_shape.

16
Jonas Adler