2016-08-16 2 views
0

Torch hat eine Funktion nn.DepthConcat die ähnlich ist nn.Concat mit Ausnahme Pads mit Nullen, damit alle Nicht-Kanal-Dims die gleiche Größe haben. Ich habe versucht, dies im Tensorflow mit wenig Glück zu erreichen. Wenn ich die Größen aller der Tensoren in Graph Bauzeit wissen scheint dies zu funktionieren:tensorflow Version von Torch nn.DepthConcat

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) 

Wenn jedoch die Form bei zur Laufzeit bestimmt wird, bekomme ich folgende Fehlermeldung:

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. 

Es scheint, als ob es in der Lage ist, das TensorShape-Objekt in einen Tensor zu konvertieren, wenn es vollständig in der Graphenaufbauzeit definiert ist. Irgendwelche Vorschläge? Vielen Dank.

EDIT: Die Änderung von input_.get_shape() zu tf.shape(input_) löste das Problem der mehrdeutigen Form bei der Erstellung von Graphen. Jetzt bekomme ich ValueError: Shape (4,) must have rank 2

Antwort

0

Ich hoffe, das hilft jedem anderen versuchen, ein Anfangsmodul mit unterschiedlichen Ausgabegrößen zu bauen.

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) 
Verwandte Themen