Tensorflow tf.nn.conv2d_转置的输出形状完全未定义,即使只有批量大小未知

Tensorflow tf.nn.conv2d_转置的输出形状完全未定义,即使只有批量大小未知,tensorflow,Tensorflow,我使用以下代码计算Tensorflow中的二维反褶积: 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_v

我使用以下代码计算Tensorflow中的二维反褶积:

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\u形状
是完全定义的,除了第一个维度(即批量大小)。即

out_shape=:[,5,15,256]
我怎样才能使
的形状看起来像
(?,5,15,256)


我希望形状尽可能完整地定义,因为它的输出将进入一个批处理规范化层,为了使其工作,通道维度(最后一个)必须完全定义,否则Tensorflow会抱怨(参见)。因此,如果您有一个解决方案,我可以将通道维度未定义的张量传递到批处理规范化层,这对我也适用,尽管我更希望正确处理这件事,并找出
conv2d\u transpose
的输出形状未定义的原因。

这个主题已经在TensorFlow问题中讨论过,看来他们还得解决这个问题


在这里,您可以解决您的问题。

这个主题已经在TensorFlow问题中讨论过,似乎他们仍然需要解决它


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

我从中得到的另一种可能的解决方法是使用
out.set\u-shape([None]+out\u-shape[1:])
我从中得到的另一种可能的解决方法是使用
out.set\u-shape([None]+out\u-shape[1:])
out_shape = <class 'list'>: [<tf.Tensor 'decoder/conv_l4/strided_slice:0' shape=() dtype=int32>, 5, 15, 256]