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

Keras中嵌入层和LSTM的三维阵列输入

仲孙兴旺
2023-03-14

嘿,伙计们,我已经建立了一个有效的LSTM模型,现在我正在尝试(不成功)添加一个嵌入层作为第一层。

这个解决方案对我不起作用。在提问之前,我还阅读了这些问题:Keras输入解释:输入形状、单位、批次大小、尺寸等,了解Keras LSTM和Keras示例。

我的输入是一种由27个字母组成的语言的字符的单键编码(1和0)。我选择将每个单词表示为10个字符的序列。每个单词的输入大小是(10,27),我有465个,所以它是X\U列。形状(465,10,27),我还有一个尺寸为y\U train的标签。形状(465,1)。我的目标是训练一个模型,同时构建一个角色嵌入。

这是编译和拟合的模型。

main_input = Input(shape=(10, 27))
rnn = Bidirectional(LSTM(5))
x = rnn(main_input)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)

添加嵌入层后:

main_input = Input(shape=(10, 27))
emb = Embedding(input_dim=2, output_dim = 10)(main_input)
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)

输出:ValueError:输入0与层双向\u 31不兼容:预期ndim=3,发现ndim=4

如何修复输出形状?非常感谢您的意见。

共有1个答案

杭志泽
2023-03-14

我的输入是一种由27个字母组成的语言字符的一热编码(1和0)。

您不应该将一个热编码传递到嵌入中<代码>嵌入层将整数索引映射到n维向量。因此,您应该直接传入前一个hotted索引。

一、 e.在您有一个单键输入之前,例如,由一组整数创建的,如:1,0,0,0,[1,0,0,0,1]。而不是在原始向量中传递一个热向量(10,27)。

main_input = Input(shape=(10,)) # only pass in the indexes
emb = Embedding(input_dim=27, output_dim = 10)(main_input) # vocab size is 27
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)
 类似资料:
  • 我想创建一个Keras模型,包括一个嵌入层,然后是两个具有dropout 0.5的LSTM,最后是一个具有softmax激活的密集层。 第一个LSTM应该将顺序输出传播到第二层,而在第二层中,我只想在处理完整个序列后获得LSTM的隐藏状态。 我尝试了以下方法: 但是,我遇到以下错误: 显然,LSTM并没有返回我所期望的形状输出。如何修复此问题?

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

  • 在模型中添加LSTM层之前,我不确定是否需要添加密集输入层。例如,使用以下模型: LSTM层是否为输入层,密集层是否为输出层(即无隐藏层)?或者Keras是否创建了一个输入层,这意味着LSTM层将是一个隐藏层?

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

  • 我有一个三维(time_stepinputsizetotal_num)矩阵的数据集。我想使用DataLoader为LSTM获取batch_size为5的输入数据集。我的代码如下: 我认为代码是错误的,但我不知道如何更正它。让我感到困惑的是,我如何让DataLoader知道哪个维度是“total_num”,以便获得批量大小为5的数据集。

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