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:
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._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 ...
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
.