我想训练一个具有平面曲线的网络,我将其表示为具有形状(L,2)
的numpy数组。
数字2代表x,y坐标,L是数据集中正在变化的点数。我把x,y看成两个不同的“通道”。在
我实现了一个函数next_batch(batch_size)
,该函数将下一批作为1D numpy数组提供,该数组的形状为(batch_size,)
,其中包含的元素是2D数组,形状为:(L,2)
。这是我的曲线,正如前面提到的,元素之间的L是不同的。我不想限制曲线上的点数。在
我的问题:
我如何操作next_batch()
的输出,以便能够使用类似于Tensorflow教程https://www.tensorflow.org/get_started/mnist/pros中出现的方案向网络提供输入曲线
也就是说,使用feed_dict
机制。
在给定的turorial中,输入大小是固定的,在教程的代码行中:
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
batch[0]
有一个固定的形状:(50,784)
(50=#个样本,784个像素)
我无法将输入转换为形状为(batch_size,L,2)
的numpy数组
因为数组在每个维度上都应该有固定的大小。
那我能做什么呢?在
我已经定义了一个占位符(大小未知):
^{pr2}$但我怎么才能喂得好呢?在
非常感谢
您可以使用占位符,并用[None,…,None]来初始化var。每个'None'都表示编译器在该维度上有输入源数据。例如,[None,None]表示可以输入任何行和列长度的矩阵。但是,您应该注意使用哪种NN。因为在处理CNN时,在卷积层和池层,必须确定“张量”的具体大小。在
您可以在TF中使用不同大小的输入。只需以与您列出的教程中相同的方式输入数据,但请确保将占位符中的更改尺寸定义为“无”。在
下面是一个简单的示例,它使用不同的形状填充占位符:
你可能在寻找一个简短的答案:你不能没有填充或按长度分组样本。在
再详细说明一下:在tensorflow中,维度必须在整个批处理中固定,并且本机不支持锯齿数组。
维度可能是先验未知的(在这种情况下,您将占位符的维度设置为
None
),但在运行时仍然会被推断出来,因此 您使用占位符的解决方案:无法工作,因为它在语义上等同于说“我不知道批处理中曲线的常量长度,在运行时从数据中推断出来”。在
这并不是说您的模型一般不能接受不同维度的输入,如果您相应地构造它,但是每次调用
sess.run()
时提供给它的数据必须具有固定的维度。在那么,您的选择如下:
沿着第二维度填充批次。
^{2美元假设有两条形状为
(4, 2)
和(5, 2)
的曲线,并且数据集中的最大曲线长度为6,可以使用np.pad
,如下所示:next_batch()
函数返回按长度分组的曲线批。在这些是处理锯齿状阵列时的标准方法。在
如果您的任务允许,另一种可能是将所有点连接到一个形状为
(None, 2)
的张量中,并更改模型,使其对单个点进行操作,就像它们是批处理中的样本一样。如果将原始采样长度保存在单独的数组中,则可以通过正确切片来恢复模型输出。这是非常低效的,需要对你的问题进行各种各样的假设,但这是有可能的。在干杯,祝你好运!在
相关问题 更多 >
编程相关推荐