我正在使用Keras解决问题一直在向我提出问题:
我的X数据形状完整(num_samples
,8192,8),但我的Y数据形状(num_samples
,4),其中4
是一热的编码的矢量。
X和Y数据都将通过LSTM图层运行,但图层拒绝Y数据,因为它与X数据的形状不匹配。
是否用0填充Y数据,使其与X数据的维度不匹配?会有什么样的影响?有更好的解决方案吗?
编辑澄清: 根据要求,这里有更多信息:
我的Y数据表示通过我的模型传递X数据的预期输出。这是我第一次使用LSTM,所以我没有考虑架构,但我想使用一种适用于将长(8192长)单词序列分类为几个类别之一的架构。另外,我通过LSTM输入的数据集非常大,所以我目前正在使用批量训练。
正在使用的技术:
TL; DR 在所有维度中用零填充一个张量以匹配另一个张量的形状是一个坏主意?什么是更好的方法?
答案 0 :(得分:1)
首先,让我们确保您的代表实际上是您的想法; LSTM(或任何复发层)的输入必须具有维度:(时间步长,形状),即如果你有1000个训练样本,每个样本包含100个时间步长,每个时间步长有10个值,你的输入形状将是(100,10,)。因此,我从您的问题中假设X集中的每个输入样本每步有8192步和8个值。大;单个LSTM层可以迭代这些并生成4维表示,绝对没有问题,就像这样:
myLongInput = Input(shape=(8192,8,))
myRecurrentFunction = LSTM(4)
myShortOutput = myRecurrentFunction(myLongInput)
myShortOutput.shape
TensorShape([Dimension(None), Dimension(4)])
我认为你的问题源于尝试在第一个LSTM之上应用另一个LSTM;下一个LSTM需要一个具有时间维度的张量,但是你的输出没有。如果是这种情况,您需要让您的第一个LSTM也在每个时间步输出中间表示,如下所示:
myNewRecurrentFunction=LSTM(4, return_sequences=True)
myLongOutput = myNewRecurrentFunction(myLongInput)
myLongOutput.shape
TensorShape([Dimension(None), Dimension(None), Dimension(4)])
正如您所看到的,新输出现在是一个三阶张量,第二个维度现在是(尚未分配的)时间步长。您可以重复此过程,直到最终输出,您通常不需要中间表示,而只需要最后一个表示。 (旁注:如果您的输出采用单热格式,请务必将最后一层的激活设置为softmax)
在您的原始问题上,零填充对您的网络几乎没有负面影响。网络会在一开始就试图弄清楚你刚刚抛出的附加值的概念,但很快就能够了解它们没有意义。这是以更大的参数空间为代价的(因此更多的时间和内存复杂性),但在大多数情况下并没有真正影响预测能力。
我希望这很有帮助。