【发布时间】:2021-02-04 03:12:10
【问题描述】:
我现在使用 keras 有一段时间了,但通常我不必使用自定义层或执行一些更复杂的流控制,所以我很难理解一些东西。
我正在建模一个顶部有一个自定义层的神经网络。这个自定义层调用另一个函数(search_sigma),在这个函数内部我执行tf.while_loop,在tf.while_loop内部我执行tf.cond。
我不明白为什么这些条件不起作用。
-
即使条件 (
l1) 仍然为真,tf.while_loop也会停止 -
tf.cond executesf1和f2(可调用的true_fn和false_fn)
有人可以帮助我了解我缺少什么吗?
我已经尝试为真正的张量更改 tf.cond 和 tf.while_loop 条件,只是想看看会发生什么。行为(完全相同的错误)保持不变。
我还尝试在不实现类的情况下编写此代码(仅使用函数)。没有任何改变。
我试图通过查看 tensorflow 文档、其他堆栈溢出问题以及谈论 tf.while_loop 和 tf.cond 的网站来寻找解决方案。
我在代码主体中留下了一些 print()s 以尝试跟踪发生了什么。
class find_sigma:
def __init__ (self, t_inputs, inputs, expected_perp=10. ):
self.sigma, self.cluster = t_inputs
self.inputs = inputs
self.expected_perp = expected_perp
self.min_sigma=tf.constant([0.01],tf.float32)
self.max_sigma=tf.constant([50.],tf.float32)
def search_sigma(self):
def cond(s,sigma_not_found): return sigma_not_found
def body(s,sigma_not_found):
print('loop')
pi = K.exp( - K.sum( (K.expand_dims(self.inputs, axis=1) - self.cluster)**2, axis=2 )/(2*s**2) )
pi = pi / K.sum(pi)
MACHINE_EPSILON = np.finfo(np.double).eps
pi = K.maximum(pi, MACHINE_EPSILON)
H = - K.sum ( pi*(K.log(pi)/K.log(2.)) , axis=0 )
perp = 2**H
print('0')
l1 = tf.logical_and (tf.less(perp , self.expected_perp), tf.less(0.01, self.max_sigma-s))
l2 = tf.logical_and (tf.less( self.expected_perp , perp) , tf.less(0.01, s-self.min_sigma) )
def f1():
print('f1')
self.min_sigma = s
s2 = (s+self.max_sigma)/2
return [s2, tf.constant([True])]
def f2(l2):
tf.cond( l2, true_fn=f3 , false_fn = f4)
def f3():
print('f3')
self.max_sigma = s
s2 = (s+self.min_sigma)/2
return [s2, tf.constant([True])]
def f4():
print('f4')
return [s, tf.constant([False])]
output = tf.cond( l1, f1 , f4 ) #colocar f2 no lugar de f4
s, sigma_not_found = output
print('sigma_not_found = ',sigma_not_found)
return [s,sigma_not_found]
print('01')
sigma_not_found = tf.constant([True])
new_sigma,sigma_not_found=sigma_not_found = tf.while_loop(
cond , body, loop_vars=[self.sigma,sigma_not_found]
)
print('saiu')
print(new_sigma)
return new_sigma
调用上述代码的一段代码是:
self.sigma = tf.map_fn(fn=lambda t: find_sigma(t, inputs).search_sigma() , elems=(self.sigma,self.clusters), dtype=tf.float32)
'inputs' 是一个 (None, 10) 大小张量
'self.sigma' 是一个 (10,) 大小张量
'self.clusters' 是一个 (N, 10) 大小张量
【问题讨论】:
标签: python tensorflow keras flow-control