繁体   English   中英

Keras Sequential 模型输入层

[英]Keras Sequential model input layer

在 Keras 中创建 Sequential 模型时,我了解您在第一层提供输入形状。 这个输入形状是否会成为隐式输入层?

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

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

好吧,它实际上确实一个隐式输入层,即您的模型是具有三层(输入、隐藏和输出)的“老式”神经网络的示例。 这在 Keras Functional 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.Inputtf.contrib.keras.layers.Input启发性的文档

这取决于你的观点:-)

根据最近的 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>,)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM