Keras模型可以通过功能API在Tensor上用作Tensorflow函数,如here所述。
所以我们可以这样做:
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
这是一个张量:
<tf.Tensor 'dense_24/Softmax:0' shape=(?, 10) dtype=float32>
但是,这也适用于没有任何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)
有效,output
形状与以前相同:
<tf.Tensor 'sequential_9/dense_22/Softmax:0' shape=(?, 10) dtype=float32>
我认为第一种形式允许:
inputs
和outputs
作为模型(相同名称)的属性,因此我们可以在其他地方重用它们。例如,与其他TF操作。_keras_history
)。但这不是我们不能用第二种形式做的事情,因此,InputLayer
(和Input
一个更好的)是否有特殊用法(除了多个输入)?
此外,InputLayer
很棘手,因为它使用input_shape
与其他keras层不同:我们指定批量大小(此处为None
),通常情况并非如此......
答案 0 :(得分:13)
似乎InputLayer
有一些用途:
首先,它允许您按原样提供纯张力流张量,而不指定其形状。例如。你本来可以写的
model.add(InputLayer(input_tensor=a))
这有几个显而易见的原因,其中包括较少的重复。
其次,它们允许您使用单个输入编写非顺序网络,例如
a
/ \
/ \
/ \
conv1 conv2
| |
如果没有InputLayer
,则需要明确地向conv1
和conv2
提供相同的张量,或者在模型的顶部创建任意标识图层。两者都不太令人愉快。
最后,他们删除了“同时输入的图层”和“普通图层”之间的任意区别。如果使用InputLayer
,您可以编写代码,其中明确区分哪个层是输入,哪个层执行某些操作。这提高了代码的可读性,使重构更容易。例如,替换第一层变得和替换任何其他层一样简单,您不需要考虑input_shape
。