Добавление конкатенированного слоя в TensorFlow 2.0 (с использованием Attention)

При создании модели, использующей TensorFlow 2.0 Attention, я следовал примеру, приведенному в документации TF. https://www.tensorflow.org/api_docs/python/tf/keras/layers/Attention

Последняя строка в примере -

input_layer = tf.keras.layers.Concatenate()(
    [query_encoding, query_value_attention])

Тогда в примере есть комментарий

# Add DNN layers, and create Model.
# ...

Так казалось логичным сделать это

model = tf.keras.Sequential()
model.add(input_layer)

Это вызывает ошибку

TypeError: The added layer must be an instance of class Layer.
Found: Tensor("concatenate/Identity:0", shape=(None, 200), dtype=float32)

ОБНОВЛЕНИЕ (после ответа @ thushv89)

В конце концов, я пытаюсь добавить слой внимания в следующую модель, которая хорошо работает (или преобразовать ее в модель внимания).

model = tf.keras.Sequential()
model.add(layers.Embedding(vocab_size, embedding_nodes, input_length=max_length))
model.add(layers.LSTM(20))
#add attention here?
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error', metrics=['accuracy'])

Мои данные выглядят так

4912,5059,5079,0
4663,5145,5146,0
4663,5145,5146,0
4840,5117,5040,0

Где первые три столбца являются входными данными, а последний столбец является двоичным, а цель - классификация. Данные были подготовлены аналогично этому примеру с аналогичной целью - двоичной классификацией. https://machinelearningmaster.com/use-word-embedding-layers-deep-learning-keras/


person greco.roamin    schedule 23.11.2019    source источник


Ответы (1)


Итак, первое, что касается создания моделей, у Keras есть три API.

  • Последовательный - (что вы здесь делаете)
  • Функциональный - (Это то, что я использую в решении)
  • Создание подклассов - создание классов Python для представления пользовательских моделей / слоев.

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

import tensorflow as tf

# Variable-length int sequences.
query_input = tf.keras.Input(shape=(None,), dtype='int32')
value_input = tf.keras.Input(shape=(None,), dtype='int32')

# ... the code in the middle

# Concatenate query and document encodings to produce a DNN input layer.
input_layer = tf.keras.layers.Concatenate()(
    [query_encoding, query_value_attention])

# Add DNN layers, and create Model.
# ...
dense_out = tf.keras.layers.Dense(50, activation='relu')(input_layer)
pred = tf.keras.layers.Dense(10, activation='softmax')(dense_out)

model = tf.keras.models.Model(inputs=[query_input, value_input], outputs=pred)
model.summary()
person thushv89    schedule 23.11.2019
comment
Спасибо, это было полезно, но добавляет еще одну проблему. Я собираю модель для компиляции, и сводка близка к тому, что я ищу, но почему два входных массива и что это такое? Я изменил свой вопрос на основе вашего ответа. Я делаю что-то похожее на следующую ссылку, и у меня только один входной массив. machinelearningmastery.com/ - person greco.roamin; 24.11.2019
comment
Это не типичный слой внимания. Но он разработан для использования в качестве модуля внимания в модели Transformer, которая совсем другая. В чем я не уверен, можно ли использовать это внимание для реализации типа внимания в модели НЛП. - person thushv89; 24.11.2019
comment
На самом деле @ greco.roamin его можно использовать как типичный слой внимания. Я позабочусь об этом, обновлю свой ответ соответствующим образом. - person thushv89; 24.11.2019
comment
Спасибо. Очень признателен за совет. Если это поможет, это тоже мой вопрос по той же проблеме, но до того, как я понял, насколько более активным должен быть уровень внимания. Однако это могло бы дать больше контекста. stackoverflow.com/questions/58966874/ Также в этом посте тоже делается нечто подобное. Дело в том, чтобы реализовать внимание для классификации, а не для кодирования / декодирования depends-on-the-definition.com/ - person greco.roamin; 24.11.2019
comment
@ greco.roamin, поэтому после некоторого исследования я не думаю, что вы можете использовать этот слой внимания для решения своей проблемы. Это внимание уделяется моделям кодировщика-декодера. Но, сказав это, вы должны иметь возможность реализовать уровень внимания для этой проблемы (хотя это не является обычным делом для моделей без кодировщика-декодера - что я видел). Дайте мне знать, если вы хотите продолжить этот путь. - person thushv89; 24.11.2019
comment
Я реализовал уровень внимания из этого сообщения analyticsvidhya.com/blog/2019/11/ и вроде работает. Точность модели не улучшается, но она обучается на несколько порядков быстрее, чем любая эквивалентная модель без внимания. Буду признателен за любые комментарии или предложения по поводу подхода или любых других решений, которые вы хотели бы предложить. - person greco.roamin; 24.11.2019
comment
@ greco.roamin у вас есть для этого реализация? Что вы придумали до сих пор - person thushv89; 25.11.2019
comment
Я использовал функцию внимания в вышеупомянутом посте как есть. Моя реализация проста, я просто построил последовательную модель и добавил уровень внимания. Вроде работает. Вот код с \, обозначающим новую строку. model = tf.keras.Sequential () \ model.add (sizes.Embedding (vocab_size, embedding_nodes, input_length = max_length)) \ model.add (sizes.LSTM (20, return_sequences = True)) \ model.add (внимание ( )) \ model.add (Layers.Dense (1, activate = 'sigmoid')) \ model.compile (loss = 'mean_squared_error', metrics = ['precision']) - person greco.roamin; 26.11.2019
comment
@ greco.roamin, а теперь все работает? Или у вас все еще есть проблемы с обучением? - person thushv89; 26.11.2019
comment
Насколько я могу судить, это работает. Я получаю интересные результаты, и он тренируется быстро и хорошо. Это чистый эксперимент, чтобы увидеть эффект внимания к данным, для которых он не был специально разработан. Что мне нужно сделать сейчас, так это удалить всю концепцию встроенного слоя для обобщенного решения для внимания. Я не собираюсь решить эту проблему здесь и сейчас, но ценю ваше понимание и помощь на этом этапе процесса. Спасибо. - person greco.roamin; 26.11.2019
comment
Приятно слышать. Удачи! :) - person thushv89; 26.11.2019