2016-08-16 6 views
0

トーチは、nn.Concatと同様の機能nn.DepthConcatを持っていますが、非チャネルディムをすべて同じサイズにするためにゼロが埋められています。私は運が少しでもテンソルフローになるようにしようとしています。私は、グラフ構築時にテンソルの全てのサイズを知っている場合、これは動作するようです:torch nn.DepthConcatテンソルフローバージョン

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. 

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) 

しかし、形状は実行時に決定された場合、私は次のエラーを取得しますグラフ作成時に完全に定義されている場合、TensorShapeオブジェクトをテンソルに変換できるようです。助言がありますか?ありがとう。

編集: input_.get_shape()からtf.shape(input_)に変更すると、グラフ作成時にあいまいな形状の問題が解決されました。今すぐ取得するValueError: Shape (4,) must have rank 2

答えて

0

さまざまな出力サイズの開始モジュールを作成しようとしている人に役立つことを願っています。

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) 
関連する問題