2016-02-03 2 views
2

Как преобразовать опорный тензорный тип в значение тензорного типа?Как разыменовать тензор типа _ref в TensorFlow?

Единственный способ, которым я нашел, - добавить ноль к тензору. Есть ли удобный способ?

Ниже assign является тензором ссылочного типа. Как избавиться от _ref?

import tensorflow as tf 

counter = tf.Variable(0, name="counter") 

zero = tf.constant(0) 
one = tf.constant(1) 

new_counter = tf.add(counter, one) 
assign = tf.assign(counter, new_counter) # dtype=int32_ref 
result = tf.add(assign, zero) # dtype=int32 
result2 = tf.convert_to_tensor(assign) # dtype=int32_ref 
# result3 = assign.value() # has no attribute value 

ответ

4

В общем, вы должны быть в состоянии использовать тензор tf.foo_ref -типа где-нибудь тензор tf.foo типа, как ожидается. Операторы TensorFlow будут неявно разыменовывать свои входные аргументы (если явно не ожидается опорный тензор, например, в tf.assign()).

Самый простой способ разыменования тензором является использование tf.identity() следующим образом:

counter = tf.Variable(0) 
assert counter.dtype == tf.int32_ref 

counter_val = tf.identity(counter) 
assert counter_val.dtype == tf.int32 

Обратите внимание, что это отвечает на ваш вопрос, но может иметь неожиданные семантику, потому что tf.identity()не копирует основной буфер. Поэтому counter и counter_val в приведенном выше примера один и тот же буфер, и модификация counter будет отражена в counter_val:

counter = tf.Variable(0) 
counter_val = tf.identity(counter) # Take alias before the `assign_add` happens. 
counter_update = counter.assign_add(1) 

with tf.control_dependencies([counter_update]): 
    # Force a copy after the `assign_add` happens. 
    result = counter_val + 0 

sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 

print sess.run(result) # ==> 1 (result has effect of `assign_add`) 
+0

Это выглядит как ожидается, так как ведут себя, как и любые другие в отношении tensorflow графа. Например, если бы добавить один вместо идентификатора, он все равно будет синхронизирован, поскольку хранится на графике, не так ли? – Dims

+0

Добавление значения в опорный тензор почти всегда приводит к копированию (например, 'counter_val + 0' в моем примере выше или' tf.add (assign, zero) 'в вашем вопросе). Это нарушает псевдонимы и, по крайней мере, по моему мнению, более интуитивная семантика. – mrry

Смежные вопросы