我有两个命名范围用于CNN的单独子图(使用tf.variable_scope)。我可以将两个范围合并为一个,以便我的优化器仅更新两个范围中的变量吗?
答案 0 :(得分:10)
根据tf.Optmizer documentation,函数minimize
可以采用var_list(这些vars引用图中的学习变量权重)。所以使用它你只需要从图中获得一个变量列表(如[w1,b1]的简单MLP)。
如果您使用tf.variable_scope命名它们,则应该能够使用tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLESscope="my_scope_name")
,如tf.get_collection documentation中所述。如果要获取两个变量范围,则应该能够使用+
运算符获取组合列表,因为调用返回python列表。
所以,结合这两个想法,我相信你可以做到:
loss = ...
vars_to_minimize = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='var_scope_name_1') +
tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='var_scope_name_2')
minimize_op = tf.Optimizer().minimize(loss, var_list=vars_to_minimize)
注意:有关在get_collection调用中使用的可用密钥的详细信息,请参阅GraphKeys documentation。