我目前在tensorflow中实现了神经网络,但是我在训练后进行预测时遇到问题,因为我有一个conv2d_transpose操作,这些操作的形状取决于批量大小。我有一个需要output_shape作为参数的图层:
def deconvLayer(input, filter_shape, output_shape, strides):
W1_1 = weight_variable(filter_shape)
output = tf.nn.conv2d_transpose(input, W1_1, output_shape, strides, padding="SAME")
return output
这实际上是在我构建的大型模型中使用的,如下所示:
conv3 = layers.convLayer(conv2['layer_output'], [3, 3, 64, 128], use_pool=False)
conv4 = layers.deconvLayer(conv3['layer_output'],
filter_shape=[2, 2, 64, 128],
output_shape=[batch_size, 32, 40, 64],
strides=[1, 2, 2, 1])
问题是,如果我使用经过训练的模型进行预测,我的测试数据必须具有相同的批量大小,否则我会收到以下错误。
tensorflow.python.framework.errors.InvalidArgumentError: Conv2DBackpropInput: input and out_backprop must have the same batch size
是否有某种方法可以预测具有可变批量大小的输入?当我查看训练过的砝码时,似乎没有任何东西取决于批量大小,所以我不明白为什么这会是一个问题。
答案 0 :(得分:7)
所以我在https://github.com/tensorflow/tensorflow/issues/833找到了基于tensorflow问题论坛的解决方案。
在我的代码中
conv4 = layers.deconvLayer(conv3['layer_output'],
filter_shape=[2, 2, 64, 128],
output_shape=[batch_size, 32, 40, 64],
strides=[1, 2, 2, 1])
传递给deconvLayer的输出形状在训练时使用预定的批量形状进行了硬编码。通过将此更改为以下内容:
def deconvLayer(input, filter_shape, output_shape, strides):
W1_1 = weight_variable(filter_shape)
dyn_input_shape = tf.shape(input)
batch_size = dyn_input_shape[0]
output_shape = tf.pack([batch_size, output_shape[1], output_shape[2], output_shape[3]])
output = tf.nn.conv2d_transpose(input, W1_1, output_shape, strides, padding="SAME")
return output
这允许在运行时动态推断形状,并且可以处理可变批量大小。
运行代码时,在传递任何批量大小的测试数据时,我不再收到此错误。我认为这是必要的,因为转置操作的形状推断在目前并不像普通的卷积操作那样简单。因此,我们通常在普通卷积运算中使用None作为batch_size,我们必须提供一个形状,因为这可能会因输入而异,所以我们必须经过动态确定它。