2017-05-27 7 views
1

4次元の画像を表すTensorFlowプレースホルダがあります。各画像は32×32ピクセルであり、各ピクセルは3つのカラーチャネルを有する。最初の次元はイメージの数を表します。各画像のTensorFlow:複数の次元にわたってL2ノルムを取る

X = tf.placeholder(tf.float32, [None, 32, 32, 3])

、私はすべての画像のピクセルのL2ノルムを利用したいと思います。したがって、出力は、1次元(すなわち、画像当たり1つの値)のテンソルでなければならない。 tf.norm()documentation)は軸パラメータを受け取りますが、軸1,2,3のノルムを取りたいときは、ノルムを取る軸を2つまで指定することができます。どのようにすればいいですか?

n = tf.norm(X, ord=2, axis=0)   # n.get_shape() is (?, ?, 3), not (?) 
n = tf.norm(X, ord=2, axis=[1,2,3]) # ValueError 

答えて

1

他の回答に示唆されている平坦化は必要ありません。あなたは慎重にdocumentationを読まれる場合は、次のように表示します:

軸:軸はなし(デフォルト)されていない場合は、入力がベクトル とみなされ、単一のベクトルノルムが 内の値のセット全体にわたって計算されるがテンソル、すなわちノルム(テンソル、ORD = ORD) ノルムと等価である(再形成(テンソル、[-1])、ORD = ORD)

例:

import tensorflow as tf 
import numpy as np 

c = tf.constant(np.random.rand(3, 2, 3, 6)) 
d = tf.norm(c, ord=2) 

with tf.Session() as sess: 
    print sess.run(d) 
0

Iは、サルバドールの試み答えは、イメージごとに1つの番号ではなく、ミニバッチ全体に1つの番号を返します。だから、次元ごとにノルムを執行することに悩まされているように見えます。

import tensorflow as tf 
import numpy as np 

batch = tf.constant(np.random.rand(3, 2, 3, 6)) 

x = tf.norm(batch, axis=3) 
x = tf.norm(x, axis=2) 
x = tf.norm(x, axis=1) 

with tf.Session() as sess: 
    result = sess.run(x) 
print(result) 

これは、数値的な不安定性はわずかですが、理論的には画像全体のノルムを一度にとることと同じです。

x軸とy軸のノルムを取るだけで、チャネルごとにノルムを得ることも考えられます。それがテンソルフローによってサポートされている理由はありますが、これはそうではありません。

関連する問題