我在使用Keras处理一个问题时遇到了问题:
我的X数据的形状为(num_samples
, 8192, 8),但我的Y数据的形状为(num_samples
, 4),其中4
是一个独热编码向量。
X和Y数据都将通过LSTM层进行处理,但由于Y数据的形状与X数据不匹配,LSTM层拒绝处理Y数据。
将Y数据用0填充以匹配X数据的维度是否合理?这会有什么样的影响?有没有更好的解决方案?
编辑以澄清:应要求,这里提供更多信息:
我的Y数据代表将X数据通过模型处理后的预期输出。这是我的第一次使用LSTM,所以我还没有确定的架构,但我希望使用一个适合将长(8192长度)的词序列分类到几个类别中的架构。此外,我的数据集在通过LSTM处理时非常庞大,所以我目前使用批处理训练。
使用的技术:
- Keras(Tensorflow后端)
简而言之,将一个张量用零填充至所有维度以匹配另一个张量的形状是否是一个坏主意?有什么更好的方法吗?
回答:
首先,让我们确保你的表示确实是你所认为的;LSTM(或任何循环层)的输入必须是(时间步数,形状)的维度,即如果你有1000个训练样本,每个样本由100个时间步组成,每个时间步有10个值,那么你的输入形状将是(100,10,)。因此,我从你的问题中假设你的X集中的每个输入样本有8192个步骤和每个步骤8个值。很好;单个LSTM层可以迭代这些并无问题地产生4维表示,就像这样:
myLongInput = Input(shape=(8192,8,))myRecurrentFunction = LSTM(4)myShortOutput = myRecurrentFunction(myLongInput)myShortOutput.shapeTensorShape([Dimension(None), Dimension(4)])
我假设你的问题源于试图在第一个LSTM之上应用另一个LSTM;下一个LSTM期望一个具有时间维度的张量,但你的输出没有。如果是这样的话,你需要让你的第一个LSTM也输出每个时间步的中间表示,像这样:
myNewRecurrentFunction=LSTM(4, return_sequences=True)myLongOutput = myNewRecurrentFunction(myLongInput)myLongOutput.shapeTensorShape([Dimension(None), Dimension(None), Dimension(4)])
如你所见,现在的新输出是一个三阶张量,第二个维度现在是(尚未分配的)时间步。你可以重复这个过程直到你的最终输出,通常你不需要中间表示,而是只需要最后一个。(附注:如果你的输出是独热格式,请确保将最后一层的激活函数设置为softmax)
关于你最初的问题,零填充对你的网络几乎没有负面影响。网络在开始时会努力试图理解你刚刚添加的额外值的概念,但很快就会学会它们是无意义的。这会以更大的参数空间为代价(因此需要更多的时间和内存复杂度),但大多数情况下不会真正影响预测能力。
希望这些对你有帮助。