填充张量有什么影响?
What are the effects of padding a tensor?
我正在使用 Keras 解决一个一直给我带来问题的问题:
我的 X 数据都是形状 (num_samples
, 8192, 8),但我的 Y 数据是形状 (num_samples
, 4),其中 4
是一个-热编码矢量。
X 和 Y 数据都将 运行 通过 LSTM 层,但这些层拒绝 Y 数据,因为它与 X 数据的形状不匹配。
Y数据用0填充以匹配X数据的维度是否不合理?那会有什么样的影响?有更好的解决方案吗?
编辑澄清:
根据要求,这里有更多信息:
我的 Y 数据表示通过我的模型传递 X 数据的预期输出。这是我第一次使用 LSTM,所以我没有考虑架构,但我想使用一种架构,该架构可以很好地将长(8192 长度)的单词序列分类为几个类别之一。此外,当通过 LSTM 馈送时,我拥有的数据集非常大,所以我目前正在使用批量训练。
正在使用的技术:
- Keras(Tensorflow 后端)
TL;DR 用零填充一个张量以匹配另一个张量的形状是否是个坏主意?有什么更好的方法?
首先,让我们确保您的表述确实如您所想; 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 需要一个具有时间维度的张量,但您的输出具有 none。如果是这种情况,您需要让您的第一个 LSTM 在每个时间步也输出中间表示,如下所示:
myNewRecurrentFunction=LSTM(4, return_sequences=True)
myLongOutput = myNewRecurrentFunction(myLongInput)
myLongOutput.shape
TensorShape([Dimension(None), Dimension(None), Dimension(4)])
如您所见,新输出现在是三阶张量,第二维现在是(尚未分配的)时间步长。你可以重复这个过程直到你的最终输出,你通常不需要中间表示,而只需要最后一个。 (旁注:如果输出为 one-hot 格式,请确保将最后一层的激活设置为 softmax)
关于您最初的问题,zero-padding 对您的网络几乎没有负面影响。网络在开始时会有点紧张,试图弄清楚您刚刚抛给它的附加值的概念,但很快就会发现它们毫无意义。这是以更大的参数 space 为代价的(因此需要更多的时间和内存复杂性),但大多数时候并不会真正影响预测能力。
希望对您有所帮助。
我正在使用 Keras 解决一个一直给我带来问题的问题:
我的 X 数据都是形状 (num_samples
, 8192, 8),但我的 Y 数据是形状 (num_samples
, 4),其中 4
是一个-热编码矢量。
X 和 Y 数据都将 运行 通过 LSTM 层,但这些层拒绝 Y 数据,因为它与 X 数据的形状不匹配。
Y数据用0填充以匹配X数据的维度是否不合理?那会有什么样的影响?有更好的解决方案吗?
编辑澄清: 根据要求,这里有更多信息:
我的 Y 数据表示通过我的模型传递 X 数据的预期输出。这是我第一次使用 LSTM,所以我没有考虑架构,但我想使用一种架构,该架构可以很好地将长(8192 长度)的单词序列分类为几个类别之一。此外,当通过 LSTM 馈送时,我拥有的数据集非常大,所以我目前正在使用批量训练。
正在使用的技术:
- Keras(Tensorflow 后端)
TL;DR 用零填充一个张量以匹配另一个张量的形状是否是个坏主意?有什么更好的方法?
首先,让我们确保您的表述确实如您所想; 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 需要一个具有时间维度的张量,但您的输出具有 none。如果是这种情况,您需要让您的第一个 LSTM 在每个时间步也输出中间表示,如下所示:
myNewRecurrentFunction=LSTM(4, return_sequences=True)
myLongOutput = myNewRecurrentFunction(myLongInput)
myLongOutput.shape
TensorShape([Dimension(None), Dimension(None), Dimension(4)])
如您所见,新输出现在是三阶张量,第二维现在是(尚未分配的)时间步长。你可以重复这个过程直到你的最终输出,你通常不需要中间表示,而只需要最后一个。 (旁注:如果输出为 one-hot 格式,请确保将最后一层的激活设置为 softmax)
关于您最初的问题,zero-padding 对您的网络几乎没有负面影响。网络在开始时会有点紧张,试图弄清楚您刚刚抛给它的附加值的概念,但很快就会发现它们毫无意义。这是以更大的参数 space 为代价的(因此需要更多的时间和内存复杂性),但大多数时候并不会真正影响预测能力。
希望对您有所帮助。