2017-01-17 2 views
0

Я хотел бы изменить переменную область условно в тензорном потоке.Tensorflow: условно добавить область переменной

Так, например, если scope является строкой или 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(....) 

Но я не хочу, чтобы написать a= ..., b= ... часть в два раза. Я просто хочу, чтобы if ... else ... определял область действия, а затем делал все остальное оттуда.

Любые идеи о том, как я мог это сделать?

ответ

1

Это не относится к TensorFlow, но более общий вопрос языка Python, просто FYI. В любом случае, вы можете добиться того, что вы хотите сделать с менеджером контекста обертку следующим образом:

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: Исправлен код.

+0

Спасибо! Это выглядит очень круто и элегантно ... но я не знаю, как применить его в моем контексте. Где идет 'tf.variable_scope'? –

+0

Кажется, что ваше решение может привести к 'with False:', который, похоже, не работает. –

+0

Я предполагаю, что вы имеете в виду, что я должен иметь '@contextmanager четкости cond_scope (масштаб): выход tf.variable_scope (сфера), если область действия еще false' , но это все равно приведет к' с Ложные: 'какой Doesnt Работа. –

1

Спасибо за @keveman за то, что вы меня на правильном пути. Хотя я не мог сделать его ответ работу он поставил меня на правильном пути: то, что мне было нужно, пустой объем, таким образом, следующие работы:

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) 

После чего я могу сделать:

with cond_scope(scope): 

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

Подробнее о with в python см .: The Python "with" Statement by Example

+0

Да, это тоже работает. – keveman