首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ELMO和Keras?

用ELMO和Keras?
EN

Stack Overflow用户
提问于 2019-02-24 09:57:26
回答 1查看 1.2K关注 0票数 0

所以首先我在我的模型中使用了GloVe --它工作得很好,但是现在我想切换到Elmo,但是我总是会遇到这样的错误:

ValueError:Concatenate层需要具有匹配形状的输入,但凹轴除外。得到输入形状:(无,20),(无,20),(无,20,5)

你能帮帮我吗?这是我的代码片段:如果你需要更多细节,请告诉我。

Keras的Elmo

代码语言:javascript
复制
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)

我的模型

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2019-03-01 07:39:36

你还没有提供你的predict_layer。但是错误在级联层,所以可以使用您提供的代码来解决此错误。首先,我感到惊讶的是,您没有在前面得到错误,因为带有signature='default'的Elmo需要一个字符串作为它的输入。(您应该以空格分隔的令牌(例如["the cat is on the mat", "dogs are in the fog"] )提供所有输入)或使用

代码语言:javascript
复制
embeddings = elmo(
inputs={
"tokens": tokens_input,
"sequence_len": tokens_length
},
signature="tokens",
as_dict=True)["elmo"]

但是现在让我们使用空间分隔的令牌。

因此,ElmoEmbeddingLayer输入的唯一可能值是1,我们得到

代码语言:javascript
复制
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'

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54850710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档