В Keras elmo слой встраивания имеет 0 параметров?это нормально? - PullRequest
0 голосов
/ 27 февраля 2019

Итак, я использовал GloVe с моей моделью, и она работала, но теперь я перешел на Elmo (обратите внимание, что код Keras доступен на GitHub Elmo Keras Github , utils.py

однако, когда я печатаю model.summary, я получаю 0 параметров в слое ELMo Embedded, в отличие от того, когда я использовал Glove это нормально? Если нет, скажите, пожалуйста, что я делаю неправильно ИспользованиеПерчатка I Получено более 20 миллионов параметров

Model Summary

##-------->  When I was using Glove  Embedding Layer
word_embedding_layer = emb.get_keras_embedding(#dropout = emb_dropout,
                                            trainable = True,
                                            input_length = sent_maxlen, 
                                            name='word_embedding_layer') 


## --------> Deep layers
pos_embedding_layer = Embedding(output_dim =pos_tag_embedding_size, #5
                         input_dim = len(SPACY_POS_TAGS),
                         input_length = sent_maxlen, #20
                         name='pos_embedding_layer')
latent_layers = stack_latent_layers(num_of_latent_layers)



##--------> 6] Dropout 
dropout = Dropout(0.1) 

## --------> 7]Prediction
predict_layer = predict_classes()


## --------> 8] Prepare input features, and indicate how to embed them
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')]


## --------> 9] ELMo Embedding and Concat all inputs and run on deep network
from elmo import ELMoEmbedding
import utils 

idx2word = utils.get_idx2word()
ELmoembedding1 = ELMoEmbedding(idx2word=idx2word, output_mode="elmo", trainable=True)(inputs[0]) # These two are interchangeable
ELmoembedding2 = ELMoEmbedding(idx2word=idx2word, output_mode="elmo", trainable=True)(inputs[1]) # These two are interchangeable


embeddings = [ELmoembedding1, 
               ELmoembedding2,
               pos_embedding_layer(inputs[3])]

con1 = keras.layers.concatenate(embeddings)

## --------> 10]Build model 

outputI = predict_layer(dropout(latent_layers(con1)))
model = Model(inputs, outputI)

model.compile(optimizer='adam',
                           loss='categorical_crossentropy',
                           metrics=['categorical_accuracy'])
model.summary()

Испытания:

примечание: я пытался использовать TF-Hub Elmo с Kerasкод, но вывод всегда был 2D-тензор [даже когда я изменил его на настройку «Elmo» и «LSTM» вместо «по умолчанию»], поэтому я не мог объединить с POS_embedding_layer. Я попытался изменить форму, но в итоге я получил ту же сумму проблемыПараметры 0.

1 Ответ

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

Из описания TF-Hub (https://tfhub.dev/google/elmo/2), вложения отдельных слов не поддаются обучению. Только взвешенная сумма уровней вложения и LSTM равна. Таким образом, вы должны получить 4 обучаемых параметра на уровне ELMo.

Мне удалось получить обучаемые параметры, используя класс, определенный в примере StrongIO на Github . В этом примере представлен только класс, для которого выводится слой по умолчанию , которыйявляется вектором 1024 для каждого входного примера (по существу, кодировщик документа / предложения). Чтобы получить доступ к встраиваниям каждого слова (слой 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',
            )['elmo']
        return result

    def compute_output_shape(self, input_shape):
        return (input_shape[0], None, self.dimensions)

Вы можете сложить ElmoEmbeddingLayer со слоем POS.
В качестве более общего примера можно использовать вложения ELMo в модель 1D ConvNet для классификации:

elmo_input_layer = Input(shape=(None, ), dtype="string")
elmo_output_layer = ElmoEmbeddingLayer()(elmo_input_layer)

conv_layer = Conv1D(
    filters=100,
    kernel_size=3,
    padding='valid',
    activation='relu',
    strides=1)(elmo_output_layer)

pool_layer = GlobalMaxPooling1D()(conv_layer)
dense_layer = Dense(32)(pool_layer)
output_layer = Dense(1, activation='sigmoid')(dense_layer)

model = Model(
    inputs=elmo_input_layer,
    outputs=output_layer)
model.summary()

Сводка модели выглядит следующим образом:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_62 (InputLayer)        (None, None)              0         
_________________________________________________________________
elmo_embedding_layer_13 (Elm (None, None, 1024)        4         
_________________________________________________________________
conv1d_46 (Conv1D)           (None, None, 100)         307300    
_________________________________________________________________
global_max_pooling1d_42 (Glo (None, 100)               0         
_________________________________________________________________
dense_53 (Dense)             (None, 32)                3232      
_________________________________________________________________
dense_54 (Dense)             (None, 1)                 33        
=================================================================
Total params: 310,569
Trainable params: 310,569
Non-trainable params: 0
_________________________________________________________________
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...