2017-07-05 10 views
1

2d画像で構成されるデータサンプルに畳み込みレイヤを使用します。フィルタの形状の1つの選択肢は1x2であり、隣接する2つのピクセルの1x2連続ブロックに作用する。 2ピクセルにも作用するフィルタを使用したいが、ピクセルはそれらの間に別のピクセルで区切られている場合はどうすればよいですか?ニューラルネットワークにおける畳み込みのためのそのようなフィルタを符号化することは可能ですか?conv2dの任意のフィルタ(長方形とは対照的に)

+1

を試みることができますか? –

答えて

0

不可能です。 Convolutionはn-dim hypercubeで動作しますので、あなたが示唆しているものは畳み込みではなく、何らかのペドロponte演算子です。あなたはwrite it on your own(tf conv演算子に基づいて)まで自由ですが、それは簡単ではなく、たぶん畳み込みよりも良い結果を達成できません。

4

コードは、それが

を動作させるためにここConv2dだけ中心と外の値を通過することができ、5×5のマスクのカーネルを定義するいくつかの例のコードです。

import tensorflow as tf 
import numpy as np 

image = np.array(range(25)).reshape([1,5,5,1]).astype(float) 
image = tf.stop_gradient(tf.constant(image , dtype=tf.float32)) 


kern = tf.Variable(tf.ones([5,5,1,1] , dtype=tf.float32)) 

mask = np.array([[ 1., 1., 1., 1., 1.], 
       [ 1., 0., 0., 0., 1.], 
       [ 1., 0., 1., 0., 1.], 
       [ 1., 0., 0., 0., 1.], 
       [ 1., 1., 1., 1., 1.]]).reshape([5,5,1,1]) 
mask_variable = tf.Variable(mask , dtype=tf.float32) 
mask = tf.stop_gradient(mask_variable) 

output   = tf.nn.conv2d(image , kern  , strides=[1,1,1,1] , padding="VALID") 
output_with_mask = tf.nn.conv2d(image , kern * mask , strides=[1,1,1,1] , padding="VALID") 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

print "Using whole kernal :",sess.run(output) 

print "Using kernal with a mask :",sess.run(output_with_mask) 

と出力

Using whole kernal : [[[[ 300.]]]] 
Using kernal with a mask : [[[[ 204.]]]] 

マスクがtf.stop_gradientに包まれているのでさらに、バックプロパゲーションは、マスクを変更することはありません。 @のビジェイ-mと、これを行うことが可能であるはい

概要

は述べて、そしてあなたはおそらく、サルバドール・ダリが述べた@としてこれを行うにはしたくないん。もちろん、あなたがこれをやりたいと望む理由は学問的な理由があります。

歓声

+1

私は六角形のグリッド上のゲームのために畳み込みネットワークを実験しています。これはこの手法の有効なアプリケーションと思われます。 – Marc

+0

これはすばらしいアプリケーションであり、まったく適切です!私はそれを考えなかった。 – Wontonimo

+0

stop_gradient()操作が定数にのみ作用するときに、なぜ必要なのですか? – Marc

0
(どこにでも配置重みを持つ)

任意のフィルタが使用できませんが、あなたの具体的な例を扱うことができる予備グリッド、上の重みを置くatrous畳み込みという便利なバージョンによって制限が存在します。例えば

は、あなたのケースでは、あなたは0と1の「マスク」を作成し、重みにそれを適用し、通常の畳み込みを行うことができます

W = tf.Variable(tf.random_uniform((1, 2, n_in, n_out)) 
tf.nn.atrous_conv2d(value, W, (1, 2), 'SAME') 
関連する問題