在具有Tensorflow张量的Keras模型中使用InputLayer(或输入)有什么好处?

Phy*_*ade 16 python deep-learning keras tensorflow

甲Keras模型可以用作一个张量一个Tensorflow功能,通过所述功能API,如所描述这里.

所以我们可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

这是一个张量:

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

但是,这也没有任何作用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)
Run Code Online (Sandbox Code Playgroud)

工作,并output具有与以前相同的形状:

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

我假设第一种形式允许:

  • 明确地附加inputsoutputs作为模型(相同名称)的属性,因此我们可以在其他地方重用它们.例如与其他TF操作.
  • 转化给定为投入Keras输入的张量,用另外的元数据(例如_keras_history在所述源代码中).

但这不是我们不能用第二种形式做的事情,所以,是否有特殊用法InputLayer(和Input一个更好的)(除了多个输入)?
此外,这InputLayer很棘手,因为它input_shape与其他keras层的使用方式不同:我们指定批量大小(None此处),通常情况并非如此......

Jon*_*ler 17

它似乎InputLayer有一些用途:

  • 首先,它允许您按原样给出纯张量流张量,而不指定它们的形状.你可以写

    model.add(InputLayer(input_tensor=a))
    
    Run Code Online (Sandbox Code Playgroud)

    这有几个显而易见的原因很好,其中包括更少的重复.

  • 其次,它们允许您使用单个输入编写非顺序网络,例如

          a
         / \
        /   \
       /     \
    conv1   conv2
      |       |
    
    Run Code Online (Sandbox Code Playgroud)

    没有InputLayer你需要显式提供conv1conv2相同的张量,或在模型的顶部创建任意标识层.两者都不是很令人愉快.

  • 最后,他们删除了"也是输入的图层"和"普通图层"之间的任意区别.如果您使用,InputLayer您可以编写代码,其中明确区分哪个层是输入和哪个层执行某些操作.这提高了代码的可读性,使重构更容易.例如,替换第一层变得像替换任何其他层一样容易,您不需要考虑input_shape.