如何在 Tensorflow 中读取可变长度的一维输入?

How do I read variable length 1D inputs in Tensorflow?

我正在尝试将可变长度的一维输入读取到 Tensorflow CNN 中。

我之前通过首先构建一个 CSV 文件来实现读取固定长度的输入(其中第一列是标签,其余列是输入值 - 扁平化的频谱图数据全部 padded/truncated 到相同的长度)使用 tf.TextLineReader()。

这次我有一个充满文件的目录,每个文件都包含一行我想用作输入的数据(再次展平频谱图数据,但我不想强制它们具有相同的尺寸),以及线长不是固定的。我在尝试使用之前先编译 CSV 的方法时遇到错误。我查看了 tf.TextLineReader() 的文档,它指定所有 CSV 行必须具有相同的形状,所以我被卡住了!任何帮助将不胜感激,谢谢 :)

我假设当您有更长或更短的样本时数据不会改变形状,对吧?我的意思是,如果您在 1000 像素的阵列上训练您的网络,例如使用 [5,1] 大小的内核。 [5,1] 内核需要在可变长度数据中看到与在训练数据中相同的模式。如果您的数据被拉伸或收缩,那么正确的解决方案是将数据插值到与训练数据相同的大小,以便 shapes/patterns 匹配。

假设您只需要可变长度输入,那么理论上您应该能够通过将批量大小设置为 1 并改变数据的第一个维度来做到这一点。

因此您的输入占位符将如下所示:

X = tf.placeholder(dtype, shape=[1,None,1,1])

4 个形状参数是:1=批量大小; None=未知第一维度大小; 1=未使用,因为它是 1D 数据集,1=单通道图像,同样未使用,但 tf.conv2d 接收预期的 4D 图像是必需的。

这与配置 tensorflow 以支持可变批量大小没有太大区别。因此,您应该查看下面的 link 并了解该过程。

请注意,您不能在此处使用大于 1 的批量大小,因为您将无法构建在二维中具有缺失值的矩阵。我希望卷积运算能够处理这个可变维度(虽然我还没有实际尝试过)。

解决此问题的另一种选择是用 0 填充您的输入,以便它们都有共同的长度,但这需要预先训练到模型中。