在Keras中创建Sequential模型时,我知道你需要在第一层提供输入形状。这个输入形状是否会形成一个隐式的输入层呢?
例如,下面的模型明确指定了2个Dense层,但实际上这是否是一个包含3层的模型:由输入形状暗示的一个输入层,一个包含32个神经元的隐藏Dense层,以及一个具有10个可能输出的输出层?
model = Sequential([ Dense(32, input_shape=(784,)), Activation('relu'), Dense(10), Activation('softmax'),])
回答:
实际上,确实是有一个隐式的输入层,也就是说,你的模型是一个具有三层的“老式”神经网络——输入层、隐藏层和输出层。这在Keras的函数式API中更为明显(请查看文档中的示例),在该API中,你的模型将被编写为:
inputs = Input(shape=(784,)) # 输入层x = Dense(32, activation='relu')(inputs) # 隐藏层outputs = Dense(10, activation='softmax')(x) # 输出层model = Model(inputs, outputs)
实际上,这个隐式输入层正是你为什么只需要在Sequential API的第一个(显式)层中包含input_shape
参数的原因——在后续的层中,输入形状是从前一层的输出推断出来的(参见core.py
源代码中的注释)。
你还可能会发现关于tf.contrib.keras.layers.Input
的文档很有启发性。