Torch有一个功能nn.DepthConcat
,它与nn.Concat
相似,除了它用零填充以使所有非通道暗片具有相同的尺寸。我一直在尝试在tensorflow中使用它,但运气不好。如果我知道在构建图时所有张量的大小,这似乎行得通:
def depthconcat(inputs):
concat_dim = 3
shapes = []
for input_ in inputs:
shapes.append(input_.get_shape())
shape_tensor = tf.pack(shapes)
max_dims = tf.reduce_max(shape_tensor, 0)
padded_inputs = []
for input_ in inputs:
paddings = max_dims - input_.get_shape()
padded_inputs.append(tf.pad(input_, paddings))
return tf.concat(concat_dim, padded_inputs)
然而,如果形状是在运行时确定的,我得到以下错误:
Tensors in list passed to 'values' of 'Pack' Op have types [<NOT CONVERTIBLE TO TENSOR>, <NOT CONVERTIBLE TO TENSOR>, <NOT CONVERTIBLE TO TENSOR>, <NOT CONVERTIBLE TO TENSOR>] that don't all match.
似乎可以将TensorShape
对象转换为张量,如果它在图构建时被完全定义。有什么建议吗?谢谢。
编辑:由input_.get_shape()
改为tf.shape(input_)
,解决了图形创建时形状模糊的问题。现在我得到ValueError: Shape (4,) must have rank 2
我希望这对任何试图构建具有不同输出大小的初始模块的人有所帮助。
def depthconcat(inputs):
concat_dim = 3
shapes = []
for input_ in inputs:
shapes.append(tf.to_float(tf.shape(input_)[:3]))
shape_tensor = tf.pack(shapes)
max_dims = tf.reduce_max(shape_tensor, 0)
padded_inputs = []
for idx, input_ in enumerate(inputs):
mean_diff = (max_dims - shapes[idx])/2.0
pad_low = tf.floor(mean_diff)
pad_high = tf.ceil(mean_diff)
paddings = tf.to_int32(tf.pack([pad_low, pad_high], axis=1))
paddings = tf.pad(paddings, paddings=[[0, 1], [0, 0]])
padded_inputs.append(tf.pad(input_, paddings))
return tf.concat(concat_dim, padded_inputs, name=name)