如何使用4维输入进行LSTM训练?

10

我有一个这样形状的序列输入:(6000, 64, 100, 50)

6000 只是示例序列的数量。每个序列的长度为 64

我打算使用Keras将此输入拟合到一个LSTM模型中。

我按以下方式设置我的输入:

input = Input(shape=(64, 100, 50))

这给出了我一个输入的形状是 (?, 64, 100, 50)

但是,当我将input放入我的LSTM中,像这样:

x = LSTM(256, return_sequences=True)(input)

我遇到了这个错误:

输入0与lstm_37层不兼容:期望ndim=3,但发现ndim=4

如果我的输入形状像(?, 64, 100)这样,就可以工作,但是当我有第四维度时就不行。

这是否意味着LSTM只能接受三维的输入?如何使用Keras将四维或更高维度的输入馈送到LSTM中?

2个回答

6

你也可以考虑使用TimeDistributed(LSTM(...))

inp = Input(shape=(64, 100, 50))
x = TimeDistributed(LSTM(256, return_sequences=True))(inp)

model = Model(inp, x)
model.compile('adam', 'mse')
model.summary()

1
这正是我在谷歌搜索我的问题时寻找的图层类型。我希望我可以投多个赞! - Ryan
对于任何寻找类似内容的人,这是我的示例用例:我一直在尝试构建一个模型,用于对具有多个发言者的通话文本进行分类。分类发生在对话级别而不是单个话语级别。我有一个变压器模型(类似BERT),但我需要将其应用于每个对话中的话语,并将其用作特征。时间分布层非常适合这种情况。 - Ryan

4
答案是你不能。
Keras文档为循环层提供以下信息:
输入形状
形状为(批大小,时间步长,输入维度)的3D张量。
在您的情况下,您有64个时间步长,每个步骤的形状为(100, 50)。使模型工作的最简单方法是将数据重塑为(100*50)。
Numpy提供了一个很容易实现的函数:
X = numpy.zeros((6000, 64, 100, 50), dtype=numpy.uint8)
X = numpy.reshape(X, (6000, 64, 100*50))

无论这是否合理,高度取决于您的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接