我正在尝试在Tensorflow中构建CNN模型,其中批次中的所有输入都是相同的形状,但是在批次之间,输入在尺寸1中变化(即,小批量大小相同但小批量形状不是)。
为了更清楚,我有各种值N的数据(Nx23x1),我先按升序排序。在每批(50个样本)中,我对每个样本进行零填充,以使每个N_i等于其小批量中的最大N.现在我已为批输入定义了Tensorflow占位符:
input = tf.placeholder(tf.float32, shape=(batch_size, None, IMAGE_WIDTH, NUM_CHANNELS))
我在输入占位符中使用'None',因为批次之间此值会有所不同,即使在批处理中它也不会。在运行我的训练代码时,我使用feed_dict传入输入值(numpy矩阵),如教程中所定义。
我的CNN代码接受此输入;然而,这是我遇到问题的地方。尝试在完全连接的图层之前展平输入时,我得到一个ValueError。它试图压平数组,但其中一个维度仍为“无”。所以我试过了:
length = tf.shape(input)[1]
reshaped = tf.reshape(input, [batch_size, length, IMAGE_WIDTH, NUM_CHANNELS])
但是值仍然是'无',我在尝试最初构建图时遇到问题。我的FC层(以及展平)在构建权重和偏置张量时明确接受'input_to_layer.get_shape()[1]',但它无法处理None输入。
我很遗憾如何继续!非常感谢帮助,谢谢:)
##编辑##
Danevskyi在下面指出,这可能是不可能的。如果不是完全连接的层,我想在整个标题上表示池(即对于从先前的转换层输出的1024个平面过滤器的大小(D,)),我想通过平均池来创建1024-dim向量超过每个过滤器的长度D)? 1D Global Avg Pooling可以实现这一目标吗?在批次之间,D的值会有所不同......##更新##
来自tflearn(tflearn.layers.conv.global_avg_pool)的全局平均池方法不需要指定的窗口大小,它使用完整的输入维度,因此它与TensorFlow中未知的“无”维度兼容。
答案 0 :(得分:1)
没有办法做到这一点,因为你想为每个不同的批次使用不同形状的矩阵(对于完全连接的层)。
一种可能的解决方案是使用全局平均合并(沿所有空间维度)获得形状-DbuildVersion=""
的张量,而不管第二维。
答案 1 :(得分:1)
您可以指定变量形状占位符并使用它们来存储可变长度批次。如果你查看TensorFlow的基本MNIST教程,他们使用以下行作为输入数据占位符x = tf.placeholder(tf.float32, [None, 784])
在形状列表中,784是单个MNIST图像的大小(展平为1D),但是没有是批量大小。这是教程的链接
https://www.tensorflow.org/get_started/mnist/beginners所以你可以查看代码的其余部分