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
inputsyoutputscomo 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_historycomo 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
InputLayernecesitaría alimentar explícitamenteconv1yconv2el 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
InputLayerpuede 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.