Keras InputLayer существует в моделях, созданных функциональным API, но не в последовательном API? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь понять взаимосвязь между последовательным API (например, Sequential()) и функциональным API (например, Model() для настройки нейронных сетей в Keras. В частности, меня смущает существованиеInputLayer объект в модели, созданной с использованием Functional API и отсутствие какого-либо аналога в последовательной версии. Являются ли две версии, показанные ниже, эквивалентными? Является ли объект 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 объект в 0xb333b8c88

keras.layers.core.Dense объект в 0xb333b87b8>

keras.layers.core.Dense объект в 0xb333b8b00>

for i in range(len(model2.layers)):
    print(model2.layers[i])

keras.layers.core.Dense объект в 0xb331eddd8

keras.layers.core.Dense объект в 0xb3333dcc0

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Обратите внимание, что каждая модель должна иметь хотя бы один входной слой, независимо от того, создан он с использованием последовательного или функционального API.Разница в том, что входной слой для последовательной модели неявно создается и применяется (и поэтому не будет доступен через атрибут .layers), тогда как для моделей, построенных с помощью Functional APIВы должны явно определить входной слой.

0 голосов
/ 19 декабря 2018

Являются ли две версии, показанные ниже, эквивалентными?

Да, эти два способа определяют одну и ту же модель.После того как ваша модель архитектуры определена, все последующие шаги одинаковы, независимо от того, использовали ли вы 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, который вы видите, отличается, потому что слои имеют разные экземпляры.Они разные даже на разных машинах, но работают одинаково.

...