代码之家  ›  专栏  ›  技术社区  ›  Marvis Lu

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

  •  1
  • Marvis Lu  · 技术社区  · 7 年前

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

    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
    

    实际上,您可以随意添加/删除/修改常数张量声明,结果会有很大不同!

    有什么问题?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Allen Lavoie    7 年前

    变量的初始值设定项获得不同的操作级种子,因为种子设定基于(1)图级种子,以及(2)如果未显式设置操作级种子,则基于操作id(当前图中先前创建的操作的确定函数)。当设置了图级种子时,这会防止每个变量获得完全相同的初始化。看见 get_seed 用于实施。