Python Tensorflow:tf.case具有参数化可调用性,案例列表在for循环中定义
我试图在训练循环中为一组自动编码器实现一个case分支:根据特定的条件,只需要更新一个特定的自动编码器。我一直试图通过使用tf.case()实现这一点,但它并没有像我预期的那样工作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,
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))
谢谢你的回答!这对我有帮助。