Keras InputLayer 存在于由 Functional API 创建的模型中,但不存在于 Sequential API 中?
Keras InputLayer exists in models created by Functional API but not in Sequential API?
我正在尝试了解顺序 API(即 Sequential()
)和功能 API(即 Model()
之间的关系,用于在Keras。特别是,我对使用 Functional API 生成的模型中存在 InputLayer
对象以及在 Sequential 版本中没有任何对应对象感到困惑。下面显示的两个版本是否等效? InputLayer
对象只是一个无所事事的占位符吗?如果不是,必须做些什么才能使模型等效?
from keras.layers import Input, Dense
from keras.models import Model,Sequential
N_in = 10
N_hidden = 10
N_out = 10
# Using Model API
input = Input(shape=(N_in,))
hidden = Dense(N_hidden)(input)
output = Dense(N_out)(hidden)
model1 = Model(input, output)
# Using Sequential API
model2= 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
Are the two versions shown below equivalent?
是的,这两种方式定义了同一个模型。定义模型架构后,无论您使用 Sequential()
还是 Model()
.
,以下所有步骤都是相同的
Is the InputLayer object just a do-nothing placeholder?
是的,InputLayer 对象是一个什么都不做的占位符。如果你使用summary()
,你会发现它的param number是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: 220
Trainable params: 220
Non-trainable params: 0
Sequential()
仅用于层的线性堆叠。 Model()
用于层的有向无环图,允许构建完全任意的架构(如多个输入和多个输出)。
您看到的输出 model.layers
是不同的,因为层具有不同的实例。即使在不同的机器上它们也不同,但它们的工作方式相同。
请注意,无论是使用 Sequential 还是 Functional 创建的,每个模型都必须至少有一个输入层 API。区别在于 Sequential 模型的输入层 is implicitly created and applied(因此无法通过 .layers
属性访问),而对于使用 Functional API 构建的模型,您必须明确定义输入层.
我正在尝试了解顺序 API(即 Sequential()
)和功能 API(即 Model()
之间的关系,用于在Keras。特别是,我对使用 Functional API 生成的模型中存在 InputLayer
对象以及在 Sequential 版本中没有任何对应对象感到困惑。下面显示的两个版本是否等效? InputLayer
对象只是一个无所事事的占位符吗?如果不是,必须做些什么才能使模型等效?
from keras.layers import Input, Dense
from keras.models import Model,Sequential
N_in = 10
N_hidden = 10
N_out = 10
# Using Model API
input = Input(shape=(N_in,))
hidden = Dense(N_hidden)(input)
output = Dense(N_out)(hidden)
model1 = Model(input, output)
# Using Sequential API
model2= 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
Are the two versions shown below equivalent?
是的,这两种方式定义了同一个模型。定义模型架构后,无论您使用 Sequential()
还是 Model()
.
Is the InputLayer object just a do-nothing placeholder?
是的,InputLayer 对象是一个什么都不做的占位符。如果你使用summary()
,你会发现它的param number是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: 220
Trainable params: 220
Non-trainable params: 0
Sequential()
仅用于层的线性堆叠。 Model()
用于层的有向无环图,允许构建完全任意的架构(如多个输入和多个输出)。
您看到的输出 model.layers
是不同的,因为层具有不同的实例。即使在不同的机器上它们也不同,但它们的工作方式相同。
请注意,无论是使用 Sequential 还是 Functional 创建的,每个模型都必须至少有一个输入层 API。区别在于 Sequential 模型的输入层 is implicitly created and applied(因此无法通过 .layers
属性访问),而对于使用 Functional API 构建的模型,您必须明确定义输入层.