【问题标题】:Tensorflow: Tensordot reproducible resultsTensorflow:Tensordot 可重现的结果
【发布时间】:2019-09-29 04:57:06
【问题描述】:

我在 Tensorflow 中使用 tf.tensordot。但是,我遇到了一些困扰我的不一致之处。下面是一个可重现的例子:

tf.reset_default_graph()
tf.set_random_seed(42)
np.random.seed(42)
X = np.random.rand(150, 196, 268).astype(np.float32)
W = tf.Variable(initial_value=tf.random_normal([268, 22], stddev=0.1))
dotted_150 = tf.tensordot(X, W, axes=[[2], [0]])
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output_150 = sess.run(dotted_150)

这会返回一个尺寸为(150, 196, 22)的张量

tf.reset_default_graph()
tf.set_random_seed(42)
np.random.seed(42)
X = np.random.rand(1, 196, 268).astype(np.float32)
W = tf.Variable(initial_value=tf.random_normal([268, 22], stddev=0.1))
dotted_1 = tf.tensordot(X, W, axes=[[2], [0]])
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output_1 = sess.run(dotted_1)

这会返回一个尺寸为(1, 196, 22)的张量

现在,如果我们测试来自output_150 的第一个元素是否几乎等于来自output_1 的第一个也是唯一一个元素,结果是两个数组之间不匹配。

np.testing.assert_allclose(output_1[0], output_150[0])

另一方面,如果我们这样做:

np.random.seed(42)
input_150 = np.random.rand(150, 196, 268).astype(np.float32)
np.random.seed(42)
input_1 = np.random.rand(1, 196, 268).astype(np.float32)
np.testing.assert_equal(input_150[0], input_1[0])

我们看到输入完全相同。话虽如此,我希望tf.tensordot 的输出也相同,但事实并非如此。


在同一个注释中,这里是使用 tf.reshapetf.matmultf.tensordot 等效项:

tf.reset_default_graph()
tf.set_random_seed(42)
np.random.seed(42)
X = np.random.rand(150, 196, 268).astype(np.float32)
W = tf.Variable(initial_value=tf.random_normal([268, 22], stddev=0.1))
reshaped = tf.reshape(X, [-1, 268])
mulled_150 = tf.reshape(tf.matmul(reshaped, W), [-1, 196, 22])
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output_150 = sess.run(mulled_150)


tf.reset_default_graph()
tf.set_random_seed(42)
np.random.seed(42)
X = np.random.rand(1, 196, 268).astype(np.float32)
W = tf.Variable(initial_value=tf.random_normal([268, 22], stddev=0.1))
reshaped = tf.reshape(X, [-1, 268])
mulled_1 = tf.reshape(tf.matmul(reshaped, W), [-1, 196, 22])
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output_1 = sess.run(mulled_1)

np.testing.assert_allclose(output_1[0], output_150[0])

结果完全一样,输出数组不匹配。怎么可能?

【问题讨论】:

    标签: python numpy tensorflow testing tensordot


    【解决方案1】:

    显然,如果我使用tf.float64 精度而不是tf.float32,结果是相同的。

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2018-03-02
      • 2018-05-06
      • 2018-01-31
      • 2018-02-03
      • 1970-01-01
      • 2023-02-22
      • 2018-02-02
      • 2020-07-19
      相关资源
      最近更新 更多