tutorial raspberry neural network instalar español python tensorflow deep-learning keras

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 y outputs 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ícitamente conv1 y conv2 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 en input_shape .