2017-10-14 9 views
0

テンソルフローで空のテンソルをargminし、空のリストや-1のような値を返すことにしたいと思います。デフォルトでは 、空のテンソルのarmginはこれを得られます。おそらく、tf.confを使用しておそらく空のテンソルについてのArgmin

InvalidArgumentError: Reduction axis 0 is empty in shape [0] 

は助けることができるが、私は、ベクターが空であるかどうかをチェックするかどうかはわかりません。

tf.equal(tf.size(vec), tf.constant(0)).eval() 
ValueError: Operation 'Equal_5' has been marked as not fetchable. 

もあります怠惰の問題。最初の問題が解決されて提供

tf.cond(isEmpty(vec), lambda: tf.constant(0, dtype="int64"), lambda: tf.argmin(vec)) 

、すなわちそれは、上記のcond仕事が希望、いくつかのisEmpty機能を構築することが可能ですか?

答えて

0

これは単なる対話的なセッションでした。以下は動作します:

import tensorflow as tf 


sess = tf.Session() 

a = tf.ones((2, 2, 4)) 
b = tf.zeros((2, 2, 4)) 
zero = tf.constant(0, dtype="float32") 
idx = tf.constant([1, 1]) 

region_a = tf.gather_nd(a, idx) 
region_b = tf.gather_nd(b, idx) 

where_a = tf.not_equal(region_a, zero) 
where_b = tf.not_equal(region_b, zero) 

inuse_a = tf.where(where_a) 
inuse_b = tf.where(where_b) 
inuse_a_flat = tf.reshape(inuse_a, [-1]) 
inuse_b_flat = tf.reshape(inuse_b, [-1]) 

qvals = tf.ones(4, dtype="float32") 
qvals_flat = tf.reshape(qvals, [-1]) 

inuse_a_q = tf.gather(qvals_flat, inuse_a_flat) 
inuse_b_q = tf.gather(qvals_flat, inuse_b_flat) 

size_iuq_a = tf.size(inuse_a_q) 
size_iuq_b = tf.size(inuse_b_q) 

eq_a = tf.equal(tf.size(inuse_a_q), tf.constant(0)) 
eq_b = tf.equal(tf.size(inuse_b_q), tf.constant(0)) 

argmin_a = tf.cond(
    eq_a, 
    lambda: tf.constant(-1, dtype="int64"), 
    lambda: tf.argmin(inuse_a_flat)) 

argmin_b = tf.cond(
    eq_b, 
    lambda: tf.constant(-1, dtype="int64"), 
    lambda: tf.argmin(inuse_b_flat)) 

with sess.as_default(): 
    print(inuse_a_q.eval()) 
    print(inuse_b_q.eval()) 
    print("\n") 
    print(size_iuq_a.eval()) 
    print(size_iuq_b.eval()) 
    print("\n") 
    print(eq_a.eval()) 
    print(eq_b.eval()) 
    print("\n") 
    print(argmin_a.eval()) 
    # 0 
    print(argmin_b.eval()) 
    # -1 
関連する問題