为什么添加不可用的张量会改变tensorflow中RNN单元的结果?

为什么添加不可用的张量会改变tensorflow中RNN单元的结果?,tensorflow,deep-learning,recurrent-neural-network,Tensorflow,Deep Learning,Recurrent Neural Network,下面是可以重现问题的最简单代码: import numpy as np import random import tensorflow as tf tf.set_random_seed(12345) np.random.seed(12345) random.seed(12345) unusable1 = tf.constant(1e-3, tf.float32) unusable2 = tf.constant(1e-3, tf.float32) unusable3 = tf.constant

下面是可以重现问题的最简单代码:

import numpy as np
import random
import tensorflow as tf

tf.set_random_seed(12345)
np.random.seed(12345)
random.seed(12345)

unusable1 = tf.constant(1e-3, tf.float32)
unusable2 = tf.constant(1e-3, tf.float32)
unusable3 = tf.constant(1e-3, tf.float32)

X = tf.placeholder(tf.float32, shape=[2, 3])

cell = tf.contrib.rnn.BasicRNNCell(5)

changed_data = tf.reduce_sum(cell(X, state = tf.zeros((2, 5)))[0])

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    output = sess.run(changed_data, feed_dict={X: np.ones((2, 3))})
    print(output)   # = -1.46618
在我的机器上,上述代码的结果是
-1.46618

但是,如果我注释掉三个不可用的常量张量声明,结果将变成
1.76918

import numpy as np
import random
import tensorflow as tf

tf.set_random_seed(12345)
np.random.seed(12345)
random.seed(12345)

# unusable1 = tf.constant(1e-3, tf.float32)
# unusable2 = tf.constant(1e-3, tf.float32)
# unusable3 = tf.constant(1e-3, tf.float32)

X = tf.placeholder(tf.float32, shape=[2, 3])

cell = tf.contrib.rnn.BasicRNNCell(5)

changed_data = tf.reduce_sum(cell(X, state = tf.zeros((2, 5)))[0])

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    output = sess.run(changed_data, feed_dict={X: np.ones((2, 3))})
    print(output)   # = 1.76918
实际上,您可以随意添加/删除/修改常量张量声明,结果会有很大不同


问题是什么?

变量的初始值设定项得到不同的op级别种子,因为种子设定基于(1)图形级别种子,以及(2)op id(如果op级别种子未明确设置)(当前图形中先前创建的op的确定函数)。这可以防止在设置图形级种子时,每个变量都获得完全相同的初始化。有关实现,请参阅