tenorflow Tf.cond, дающий неожиданный вывод - PullRequest
0 голосов
/ 31 октября 2018

Кажется, у меня неправильное понимание того, как работает tf.cond. В документации тензорного потока приведен следующий пример:

z = tf.multiply(a, b)
result = tf.cond(x < y, lambda: tf.add(x, z), lambda: tf.square(y))

Результат примера, если x<y равно True равно tf.add(x,z) иначе tf.square(y)

Следуя этому примеру, я пытаюсь создать небольшой пример с tf.cond, и результат не идет в русле, упомянутом в документации.

в моем примере deterministic_action = 4, random_action = 11, chose_random=False. stochastic_action должно быть 4, вместо этого 1. Откуда взято значение 1?

#!/usr/bin/env python3

import tensorflow as tf
import numpy as np

with tf.Graph().as_default():
    with tf.device('/cpu:0'):
        stochastic_ph = tf.placeholder(tf.bool, (), name="stochastic")
        eps = tf.get_variable("eps", (), initializer=tf.constant_initializer(0))
        with tf.variable_scope('test_cond') as sc:
            deterministic_action = tf.random_uniform([], minval=0, maxval=15, dtype=tf.int64, seed=0) # 4
            random_action = tf.random_uniform([], minval=0, maxval=15, dtype=tf.int64, seed=1) # 11
            chose_random = tf.random_uniform([], minval=0, maxval=1, dtype=tf.float32) < eps # False because eps = 0
            stochastic_action = tf.cond(chose_random, lambda: random_action, lambda: deterministic_action) # S_action should be 4 but it is 1
            #output_action = tf.cond(stochastic_ph, lambda: stochastic_action, lambda: deterministic_action)


    init = tf.global_variables_initializer()
    sess = tf.Session()
    sess.run(init, feed_dict={stochastic_ph: True})
    print ("s_ph = ", stochastic_ph)
    d_action = sess.run(deterministic_action)
    print ("det_action= ", d_action)
    r_action = sess.run(random_action)
    print ("rand_action= ", r_action)
    e = sess.run(eps)
    c_action = sess.run(chose_random)
    print ("chose_rand= ", c_action)
    s_action = sess.run(stochastic_action)
    print ("s_action= ", s_action)
    #output = sess.run(output_action)

вот вывод:

python random_vec.py
2018-10-31 09:46:15.028376: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
s_ph =  Tensor("stochastic:0", shape=(), dtype=bool, device=/device:CPU:0)
det_action=  4
rand_action=  11
chose_rand=  False
s_action=  1

1 Ответ

0 голосов
/ 31 октября 2018

Это потому, что вы снова оцениваете новый sess.run. Поскольку вы генерируете случайное число дляterministic_action, результатом оказывается следующее случайное число после 4, которое равно 1. Вот результат вашего кода, когда я извлекаю значение defineistic_action также на последнем шаге.

Модификация:

print ("s_ph = ", stochastic_ph)
d_action = sess.run(deterministic_action)
print ("det_action= ", d_action)
r_action = sess.run(random_action)
print ("rand_action= ", r_action)
e = sess.run(eps)
c_action = sess.run(chose_random)
print ("chose_rand= ", c_action)
s_action, d_action = sess.run([stochastic_action, deterministic_action])
print ("s_action= ", s_action)
print ("det_action= ", d_action)

Результат:

s_ph =  Tensor("stochastic:0", shape=(), dtype=bool, device=/device:CPU:0)
det_action=  4
rand_action=  11
chose_rand=  False
s_action=  1
det_action=  1

Теперь все, что вам нужно сделать, это запустить все в одном sess.run

d_action, r_action, e,  c_action, s_action = sess.run([deterministic_action, random_action, eps, chose_random, stochastic_action])
print ("det_action= ", d_action)
print ("rand_action= ", r_action)
print ("chose_rand= ", c_action)
print ("s_action= ", s_action)

Результат:

s_ph =  Tensor("stochastic:0", shape=(), dtype=bool, device=/device:CPU:0)
det_action=  4
rand_action=  11
chose_rand=  False
s_action=  4

Обновление:

Мне было непонятно, почему random_uniform генерирует разные значения при установке seed. Это потому, что код выполняется с тем же объектом сеанса, с которым он инициализировал переменные. Модифицируя код новым объектом сеанса, вот что происходит:

print ("s_ph = ", stochastic_ph)
d_action = sess.run(deterministic_action)
print ("det_action= ", d_action)
sess.close()
sess = tf.Session()
sess.run(init, feed_dict={stochastic_ph: True})
s_action = sess.run(stochastic_action)
print ("s_action= ", s_action)

Результат:

s_ph =  Tensor("stochastic:0", shape=(), dtype=bool, device=/device:CPU:0)
det_action=  4
s_action=  4
...