2017-07-11 27 views
2

データはNHWC:100 x 64 x 64 x 3の形式です。私はラプラシアンフィルタを各チャンネルに別々に適用したいと思う。出力を100 x 64 x 64 x 3としたい。フィーチャマップごとに個別に畳み込みを行う方法

k = tf.reshape(tf.constant([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], tf.float32), [3, 3, 1, 1]) 

これを試しましたが、これは寸法の誤差をスローします。入力として3つのチャンネルが必要です。 出力= tf.abs(tf.nn.conv2d(入力、K、ストライド= [1、1、1、1]、パディング= 'SAME'))

Iはk = tf.reshape(tf.constant([[0, -1, 0], [-1, 4, -1], [0, 1, 0]]*3, tf.float32), [3, 3, 3, 1])修飾が、これは単に1つの特徴を出力します地図100 x 64 x 64 x 1。 `

tf.nn.depthwise_conv2dを使ってみましたが、同じエラーが発生しました。どのように実際に実装するのですか?

output = tf.abs(tf.nn.depthwise_conv2d(input, k, strides=[1, 1, 1, 1], padding='SAME')) 

答えて

2

これはtf.nn.depthwise_conv2dの機能です。しかし、それはそれよりも一般的であり、チャンネルごとに1つ以上のコンボリューションカーネルを実際に選択させます。

すべてのチャネルで同じカーネルを使用する場合は、チャネル数に合わせてカーネルを複製する必要があります。例えば。

# my 2D conv kernel 
k = tf.constant([[0, -1, 0], [-1, 4, -1], [0, 1, 0]], tf.float32) 
# duplicate my kernel channel_in times 
k = tf.tile(k[...,tf.newaxis], [1, 1, channel_in])[...,tf.newaxis] 
# apply conv 
tf.nn.depthwise_conv2d(input, k, strides=[1, 1, 1, 1], padding='SAME') 
関連する問題