Передача массива токенов в слой внедрения Keras Elmo - PullRequest
0 голосов
/ 24 апреля 2020

Я использую реализацию ELMO:

class ElmoEmbeddingLayer(Layer):
  def __init__(self, trainable = True ,**kwargs):
    self.dimensions = 1024
    self.trainable = trainable
    super(ElmoEmbeddingLayer, self).__init__(**kwargs)

  def build(self, input_shape):
    self.elmo = hub.Module('https://tfhub.dev/google/elmo/3', 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',
                       )['elmo']
    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)

И моя простая модель:

input = Input(shape=(1, ), dtype=tf.string)
embed = (ElmoEmbeddingLayer() if elmo)(input)
dropout1 = Dropout(0.4)(embed)
dense = Dense(12, activation='linear')(dropout1)

С кодом выше, я могу передать список строк в модель, однако моя цель - передать в нее массив токенизированных предложений, как я хотел бы использовать для маркировки последовательностей. Я уже знаю, что мне нужно изменить функцию call , чтобы она соответствовала следующему синтаксису:

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

Я хотел бы спросить, что я должен заменить tokens_input и длина токена с.

...