В чем разница между этими двумя способами построения модели в keras?

#python #keras #lstm

#python #keras #lstm

Вопрос:

Я новичок в Keras и после прохождения нескольких руководств я начал создавать модель и нашел эти два стиля реализации. Однако я получаю ошибку в первом, а второй работает нормально. Кто-нибудь может объяснить разницу между ними?

Первый метод:

 
visible = Embedding(QsVocabSize, 1024, input_length=max_length_inp, mask_zero=True)
encoder = LSTM(100,activation='relu')(visible)

  

Второй метод:

 
model = Sequential()
model.add(Embedding(QsVocabSize, 1024, input_length=max_length_inp, mask_zero=True))
model.add(LSTM(100,activation ='relu'))

  

Это ошибка, которую я получаю:

 ValueError: Layer lstm_59 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.layers.embeddings.Embedding'>. Full input: [<keras.layers.embeddings.Embedding object at 0x00000207BC7DBCC0>]. All inputs to the layer should be tensors.
  

Комментарии:

1. Вы не предоставляете входные данные для слоя встраивания, поэтому позже он выдает ошибки.

Ответ №1:

Это два способа создания моделей DL в Keras. Первый фрагмент кода соответствует функциональному стилю. Этот стиль используется для создания сложных моделей, таких как мульти-ввод / вывод, общие слои и т.д.

https://keras.io/getting-started/functional-api-guide/

Второй фрагмент кода выполнен в последовательном стиле. Можно создавать простые модели, которые включают в себя просто укладку слоев.

https://keras.io/getting-started/sequential-model-guide/

Если вы прочитаете руководство по функциональному API, вы заметите следующий момент:

‘Экземпляр layer можно вызвать (для тензора), и он возвращает тензор’

Теперь ошибка, которую вы видите, будет иметь смысл. Эта строка только создает слой и не вызывает его путем передачи тензора.

 visible = Embedding(QsVocabSize, 1024, input_length=max_length_inp, mask_zero=True)
  

Впоследствии передача этого объекта для встраивания в слой LSTM выдает ошибку, поскольку он ожидает тензор.

Это пример из руководства по функциональному API. Обратите внимание на выходные тензоры, передаваемые с одного уровня на другой.

 main_input = Input(shape=(100,), dtype='int32', name='main_input')
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
lstm_out = LSTM(32)(x)
  

Комментарии:

1. Спасибо, я предположил, что слой встраивания будет действовать как входной слой, это помогло.