我试图理解在 Keras 中设置神经网络时,顺序 API(即 Sequential()
)和函数式 API(即 Model()
)之间的关系。特别是,我对使用函数式 API 生成的模型中存在 InputLayer
对象,而顺序版本中没有相应的对象感到困惑。下面展示的两个版本是否等效?InputLayer
对象只是一个什么也不做的占位符吗?如果不是,要使模型等效需要做些什么?
from keras.layers import Input, Densefrom keras.models import Model,SequentialN_in = 10N_hidden = 10N_out = 10# 使用 Model APIinput = Input(shape=(N_in,))hidden = Dense(N_hidden)(input)output = Dense(N_out)(hidden)model1 = Model(input, output)# 使用 Sequential APImodel2= Sequential()model2.add(Dense(N_hidden, input_dim=N_in))model2.add(Dense(N_out))for i in range(len(model1.layers)): print(model1.layers[i])
keras.engine.input_layer.InputLayer object at 0xb333b8c88
keras.layers.core.Dense object at 0xb333b87b8>
keras.layers.core.Dense object at 0xb333b8b00>
for i in range(len(model2.layers)): print(model2.layers[i])
keras.layers.core.Dense object at 0xb331eddd8
keras.layers.core.Dense object at 0xb3333dcc0
回答:
下面展示的两个版本是否等效?
是的,这两种方式定义了相同的模型。一旦你的模型架构被定义,后续的所有步骤无论你使用的是 Sequential()
还是 Model()
都是相同的。
InputLayer
对象只是一个什么也不做的占位符吗?
是的,InputLayer
对象是一个什么也不做的占位符。如果你使用 summary()
,你会发现它的参数数量为 0。
print(model1.summary())_________________________________________________________________Layer (type) Output Shape Param # =================================================================input_1 (InputLayer) (None, 10) 0 _________________________________________________________________dense_1 (Dense) (None, 10) 110 _________________________________________________________________dense_2 (Dense) (None, 10) 110 =================================================================Total params: 220Trainable params: 220Non-trainable params: 0
Sequential()
仅用于层线性堆栈。Model()
用于层的有向无环图,允许构建完全任意的架构(如多个输入和多个输出)。
你看到的输出 model.layers
不同是因为层有不同的实例。即使在不同的机器上,它们也是不同的,但它们的工作方式是相同的。