如何在Tensorflow中读取可变长度的1D输入?

问题描述:

我正在尝试将可变长度的1-D输入读入Tensorflow CNN。如何在Tensorflow中读取可变长度的1D输入?

我以前通过使用tf构建一个CSV文件(其中第一列是标签,其余列是输入值 - 展平光谱图数据全部填充/截断为相同长度)来实现读取固定长度输入。 TextLineReader()。

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

+0

如果您显示代码和/或数据样本,这可能会有所帮助。 – tagoma

我假设数据不变形,当你有一个更长或更短的样本权利?我的意思是说,如果你在1000像素的数组上训练你的网络,那么你的网络的内核大小就是[5,1]。那[5,1]内核需要在可变长度数据中看到与训练数据中相同的模式。如果您的数据被拉伸或缩小,则正确的解决方案是将数据内插到与训练数据相同的大小,以便形状/模式匹配。

假设您只需要可变长度输入,那么在理论上,您应该可以通过将批处理大小设置为1并更改数据的第一维来完成此操作。

所以,你输入的占位符会是什么样子:

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

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

这与配置tensorflow以支持变量批量大小并无太大区别。因此,您应该查看下面的链接并了解该流程。

get the size of a variable batch dimension

需要注意的是,因为你不能就能够构建缺失值矩阵的第二维,你不能使用批量规模超过1这里。我期望卷积运算能够与这个可变维度一起工作(尽管我实际上没有尝试过)。

解决这个问题的另一种方法是用0填充你的输入,这样它们都有一个共同的长度,但是这需要先在模型中进行训练。

+0

感谢David,我决定按可变长度维度对数据进行排序,然后在每个minibatch中执行零填充方法。因此,在每个小批次内,所有样品的长度都相同(等于小批量长度的最大值),但批次之间的长度可能会有所不同。 – kashkar

+0

我对此有一个后续问题:http://*.com/questions/43684048/tensorflow-building-graph-with-batch-sizes-varying-in-dimension-1 – kashkar