Используя ELMO с Keras? - PullRequest
       62

Используя ELMO с Keras?

0 голосов
/ 24 февраля 2019

поэтому сначала я использовал GloVe в своей модели, она работала нормально, но теперь я хочу переключиться на Elmo, но всегда получаю эту ошибку:

ValueError: Слой Concatenate требует ввода ссоответствующие формы, за исключением конкатной оси.Получил входные данные: [(Нет, 20), (Нет, 20), (Нет, 20, 5)]

Не могли бы вы мне помочь? Вот фрагмент моего кода: пожалуйста, дайте мнезнать, если вам нужно больше деталей.

Elmo в Керасе

class ElmoEmbeddingLayer(Layer):
    def __init__(self, **kwargs):
        self.dimensions = 1024
        self.trainable = True
        super(ElmoEmbeddingLayer, self).__init__(**kwargs)
def build(self, input_shape):
        self.elmo = hub.Module('https://tfhub.dev/google/elmo/2', trainable=self.trainable, name="{}_module".format(self.name))
        self.trainable_weights += K.tf.trainable_variables(scope="^{}_module/.*".format(self.name))
        super(ElmoEmbeddingLayer, self).build(input_shape)
def call(self, x, mask=None):
        result = self.elmo(K.squeeze(K.cast(x, tf.string), axis=1),
                      as_dict=True,
                      signature='default',
                      )['default']
        return result
def compute_mask(self, inputs, mask=None):
        return K.not_equal(inputs, '--PAD--')
def compute_output_shape(self, input_shape):
        return (input_shape[0], self.dimensions)

моя модель

pos_embedding_layer = Embedding(output_dim = pos_tag_embedding_size,
                         input_dim = len(SPACY_POS_TAGS),
                         input_length = sent_maxlen,
                         name='pos_embedding_layer')
inputs = [Input((sent_maxlen,), dtype='int32', name='word_inputs'),
            Input((sent_maxlen,), dtype='int32', name='predicate_inputs'),
            Input((sent_maxlen,), dtype='int32', name='postags_inputs')]

# ElmoEmbeddingLayer()
embedding_layer = ElmoEmbeddingLayer()

embeddings = [embedding_layer(inputs[0]), 
               embedding_layer(inputs[1]),
                pos_embedding_layer(inputs[2])]

outputI = predict_layer(dropout(latent_layers(keras.layers.concatenate(embeddings))))
#error thrown here in outputI

## ------> 10]Build model 
model = Model(inputs, outputI)

1 Ответ

0 голосов
/ 01 марта 2019

Вы не указали свой прогнозирующий слой.Но ошибка находится на уровне сцепления, поэтому эту ошибку можно решить с помощью предоставленного вами кода.Прежде всего, я удивлен, что вы не получили свою ошибку раньше, потому что Elmo с signature='default' требует строку в качестве ввода.(Вы должны предоставить все свои входные данные в виде разделенных пробелами токенов, например ["the cat is on the mat", "dogs are in the fog"],) ​​или использовать

embeddings = elmo(
inputs={
"tokens": tokens_input,
"sequence_len": tokens_length
},
signature="tokens",
as_dict=True)["elmo"]

Но давайте пока воспользуемся разделенными пробелами токенами.

Таким образом, единственно возможныйзначение для ElmoEmbeddingLayer ввода равно 1, и мы получаем

from keras.layers import Concatenate
sent_maxlen = 20
inputs = [Input(shape=(1, ), dtype="string"),
          Input(shape=(1, ), dtype="string"), 
          Input(shape=(sent_maxlen, ), dtype="int32")]
embeddings = [embedding_layer(inputs[0]), 
               embedding_layer(inputs[1]),
                pos_embedding_layer(inputs[2])]
concat = Concatenate(embeddings)

Так что пока это работает (по крайней мере, для меня).В будущем я предлагаю изменить вашу подпись с 'default' на 'elmo'.

...