Keras 顺序模型输入层
- 2025-03-21 09:05:00
- admin 原创
- 22
问题描述:
在 Keras 中创建顺序模型时,我了解到您在第一层提供输入形状。那么这个输入形状是否会形成一个隐式输入层?
例如,下面的模型明确指定了 2 个 Dense 层,但这实际上是一个具有 3 层的模型,由一个由输入形状暗示的输入层、一个具有 32 个神经元的隐藏 Dense 层和一个具有 10 个可能输出的输出层组成?
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
解决方案 1:
嗯,它实际上是一个隐式输入层,也就是说,您的模型是一个“传统”神经网络的示例,具有三层 - 输入、隐藏和输出。这在 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)
实际上,这个隐式输入层就是为什么你必须input_shape
在 Sequential API 中仅在模型的第一层(显式层)中包含一个参数的原因 - 在后续层中,输入形状是从前几层的输出推断出来的(参见源代码中的注释core.py
)。
您还可以找到有关启发的文档tf.contrib.keras.layers.Input
。
解决方案 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>,)
。