我想在将输入数据 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
是你的词汇量大小。 - 这个 答案 包含了一个你可能会觉得有用的可重现示例。