Je voudrais changer conditionnellement la portée des variables dans tensorflow.

Par exemple, si scope est une chaîne ou None:

if scope is None:

        a = tf.get_Variable(....)
        b = tf.get_Variable(....)
else:
    with tf.variable_scope(scope):

        a = tf.get_Variable(....)
        b = tf.get_Variable(....)

Mais je ne veux pas avoir à écrire la partie a= ..., b= ... en double. Je veux juste que le if ... else ... détermine la portée et fasse tout le reste de la même manière à partir de là.

Des idées sur la façon dont je pourrais faire ça?

0
patapouf_ai 17 janv. 2017 à 14:25

2 réponses

Meilleure réponse

Ce n'est pas spécifique à TensorFlow, mais plutôt une question générale du langage Python, juste FYI. Dans tous les cas, vous pouvez réaliser ce que vous voulez faire avec un gestionnaire de contexte wrapper comme suit:

class cond_scope(object):
  def __init__(self, condition, contextmanager):
    self.condition = condition
    self.contextmanager = contextmanager
  def __enter__(self):
    if self.condition:
      return self.contextmanager.__enter__()
  def __exit__(self, *args):
    if self.condition:
      return self.contextmanager.__exit__(*args)

with cond_scope(scope is not None, scope):
  a = tf.get_variable(....)
  b = tf.get_variable(....)

EDIT : correction du code.

1
keveman 17 janv. 2017 à 17:03

Merci à @keveman de m'avoir mis sur la bonne voie. Bien que je ne puisse pas faire fonctionner sa réponse, il m'a mis sur la bonne voie: ce dont j'avais besoin était une portée vide, donc les travaux suivants:

class empty_scope():
     def __init__(self):
         pass
     def __enter__(self):
         pass
     def __exit__(self, type, value, traceback):
         pass

def cond_scope(scope):
    return empty_scope() if scope is None else tf.variable_scope(scope)

Après quoi je peux faire:

with cond_scope(scope):

    a = tf.get_Variable(....)
    b = tf.get_Variable(....)

Pour plus d'informations sur with en python, consultez: Le Python "with" Statement by Example

2
patapouf_ai 17 janv. 2017 à 17:06