tensorflow keras嵌入lstm

我想在将输入数据输入到我试图创建的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_step1 = Input(shape=(SEQ_LENGTH_STEP1, NR_FEATURES_STEP1), 
                           name='input_step1')

在定义嵌入层时,我很困惑嵌入函数的哪些参数对应于“序列数”和“每个时间步长中的特征数”.任何人都可以指导我如何将嵌入层集成到我上面的代码中吗?

附录:

如果我尝试以下方法:

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]

我显然没有做正确的事情..有没有办法将嵌入集成到我试图尝试的LSTM网络?

最佳答案 从Keras
Embedding文档:

Arguments

  • input_dim: int > 0. Size of the vocabulary, i.e. maximum integer index + 1.
  • output_dim: int >= 0. Dimension of the dense embedding.
  • input_length: Length of input sequences, when it is
    constant. This argument is required if you are going to connect
    Flatten then Dense layers upstream (without it, the shape of the dense
    outputs cannot be computed).

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

> 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未定义.
>假设您的第一个图层是嵌入图层,输入张量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包含一个可重现的示例,您可能会发现它很有用.

点赞