Keras - Конкатенирующие вложения разных размеров - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь создать автокодер в Керасе. Пока это мой код для кодера , который основан на архитектуре code2ve c:

path_source_token_input = Input((MAX_CONTEXTS, 2), dtype=tf.int32)
path_input = Input((MAX_CONTEXTS, 27), dtype=tf.int32)
path_target_token_input = Input((MAX_CONTEXTS, 2), dtype=tf.int32)

paths_embedded = Embedding(
        MAX_VOCAB_SIZE, DEFAULT_EMBEDDINGS_SIZE, name='path_embedding')(path_input)

token_embedding_shared_layer = Embedding(
        MAX_VOCAB_SIZE, DEFAULT_EMBEDDINGS_SIZE, name='token_embedding')
path_source_token_embedded = token_embedding_shared_layer(path_source_token_input)
path_target_token_embedded = token_embedding_shared_layer(path_target_token_input)

context_embedded = Concatenate()([path_source_token_embedded, paths_embedded, path_target_token_embedded])

learned = LSTM(100, activation='relu', input_shape=(500, 1))(context_embedded)

Теперь мой вход представляет собой представление исходного кода на основе code2ve c также, но по-другому. Исходный код представлен в виде context_path , который представляет собой source_node , соединенный path с target_node . Проще говоря, source и target_node - это просто строки из двух слов в каждом, например, «1 переменная», «37 функция». Затем он кодируется с использованием функции кодирования keras one_hot, поэтому это массив типа int длиной 2. Теперь source и target_node соединены path , который точно такой же, но имеет длину 27. Теперь каждый файл исходного кода представлен 500 такими триплетами -> context_path s. Я хочу создать вложение для каждого из триплетов, а затем объединить их в один вектор, используя слой сцепления. Я не уверен, стоит ли мне пытаться предварительно обработать данные другим способом или есть какой-нибудь разумный способ обойти эту проблему. У меня вопрос к тому, что я описал, должен ли я искать альтернативу или есть общее решение, когда размеры входных данных для объединенного слоя не совпадают?

...