Keras顺序模型输入层

22

在Keras中创建Sequential模型时,我理解您在第一层中提供输入形状。那么这个输入形状是否会构成一个隐含的输入层?

例如,下面的模型明确指定了2个密集层,但实际上是一个由输入形状暗示的输入层,一个具有32个神经元的隐藏密集层,然后是一个具有10个可能输出的输出层,总共3层的模型吗?

model = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])
2个回答

30

实际上,它确实是一种隐含的输入层,即你的模型是一个“老派”的三层神经网络,包括输入层、隐藏层和输出层。这在Keras功能API中更明显地显示(请查看文档中的示例),其中您的模型将被编写为:

inputs = Input(shape=(784,))                 # input layer
x = Dense(32, activation='relu')(inputs)     # hidden layer
outputs = Dense(10, activation='softmax')(x) # output layer

model = Model(inputs, outputs)
实际上,这个隐式输入层就是为什么在Sequential API的第一个(显式)层中必须包括input_shape参数的原因 - 在后续的层中,输入形状是从前面一层的输出推断出来的(请参见core.py源代码中的注释)。
您还可以在tf.contrib.keras.layers.Input文档中找到有启发性的内容。

1
我发现函数式API在输入和输出方面更清晰,减少了混淆。 - rjurney

2

这取决于你的观点 :-)

如果按照最新的Keras教程示例重新编写代码,你可能会使用以下内容:

model = Sequential()
model.add(Dense(32, activation='relu', input_dim=784))
model.add(Dense(10, activation='softmax')

这使得你只有2个Keras层,更加明确。至少在Keras中,这正是你所拥有的,因为“输入层”实际上不是一个(Keras)层:它只是一个存储张量的位置,因此它可能是一个张量本身。

每个Keras层都是一个转换器,输出一个张量,可能与输入的大小/形状不同。因此,在这里有3个可识别的张量(输入,两个层的输出),但只有2个对应于2个Keras层的转换。

另一方面,图形上,您可以用3个(图形)层节点和两组连接节点层的线来表示这个网络。从图形上看,它是一个3层的网络。但是,在这种图形符号中,“层”只是坐在页面上无所事事的圆圈群,而在Keras中,层会转换张量并为您做实际工作。个人认为最好习惯于Keras的视角: - )

最后请注意,为了便于理解或简化,我用input_dim = 784替换了input_shape = (784,)语法,以避免Python使用用于混淆新手并创建一维元组的语法:(<value>,)


1
OP的代码实际上与Keras版本或教程的新旧无关;它是一种独特的编码风格,要求将激活函数分开放置,有些人(不包括我)仍然喜欢这种风格。你所写的确实是(并且一直是)编写3层模型的“标准”方式,但可以说并没有比OP的公式(如Functional API所示)更清晰地表明实际层数。 - desertnaut
@desertnaut,我认为这个答案以及你对它的评论所体现出来的价值在于展示了多种观点的可能性,并且实际上在这里并没有明确正确的答案。可以说,声称这个网络具有任何特定数量的层次结构都是夸张其词而不是描述它。你的评论突显了这一特征的另一个方面。 - omatai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接