我使用以下代码计算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的输出形状未定义。