2017-02-06 44 views
3

我有n(例如:n = 3)范围和x(例如:x = 4)每个范围中定义的变量号。 的范围是:tf.get_collection提取一个范围的变量

model/generator_0 
model/generator_1 
model/generator_2 

一旦我计算的损失,我想提取,并提供一切仅从范围的一个基于在运行时一个标准的变量。因此范围idx,我选择的指数浇铸成INT32

<tf.Tensor 'model/Cast:0' shape=() dtype=int32> 

的argmin张我已经尝试:

train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, 'model/generator_'+tf.cast(idx, tf.string)) 

这显然没有奏效。 有没有办法让所有属于该特定范围的变量都使用idx传入优化器。

在此先感谢!

维涅什斯里尼瓦桑

回答

3

你可以做这样的事情在TF 1.0 RC1或更高版本:

v = tf.Variable(tf.ones(())) 
loss = tf.identity(v) 
with tf.variable_scope('adamoptim') as vs: 
    optim = tf.train.AdamOptimizer(learning_rate=0.1).minimize(loss) 
optim_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope=vs.name) 
print([v.name for v in optim_vars]) #=> prints lists of vars created 
+0

不幸的是,optim_vars包含所有范围的所有变量。我的问题是,我有 〜 与tf.variable_scope( 'generator_0'): V1 = tf.Variable(tf.ones(())) loss1 = tf.identity(V1) 与tf.variable_scope( 'generator_1'): v2 = tf.Variable(tf.ones(())) loss2 = tf.identity(v2) 〜 然后我想找到tf.minimum(loss,loss2)并传递变量属于优化者的损失。 – viggie

+0

我刚刚在最新版本(夜间)中测试过,'optim_vars'只包含来自'adapoptim'范围的变量 –

+0

您正在使用我之前不知道的定义的相同损耗。我必须找到'min_idx = tf.cast(tf.argmin(tf.stack([loss1,loss2]),0),tf.int32)',然后传递这个'loss = tf.stack([loss1,loss2 ])[min_idx]'到优化器。这就是为什么我得到所有使用你的建议定义的变量。 – viggie