tensorflow keras嵌入lstm

问题描述 投票:4回答:1

我想在将输入数据输入到我试图创建的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个回答
1
投票

来自Keras Embedding文档:

参数

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

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

  • 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包含一个可重现的示例,您可能会发现它很有用。
© www.soinside.com 2019 - 2024. All rights reserved.