Keras-查找嵌入

时间:2018-08-09 21:23:19

标签: python keras word-embedding

我要做什么:

我正在尝试从序列中查找每个单词的单词嵌入。这是从文本生成的数字序列。

背景

我的序列(形状为(200,))看起来像这样:

type Connect struct {
     ClientID string `yaml:"clientid"`
     Password string `yaml:"password"`
     Timeout  UnmarshalingTimeout `yaml:"timeout"`
}

type UnmarshalingTimeout time.Duration 

func (ut UnmarshalingTimeout) UnmarshalYAML(unmarshal func(interface{}) error) error {
    // implement unmarshaling here
}

这些数字表示词汇表中的单词(10000个单词)。我有一些使用here的负采样方法创建的嵌入权重。

提取的嵌入权重具有形状(10000,106),可以将其加载到新的嵌入层中。

我想从新的嵌入层中用已加载的权重查找序列中的每个数字,并使其返回200个大小为106的向量,该向量对应于该序列。

这是我到目前为止所做的:

50, 2092, 3974,  398,   10, 9404,    5, 1001, 3975,   15,  512... <snip>

这是查找嵌入的正确方法吗?

1 个答案:

答案 0 :(得分:4)

是的,看起来很正确。要实际提取嵌入内容,可以将定义的图层包装在Model中:

import numpy as np
from keras.layers import Input, Embedding
from keras.models import Model

# Generate some random weights
embedding_weights = np.random.rand(10000, 106)
vocabulary_size = 10000

input_layer = Input(shape=(200,), name='text_input')
embedding = Embedding(input_length=200, input_dim=vocabulary_size, output_dim=106, 
                       name='embedding_layer', trainable=False, weights=[embedding_weights])
embedded_text = embedding(input_layer)

embedding_model = Model(inputs=input_layer, outputs=embedded_text)

# Random input sequence of length 200
input_sequence = np.random.randint(0,10000,size=(1,200))
# Extract the embeddings by calling the .predict() method
sequence_embeddings = embedding_model.predict(input_sequence)