即使只有批量大小未知

时间:2017-03-30 09:39:05

标签: tensorflow

我使用以下代码计算Tensorflow中的2D反卷积:

def deconv2d_strided(input_, filter_h, filter_w, channels_in, channels_out, output_shape,
                     pool_factor=2, name='deconv', reuse=False):
    with tf.variable_scope(name, reuse=reuse):
        w = tf.get_variable(...)
        b = tf.get_variable(...)
        minus_b = tf.subtract(input_, b)

        # dynamic shape of input_:
        in_shape = tf.shape(input_)
        out_shape = [in_shape[0], output_shape[0].value, output_shape[1].value, channels_out]
        out = tf.nn.conv2d_transpose(minus_b,
                                     filter=w,
                                     output_shape=tf.pack(out_shape),
                                     strides=[1, pool_factor, pool_factor, 1],
                                     padding='SAME')
        return out

我面临的问题是out的形状看起来像shape=(?, ?, ?, ?),即使我传入函数的out_shape是完全定义的,除了第一个维度(这是批量大小)。即。

out_shape = <class 'list'>: [<tf.Tensor 'decoder/conv_l4/strided_slice:0' shape=() dtype=int32>, 5, 15, 256]

如何使out的形状看起来像(?, 5, 15, 256)

我希望将形状尽可能完整地定义,因为它的输出将进入批量标准化层,为此,必须完全定义通道维度(这是最后一个),否则Tensorflow会抱怨(参见tf.contrib.layers.python.layers.batch_norm)。所以,如果你有一个解决方案,我怎么能把一个带有未定义的通道维度的张量传递到批量标准化层,这对我来说也有用,虽然我更愿意让这件事情正确并弄清楚为什么{{1的输出形状未定义。

1 个答案:

答案 0 :(得分:3)

TensorFlow问题已经讨论过这个主题,似乎他们仍然需要修复它。

这里有Issuethis可以解决您的问题。