Python Keras InputLayer存在于由功能API创建的模型中,但不存在于顺序API中?

Python Keras InputLayer存在于由功能API创建的模型中,但不存在于顺序API中?,python,machine-learning,keras,keras-layer,Python,Machine Learning,Keras,Keras Layer,我试图理解顺序API(即Sequential())和函数API(即Model()之间的关系用于在Keras中建立神经网络。特别是,我对使用函数API生成的模型中存在InputLayer对象以及序列版本中没有任何对应对象感到困惑。下面显示的两个版本是等效的吗?InputLayer对象只是一个不做任何事情的占位符吗?如果没有,那么必须做些什么才能使模型等效 from keras.layers import Input, Dense from keras.models import Model,Seq

我试图理解顺序API(即
Sequential()
)和函数API(即
Model()之间的关系
用于在Keras中建立神经网络。特别是,我对使用函数API生成的模型中存在
InputLayer
对象以及序列版本中没有任何对应对象感到困惑。下面显示的两个版本是等效的吗?
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])
0xb333b8c88处的keras.engine.input_layer.InputLayer对象

0xb333b87b8>

0xb333b8b00处的keras.layers.core.Dense对象>

0xb331eddd8处的keras.layers.core.Dense对象

0xb3333dcc0处的keras.layers.core.Dense对象

下面显示的两个版本是否等效

是的,这两种方法定义相同的模型。一旦定义了模型体系结构,无论您使用的是
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: 220
Trainable params: 220
Non-trainable params: 0
Sequential()
仅用于层的线性堆栈。
Model()
用于层的有向无环图,允许构建完全任意的体系结构(如多个输入和多个输出)

您看到的输出
model.layers
是不同的,因为层具有不同的实例。即使在不同的机器上,它们也不同,但工作方式相同

下面显示的两个版本是否等效

是的,这两种方法定义相同的模型。一旦定义了模型体系结构,无论您使用的是
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: 220
Trainable params: 220
Non-trainable params: 0
Sequential()
仅用于层的线性堆栈。
Model()
用于层的有向无环图,允许构建完全任意的体系结构(如多个输入和多个输出)


您看到的输出
模型.层
是不同的,因为层有不同的实例。即使在不同的机器上,它们也不同,但工作方式相同。

请注意,每个模型都必须至少有一个输入层,无论它是使用顺序API还是功能API创建的。区别在于序列模型和(因此无法通过
.layers
属性访问),而对于使用功能API构建的模型,必须明确定义输入层。

请注意,每个模型必须至少有一个输入层,无论它是使用顺序API还是功能API创建的。区别在于,顺序模型的输入层和(因此不能通过
.layers
属性访问),而对于使用函数API构建的模型,必须明确定义输入层