Ошибка Tensorflow при объединении символов и встраивании слов

#python #tensorflow #keras #nlp #embedding

#python #tensorflow #keras #nlp #встраивание

Вопрос:

Я хочу объединить встраивания символов (сгенерированные с использованием CNN) с моим встраиванием слов (с использованием векторов перчаток), но получаю ошибку, поскольку форма вложений символов отличается от вложений слов.

Как можно исправить ошибку или объединить их?

 self.character_embedding_weights = tf.get_variable(
                "character_embedding_weights",
                shape=[dataset.alphabet_size, parameters['character_embedding_dimension']],
                initializer=initializer)
            embedded_characters = tf.nn.embedding_lookup(self.character_embedding_weights,
                                                         self.input_token_character_indices, name='embedded_characters')

            if self.verbose:
                print("embedded_characters: {0}".format(embedded_characters))
            utils_tf.variable_summaries(self.character_embedding_weights)
            s = tf.shape(embedded_characters)
            char_embeddings = tf.reshape(embedded_characters, shape=[-1,25,20])

            # Conv #1
            conv1 = tf.layers.conv1d(
                inputs=char_embeddings,
                filters=30,
                kernel_size=3,
                padding="valid",
                activation=tf.nn.relu)

            # Conv #2
            conv2 = tf.layers.conv1d(
                inputs=conv1,
                filters=30,
                kernel_size=3,
                padding="valid",
                activation=tf.nn.relu)
            pool2 = tf.layers.max_pooling1d(inputs=conv2, pool_size=2, strides=2)
            # # Dense Layer
            character_embed_output = tf.layers.dense(inputs=pool2, units=32, activation=tf.nn.relu)

  

Здесь я объединяю встраивания токена и символа.

             with tf.variable_scope("concatenate_token_and_character_vectors"):

                if self.verbose: 
                    print('embedded_tokens: {0}'.format(embedded_tokens))

                token_lstm_input = tf.concat([character_embed_output, embedded_tokens], 
                    axis=1, name='token_lstm_input')

  

Получение этой ошибки

 ValueError: Shape must be rank 3 but is rank 2 for'concatenate_token_and_character_vectors/token_lstm_input' (op: 'ConcatV2') with input shapes:[?,10,32], [?,100], [].**
  

Я работаю с этим репозиторием https://github.com/Franck-Dernoncourt/NeuroNER Он использует LSTM для встраивания на уровне символов, и я хочу использовать CNN для этого.

Ссылка, в которой используется LSTM для встраивания на уровне символов, и у меня есть код, использующий CNN, как упоминалось выше.

Прокомментируйте, если требуется какая-либо другая информация или код.

Ответ №1:

Наконец, я смог решить проблему, но сгладил встраивание символов, после чего его можно легко объединить с встраиванием слов. Добавив эту строку, это сработало.

 character_embed_output = tf.layers.Flatten()(character_embed_output)