tensorflow keras embedding lstm

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

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)

我对于如何在这里添加一个 Embedding 层有点困惑。

以下是文档中对 Embedding 层的描述:

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 层时,我对于 Embedding 函数的哪些参数对应于“序列数量”和“每个时间步的特征数量”感到非常困惑。谁能指导我如何将 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 网络中?


回答:

从 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 是你的词汇量大小。

  • 这个 答案 包含了一个你可能会觉得有用的可重现示例。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注