Я использую реализацию 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 и длина токена с.