Keras 序列模型输入层

Posted

技术标签:

【中文标题】Keras 序列模型输入层【英文标题】:Keras Sequential model input layer 【发布时间】:2018-03-16 07:24:05 【问题描述】:

在 Keras 中创建顺序模型时,我知道您在第一层提供了输入形状。然后这个输入形状会构成一个隐式输入层吗?

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

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

【问题讨论】:

【参考方案1】:

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

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源代码中的comments)。

documentation 上的 documentation 也很有启发性。

【讨论】:

我发现函数式 API 在输入和输出上更加清晰,并减少了混乱。【参考方案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 个 Keras 层只涉及 2 个转换。

另一方面,以图形方式,您可以用 3 个(图形)节点层和两组连接节点层的线来表示这个网络。从图形上看,它是一个 3 层网络。但是这个图形符号中的“层”是一堆圆圈,它们坐在页面上什么都不做,而 Keras 中的层会转换张量并为你做实际的工作。就个人而言,我会习惯 Keras 的观点 :-)

最后请注意,为了有趣和/或简单起见,我用input_dim=784 替换了input_shape=(784,) 以避免Python 使用的语法来混淆新手并创建一维元组:(<value>,)

【讨论】:

OP的代码实际上与Keras版本或教程的新近无关;这是一种独特的编码风格,需要单独放置激活,有些人(不是我)仍然喜欢这种风格。你所写的确实是(并且曾经是)编码 3 层模型的“标准”方式,但可以说并没有使实际的层数比 OP 的公式更清晰(正如功能 API 所做的那样)。 @desertnaut 我认为这个答案以及您对它的评论的价值在于表明多种观点是可能的,并且这里实际上没有明确的正确答案。可以说,声称这个网络有任何特定数量的层是在讽刺它而不是刻画它。您的评论突出了该角色的另一个方面。

以上是关于Keras 序列模型输入层的主要内容,如果未能解决你的问题,请参考以下文章

Keras序列模型学习

ValueError:检查目标时出错:预期(keras 序列模型层)具有 n 维,但得到的数组具有形状

如何在 Keras 中组合两个具有不同输入大小的 LSTM 层?

Keras序列模型的可变输入形状

使用 Keras 注意力在 sequence2sequence 模型中连接层形状误差

连接 Keras 中的屏蔽输入