Elmo Embedded Layer с использованием слоя Keras - PullRequest
0 голосов
/ 30 апреля 2019
from keras.layers import Dense, Input, RepeatVector, Lambda, Permute, Multiply, Concatenate
from keras.engine import Layer
from keras.layers.convolutional import Conv1D
from keras.models import Model
from keras.optimizers import RMSprop, Adam
from keras import backend as K
from keras.layers.wrappers import TimeDistributed
import tensorflow_hub as hub
import tensorflow as tf

class ElmoEmbeddingLayer(Layer):
    def __init__(self, **kwargs):
        self.dimensions = 512
        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',
                      )['word_emb']
        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, self.dimensions)

model_param = dict(hidden_dim=100,enc_timesteps=MAX_LEN_ENCODING_QUERY,dec_timesteps=MAX_LEN_ENCODING_PASSAGE,
                  random_size=4,lr = 0.001)

hidden_dim = model_param["hidden_dim"]

question = Input(shape=(1,), dtype = "string", name = "question_base_inner")
question_len = Input(shape = (model_param["enc_timesteps"],) , dtype= 'float32' , name='question_len') #l_q

answer = Input(shape=(1,), dtype='string' , name = 'answer_good_base_inner')
answer_len = Input(shape=(model_param["dec_timesteps"],),dtype = 'float32', name='answer_len')#l_a

question_emb = ElmoEmbeddingLayer()(question)
answer_emb = ElmoEmbeddingLayer()(answer)

ques_filter_repeat_len = RepeatVector(model_param["dec_timesteps"])(question_len)# dec_timesteps, question_len 70,15
ans_filter_repeat_len = RepeatVector(model_param["enc_timesteps"])(answer_len)# enc_timesteps, answer_len 15,70

ans_repeat_len = RepeatVector(model_param["hidden_dim"])(answer_len)#hidden_dim, answer_len
ans_repear_vec = Permute((2,1))(ans_repeat_len)#answer_len, hidden_len

ques_repeat_len = RepeatVector(model_param["hidden_dim"])(question_len)#hidden_dim, question_len
ques_repear_vec = Permute((2,1))(ques_repeat_len)#question_len, hidden_dim

    #do not have previous layer
SigmoidDense = Dense(hidden_dim,activation="sigmoid")
TanhDense = Dense(hidden_dim,activation="tanh")

QueTimeSigmoidDense = TimeDistributed(SigmoidDense)#,name="que_time_s")
QueTimeTanhDense = TimeDistributed(TanhDense)#, name="que_time_t")

AnsTimeSigmoidDense = TimeDistributed(SigmoidDense)#,name = "ans_time_s")
AnsTimeTanhDense = TimeDistributed(TanhDense)#, name = "ans_time_t")

question_sig = QueTimeSigmoidDense(question_emb)
question_tanh = QueTimeTanhDense(question_emb)
...........

Я получил эту ошибку при запуске этого кода -

AssertionError                            Traceback (most recent call last)
<ipython-input-72-b7d8772c388f> in <module>()
----> 1 question_sig = QueTimeSigmoidDense(question_emb)
      2 question_tanh = QueTimeTanhDense(question_emb)
      3 print(question_sig,"\n" ,question_tanh)

1 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
    429                                          'You can build it manually via: '
    430                                          '`layer.build(batch_input_shape)`')
--> 431                 self.build(unpack_singleton(input_shapes))
    432                 self.built = True
    433 

/usr/local/lib/python3.6/dist-packages/keras/layers/wrappers.py in build(self, input_shape)
    193 
    194     def build(self, input_shape):
--> 195         assert len(input_shape) >= 3
    196         self.input_spec = InputSpec(shape=input_shape)
    197         child_input_shape = (input_shape[0],) + input_shape[2:]

Я знаю, что с ElmoEmbeddingLayer что-то не так. Код для этого взят из https://github.com/strongio/keras-elmo/blob/master/Elmo%20Keras.ipynb

Я запускаю этот код на google-colab, если он мне поможет. Позже я хочу загрузить веса и конфигурацию модели, поэтому следует рекомендовать любое изменение в коде, чтобы я мог получить всю модель обратно.

Любая помощь будет высоко оценена.

...