当前位置: 首页 > 知识库问答 >
问题:

在Keras中构建具有嵌入层的LSTM网络

庄宇
2023-03-14

我想创建一个Keras模型,包括一个嵌入层,然后是两个具有dropout 0.5的LSTM,最后是一个具有softmax激活的密集层。

第一个LSTM应该将顺序输出传播到第二层,而在第二层中,我只想在处理完整个序列后获得LSTM的隐藏状态。

我尝试了以下方法:

sentence_indices = Input(input_shape, dtype = 'int32')

embedding_layer = pretrained_embedding_layer(word_to_vec_map, word_to_index)

embeddings = embedding_layer(sentence_indices)
# Propagate the embeddings through an LSTM layer with 128-dimensional hidden state
X = LSTM(128, return_sequences=True, dropout = 0.5)(embeddings)

# Propagate X trough another LSTM layer with 128-dimensional hidden state
X = LSTM(128, return_sequences=False, return_state=True, dropout = 0.5)(X)

# Propagate X through a Dense layer with softmax activation to get back a batch of 5-dimensional vectors.
X = Dense(5, activation='softmax')(X)

# Create Model instance which converts sentence_indices into X.
model = Model(inputs=[sentence_indices], outputs=[X])

但是,我遇到以下错误:

ValueError: Layer dense_5 expects 1 inputs, but it received 3 input tensors. Input received: [<tf.Tensor 'lstm_10/TensorArrayReadV3:0' shape=(?, 128) dtype=float32>, <tf.Tensor 'lstm_10/while/Exit_2:0' shape=(?, 128) dtype=float32>, <tf.Tensor 'lstm_10/while/Exit_3:0' shape=(?, 128) dtype=float32>]

显然,LSTM并没有返回我所期望的形状输出。如何修复此问题?

共有1个答案

黄磊
2023-03-14

如果设置了return\u state=True,则LSTM(…)(十) 返回三个内容:输出、最后一个隐藏状态和最后一个单元格状态。

因此,与X=LSTM(128,return\u sequences=False,return\u state=True,dropout=0.5)(X)相反,doX,h,c=LSTM(128,return\u sequences=False,return\u state=True,dropout=0.5)(X)

请参阅此处的示例。

 类似资料:
  • 嘿,伙计们,我已经建立了一个有效的LSTM模型,现在我正在尝试(不成功)添加一个嵌入层作为第一层。 这个解决方案对我不起作用。在提问之前,我还阅读了这些问题:Keras输入解释:输入形状、单位、批次大小、尺寸等,了解Keras LSTM和Keras示例。 我的输入是一种由27个字母组成的语言的字符的单键编码(1和0)。我选择将每个单词表示为10个字符的序列。每个单词的输入大小是(10,27),我有

  • 我正在Keras培训一名LSTM: 每个单元的输入是一个已知的2048向量,不需要学习(如果您愿意,它们是输入句子中单词的ELMo嵌入)。因此,这里没有嵌入层。 由于输入序列具有可变长度,因此使用

  • 我开始学习RNN,并尝试在Keras中实现SimpleRNN。这是我的代码: 系统抛出以下错误: 回溯(最后一次调用):模型中第1行的文件“”。添加(SimpleRN(32))文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/keras/engine/sequential.py”,第18

  • 问题内容: 我知道这是一个有很多问题的主题,但是我找不到解决问题的办法。 我正在使用遮罩层在可变长度输入上训练LSTM网络,但似乎没有任何效果。 输入形状(100、362、24),其中362为最大序列长度,特征为24,特征数为100,样本数为100(划分为75列/有效值为25)。 输出形状(100,362,1)随后转换为(100,362-N,1)。 这是我的网络的代码: 我的数据最后被填充。例:

  • 问题内容: 我认为当输入值为0时将输出0,因此以下各层可能会跳过计算或其他操作。 如何运作? 例: 实际输出为:(数字是随机的) 但是,我认为输出将是: 问题答案: 实际上,设置嵌入层不会导致返回零向量。而是,嵌入层的行为不会改变,它将返回索引为零的嵌入向量。您可以通过检查Embedding层权重(即在您提到的示例中为)来确认这一点。取而代之的是,它将影响诸如RNN层之类的后续层的行为。 如果检查

  • 问题内容: 我正在尝试构建LSTM模型,以解决https://keras.io/layers/recurrent/中的文档示例 以下三行代码(加上注释)直接来自上面的文档链接: ValueError:输入0与层lstm_2不兼容:预期ndim = 3,找到的ndim = 2 在执行第二个model.add()语句之后,但在将模型暴露给我的数据甚至编译它之前,我在上面得到了该错误。 我在这里做错了什