python - raspberry - ¿Cuál es la ventaja de usar un InputLayer(o una entrada) en un modelo Keras con tensores Tensorflow?
tensorflow tutorial (1)
Un modelo de Keras se puede usar como una función de Tensorflow en un Tensor, a través de la API funcional, como se describe aquí .
Entonces podemos hacer:
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
Que es un tensor:
<tf.Tensor ''dense_24/Softmax:0'' shape=(?, 10) dtype=float32>
Pero esto también funciona sin 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)
funciona, y la output
tiene la misma forma que antes:
<tf.Tensor ''sequential_9/dense_22/Softmax:0'' shape=(?, 10) dtype=float32>
Supongo que la primera forma lo permite:
- para adjuntar explícitamente las
inputs
youtputs
como atributos del modelo (de los mismos nombres), para que podamos reutilizarlos en otro lugar. Por ejemplo, con otras OP TF. - para transformar los tensores dados como entradas en las entradas Keras, con metadatos adicionales (como
_keras_history
como se indica en el código fuente ).
Pero esto no es algo que no podamos hacer con la segunda forma, entonces, ¿hay un uso especial de InputLayer
(y Input
a fortiori) (excepto para múltiples entradas)?
Además, el InputLayer
es complicado porque está usando input_shape
diferente a otras capas de keras: especificamos el tamaño del lote ( None
aquí), que no suele ser el caso ...
Parece que InputLayer
tiene algunos usos:
En primer lugar, le permite aplicar tensores de tensorflujo puros tal como están, sin especificar su forma. Por ejemplo, podrías haber escrito
model.add(InputLayer(input_tensor=a))
Esto es bueno por varias razones obvias, entre otras menos duplicación.
En segundo lugar, le permiten escribir redes no secuenciales con una sola entrada, por ej.
a / / / / / / conv1 conv2 | |
Sin
InputLayer
necesitaría alimentar explícitamenteconv1
yconv2
el mismo tensor, o crear una capa de identidad arbitraria sobre el modelo. Ninguno de los dos es muy agradable.Finalmente, eliminan la distinción arbitraria entre "capas que también son entradas" y "capas normales". Si usa
InputLayer
puede escribir código donde hay una clara distinción entre qué capa es la entrada y qué capa hace algo. Esto mejora la legibilidad del código y hace que la refactorización sea mucho más fácil. Por ejemplo, reemplazar la primera capa se vuelve tan fácil como reemplazar cualquier otra capa, no necesita pensar eninput_shape
.