【问题标题】:Keras- Embedding layerKeras-嵌入层
【发布时间】:2017-09-11 12:30:52
【问题描述】:

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

【问题讨论】:

    标签: python deep-learning keras


    【解决方案1】:

    为了将词用于自然语言处理或机器学习任务,需要先将它们映射到一个连续的向量空间,从而创建词向量词嵌入。 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会随机初始化向量作为默认选项,然后在训练过程中学习最优词向量。

    【讨论】:

      【解决方案2】:
      • 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 允许你映射更大的词汇,但也增加了嵌入层的参数数量。参数个数为 input_dim x output_dim。

      据我了解,这些向量是随机启动的,并使用优化器算法像任何其他层一样进行训练。但是,您可以使用不同的算法,例如 word2vec 或预训练的向量,例如 glove (https://nlp.stanford.edu/projects/glove/)。想法是每个单词将代表空间中的一个唯一位置(由它的向量描述),您可以在单词的语义(含义)上应用一些向量数学。例如。 W('cheesburger') - W('cheese') = W('hamburger') 或 W('prince') - W('man') + W('woman') = W('princess') 查看更多例如在https://www.oreilly.com/learning/capturing-semantic-meanings-using-deep-learning

      【讨论】:

      • 这是一个非常直观和清晰的解释。非常感谢。
      【解决方案3】:

      通过查看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

      【讨论】:

      • 但是直观上看这个层实际上做了什么?我知道它将稀疏矩阵转换为密集矩阵。这是我们使用这一层的唯一原因吗?
      • 还有一个trainable参数,在你提供的第一个链接中我看不到,在哪里可以看到其他参数及其描述?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2018-08-12
        • 1970-01-01
        • 2019-11-13
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 2018-09-23
        • 2019-04-06
        相关资源
        最近更新 更多