Keras-嵌入层

时间:2017-09-11 12:30:53

标签: python deep-learning keras

input_dimoutput_diminput_length的含义是:

Embedding(input_dim, output_dim, input_length)

从我理解的文档中:

  • input_dim:int> 0.词汇量的大小
  • output_dim:int> = 0.密集嵌入的维度。
  • input_length:输入序列的长度

因此,当我的输入是google.com之类的单词时,每个字符由整数[5, 2, 2, 5, 8, 3, 4, 1, 2, 9]表示,可能的最大字长为75。可能的最大字符为38。我应该如何决定input_dimoutput_diminput_length

4 个答案:

答案 0 :(得分:7)

为了使用单词进行自然语言处理或机器学习任务,首先需要将它们映射到连续的向量空间,从而创建单词向量单词嵌入。 Keras嵌入层对于构造这样的单词向量很有用。

input_dim :词汇量大小。这是您的语料库中表示的唯一单词数。

output_dim :单词向量的所需维度。例如,如果output_dim = 100,那么每个单词将被映射到具有100个元素的向量,而如果output_dim = 300,则每个单词将被映射到具有300个元素的向量上。

input_length :序列的长度。例如,如果您的数据由句子组成,则此变量表示句子中有多少单词。由于不同的句子通常包含不同数量的单词,因此通常需要填充序列以使所有句子具有相同的长度。 keras.preprocessing.pad_sequence方法可以用于此(https://keras.io/preprocessing/sequence/)。

在Keras中,可以1)使用预训练的单词向量,例如GloVe或word2vec表示,或2)学习单词向量作为训练过程的一部分。这篇博客文章(https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html)提供了有关如何使用GloVe预训练单词向量的教程。对于选项2,Keras将随机初始化向量作为默认选项,然后在训练过程中学习最佳单词向量。

答案 1 :(得分:4)

  • input_dim:是要嵌入的词汇表的大小
  • output_dim:是嵌入向量的长度
  • input_length:是输入(句子)的最大长度

Explain with example: how embedding layers in keras works所示,您可以将句子转换为整数列表(向量或张量)。带有input_length的向量示例(句子的最大长度为6,如果你的句子是更长的剩余单词被修剪)

 'This is a text' --> [0 0 1 2 3 4]
 'This is a very long text, my friends' --> [1 2 3 5 6 4]

然后使用keras的嵌入层,您可以将这些向量转换为output_dim深度的嵌入向量。例如output_dim = 3:

[0 0 1 2 3 4] --> 
array([[ 0.00251105,  0.00724941, -0.01146401],
   [ 0.00251105,  0.00724941, -0.01146401],
   [ 0.03071865,  0.00953215, -0.01349484],
   [ 0.02962008,  0.04860269, -0.04597988],
   [-0.01875228,  0.03349927, -0.03210936],
   [-0.02512982,  0.04811014,  0.03172458]], dtype=float32)

最后一个参数input_dim是映射到嵌入向量的词汇表的大小。您可以通过运行

来查看它
model.layers[0].get_weights() 

因为嵌入层通常是模型的第一层。如果它是10,嵌入层包含10个大小为output_dim的向量。请注意,第一个元素对应于输入向量中的0映射(0 - > [0.00251105,0.00724941,-0.01146401]),等于1的第二个等。

[array([[ 0.00251105,  0.00724941, -0.01146401],
    [ 0.03071865,  0.00953215, -0.01349484],
    [ 0.02962008,  0.04860269, -0.04597988],
    [-0.01875228,  0.03349927, -0.03210936],
    [-0.02512982,  0.04811014,  0.03172458],
    [-0.00569617, -0.02348857, -0.00098624],
    [ 0.01327456,  0.02390958,  0.00754261],
    [-0.04041355,  0.03457253, -0.02879228],
    [-0.02695872,  0.02807242,  0.03338097],
    [-0.02057508,  0.00174383,  0.00792078]], dtype=float32)]

增加input_dim可以映射更大的词汇量,但也可以增加emdebbing层的参数数量。参数数量为input_dim x output_dim。

据我所知,这些向量是随机启动的,并使用优化器算法训练为任何其他层。但是,您可以使用不同的算法,如word2vec或预制的矢量,如手套(https://nlp.stanford.edu/projects/glove/)。想法是每个单词将代表空间中的一个独特位置(由它的向量描述),你可以在单词的语义(含义)上应用一些向量数学。例如。 W('cheesburger') - W('奶酪')= W('汉堡')或W('王子') - W('男人')+ W('女人')= W('公主')查看更多例如在https://www.oreilly.com/learning/capturing-semantic-meanings-using-deep-learning

答案 2 :(得分:2)

通过查看layerkeras文档,您会看到以下内容:

Embedding(1000, 64, input_length=10)
#the model will take as input an integer matrix of size (batch, input_length).
#the largest integer (i.e. word index) in the input should be no larger than 999 (vocabulary size).
#now model.output_shape == (None, 10, 64), where None is the batch dimension.

通过使用您在帖子中提供的值,您可以尝试掌握此方法的想法,并可以提出以下设置:

  • input_dim=38
  • input_length=75

虽然output_dim是一个模型参数,您仍需要确定(并且可能必须尝试不同的值才能找到最佳值)。

修改:您可以找到有关嵌入图层here的其他信息。

答案 3 :(得分:0)

我在理解“output_dim”参数时遇到了特别困难,但作为一个视觉人士,我发现这张图片很有帮助。词嵌入将从标记器获得的单个整数值转换为 n 维数组。例如,单词“cat”的分词器的值可能为“20”,但 keras 的嵌入层可以使用词汇中的所有词来构建词嵌入,以确定词汇中所有词之间的关系(包括“猫”) .它找到“维度”或特征,例如“活人”、“猫科动物”、“人类”、“性别”等。然后“猫”这个词具有每个维度/特征的值。“output_dim”参数只是告诉 keras您希望嵌入矩阵中有多少维度/特征。

enter image description here