【问题标题】:tensorflow keras embedding lstm张量流 keras 嵌入 lstm
【发布时间】:2019-02-22 07:33:11
【问题描述】:

我想在将输入数据输入我尝试创建的 LSTM 网络之前使用嵌入层。这是代码的相关部分:

input_step1 = Input(shape=(SEQ_LENGTH_STEP1, NR_FEATURES_STEP1), 
                           name='input_step1')

step1_lstm = CuDNNLSTM(50,
                       return_sequences=True,
                       return_state = True,
                       name="step1_lstm")

out_step1, state_h_step1, state_c_step1 = step1_lstm(input_step1)

我对如何在这里添加嵌入层有点困惑..

这是文档中对嵌入层的描述:

keras.layers.Embedding(input_dim, 
                       output_dim, 
                       embeddings_initializer='uniform',
                       embeddings_regularizer=None, 
                       activity_regularizer=None, 
                       embeddings_constraint=None, 
                       mask_zero=False, 
                       input_length=None)

令人困惑的部分是我定义的Input 具有定义的序列长度和特征数量。在这里再写一遍:

input_step1 = Input(shape=(SEQ_LENGTH_STEP1, NR_FEATURES_STEP1), 
                           name='input_step1')

在定义嵌入层时,我很困惑Embedding 函数的哪些参数对应于“序列数”和“每个时间步的特征数”。谁能指导我如何将嵌入层集成到上面的代码中?

附录:

如果我尝试以下操作:

SEQ_LENGTH_STEP1  = 5 
NR_FEATURES_STEP1 = 10 

input_step1 = Input(shape=(SEQ_LENGTH_STEP1, NR_FEATURES_STEP1), 
                           name='input_step1')

emb = Embedding(input_dim=NR_FEATURES_STEP1,
                output_dim=15,
                input_length=NR_FEATURES_STEP1)

input_step1_emb = emb(input_step1)

step1_lstm = CuDNNLSTM(50,
                       return_sequences=True,
                       return_state = True,
                       name="step1_lstm")

out_step1, state_h_step1, state_c_step1 = step1_lstm(input_step1_emb)

我收到以下错误:

ValueError: Input 0 of layer step1_lstm is incompatible with the layer:
expected ndim=3, found ndim=4. Full shape received: [None, 5, 10, 15]

我显然没有做正确的事。有没有办法将Embedding 集成到我尝试尝试的 LSTM 网络中?

【问题讨论】:

    标签: tensorflow machine-learning keras lstm embedding


    【解决方案1】:

    来自 Keras Embedding 文档:

    参数

    • input_dim: int > 0. 词汇表的大小,即最大整数索引 + 1。
    • output_dim: int >= 0。密集嵌入的维度。
    • input_length:输入序列的长度,当它是 持续的。如果您要连接,则需要此参数 在上游先展平然后密集层(没有它,密集的形状 无法计算输出)。

    因此,根据您的描述,我假设:

    • input_dim 对应于数据集的词汇量(不同单词的数量)。例如,以下数据集的词汇量为 5:

      data = ["Come back Peter,",
              "Come back Paul"]
      
    • output_dim 是一个任意超参数,用于指示嵌入空间的维度。也就是说,如果你设置output_dim=x,那么句子中的每个单词都会有x的特征。

    • input_length应设置为SEQ_LENGTH_STEP1(一个整数,表示每个句子的长度),假设所有句子的长度相同。

    嵌入层的输出形状为(batch_size, input_length, output_dim)


    关于附录的进一步说明:

    • team_in_step1 未定义。
    • 假设你的第一层是Embedding层,输入张量input_step1的预期形状是(batch_size, input_length)

      input_step1 = Input(shape=(SEQ_LENGTH_STEP1,), 
                                 name='input_step1')
      

      这个张量中的每个整数对应一个词。

    • 如上所述,嵌入层可以如下实例化:

      emb = Embedding(input_dim=VOCAB_SIZE,
                      output_dim=15,
                      input_length=SEQ_LENGTH_STEP1)
      

      VOCAB_SIZE 是您的词汇量。

    • answer 包含一个您可能会觉得有用的可重现示例。

    【讨论】:

    • 非常感谢您的澄清。我更正了您上面提到的错字。
    猜你喜欢
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多