Python Tensorflow:tf.case具有参数化可调用性,案例列表在for循环中定义

Python Tensorflow:tf.case具有参数化可调用性,案例列表在for循环中定义,python,lambda,machine-learning,tensorflow,Python,Lambda,Machine Learning,Tensorflow,我试图在训练循环中为一组自动编码器实现一个case分支:根据特定的条件,只需要更新一个特定的自动编码器。我一直试图通过使用tf.case()实现这一点,但它并没有像我预期的那样工作 def f(k_win): update_BW = tf.train.AdamOptimizer(learning_rate=learningrate).minimize(Cost_List[k_win]) return update_MSE_winner(k_win) + [update_BW,

我试图在训练循环中为一组自动编码器实现一个case分支:根据特定的条件,只需要更新一个特定的自动编码器。我一直试图通过使用tf.case()实现这一点,但它并没有像我预期的那样工作

def f(k_win):

    update_BW = tf.train.AdamOptimizer(learning_rate=learningrate).minimize(Cost_List[k_win])

    return update_MSE_winner(k_win) + [update_BW, update_n_List(k_win), update_n_alpha_List(k_win)] 

winner_index = tf.argmin(Cost_Alpha_List, 0)



Case_List = []

for k in range(N_Class): 

    Case = (tf.equal(winner_index,k), lambda: f(k))   

    Case_List.append(Case)


Execution_List = tf.case(Case_List, lambda: f(0))
winner_索引:要更新的自动编码器索引

f(k_win):返回特定AE索引的所有更新可调用项

Case_列表:包含布尔和参数化函数对

执行列表:可为执行循环中的sess.run()调用

for循环中的参数k应该定义Case_列表,特别是“lambda:f(k)”,但在建立列表后,所有“lambda:f(k)”似乎都设置为最后一个k=N_类-1:其效果是,只有最后一个自动编码器将被更新,而不是具有“winner_index”的自动编码器。有人知道这里发生了什么吗


谢谢

问题在于,您正在定义的lambda正在使用全局变量
k
,在调用函数时,该变量具有循环中的最后一个值(
N_Class-1

一个更简单的例子:

lst = []
for k in range(10):
    lst.append(lambda: k * k)
print([lst_i() for lst_i in lst])
给出:

[81, 81, 81, 81, 81, 81, 81, 81, 81, 81]
而不是:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
更好地解释了这个问题,并指出了克服这个问题的几种方法。在您的情况下,您可以这样做:

def f(k_win):

    update_BW = tf.train.AdamOptimizer(learning_rate=learningrate).minimize(Cost_List[k_win])

    return update_MSE_winner(k_win) + [update_BW, update_n_List(k_win), update_n_alpha_List(k_win)] 

winner_index = tf.argmin(Cost_Alpha_List, 0)



Case_List = []

for k in range(N_Class): 

    Case = (tf.equal(winner_index,k), (lambda kk: lambda: f(kk))(k))   

    Case_List.append(Case)


Execution_List = tf.case(Case_List, lambda: f(0))

谢谢你的回答!这对我有帮助。