Python Tensorflow卷积vs.Tensorflow乘法和和vs.Numpy乘法和和

Python Tensorflow卷积vs.Tensorflow乘法和和vs.Numpy乘法和和,python,numpy,tensorflow,conv-neural-network,convolution,Python,Numpy,Tensorflow,Conv Neural Network,Convolution,在执行点积的单个步骤时,我遇到了不同的结果(在第16个最低有效位),在TF和numpy中实现方式不同 输入是float32 5x5映像和5x5内核 i = tf.constant(I2D, dtype=tf.float32, name='i') k = tf.constant(K2D, dtype=tf.float32, name='k') 场景1:张量流卷积 tf_convolution = tf.nn.convolution(input=i4d, filter=k4d, paddi

在执行点积的单个步骤时,我遇到了不同的结果(在第16个最低有效位),在TF和numpy中实现方式不同

输入是float32 5x5映像和5x5内核

i = tf.constant(I2D, dtype=tf.float32, name='i')    
k = tf.constant(K2D, dtype=tf.float32, name='k')
场景1:张量流卷积

tf_convolution = tf.nn.convolution(input=i4d, filter=k4d, padding="VALID")
场景2:Tensorflow乘法和求和

tf_multiply = tf.multiply(i, k)
tf_dot = tf.reduce_sum(tf_multiply)
np_multiply = np.multiply(I2D, K2D)
np_dot = np.sum(np_multiply)
场景3:Numpy乘法和求和

tf_multiply = tf.multiply(i, k)
tf_dot = tf.reduce_sum(tf_multiply)
np_multiply = np.multiply(I2D, K2D)
np_dot = np.sum(np_multiply)
场景2和场景3中元素相乘的结果相同,但求和后结果不同。 无论是使用tensorflow还是tensorflow gpu执行,结果都保持不变

我想更好地理解它是如何做到这一点的,计算结果的格式类型是什么(输入总是float32,因为numpy输出也是float32),以及是否有办法实现结果的一致性

提前感谢您的帮助

编辑:

实际人数:

I2D = np.array([[ 0.218994140625,  0.30615234375,   0.43115234375,     0.46923828125,   0.515869140625],
              [0.2880859375,    0.306640625 ,    0.361572265625,  0.430419921875,  0.408203125],
              [0.380615234375 , 0.318359375,     0.278076171875,  0.325927734375,   0.306640625],
              [0.319580078125,  0.30859375,      0.306640625,     0.28857421875,   0.29345703125],
              [0.28125,        0.319580078125 , 0.3515625 ,      0.3486328125,   0.3349609375]])


K2D = np.array([[0.0890502929687500,  0.0557556152343750, -0.0900573730468750,  0.0840759277343750,  0.1080932617187500],
            [0.0617370605468750, -0.0567016601562500,  0.0847473144531250,  0.0191040039062500, -0.0368041992187500],
            [0.1333923339843750, -0.0764160156250000,  0.1204223632812500, -0.1223754882812500, -0.0852966308593750],
            [0.1645507812500000, -0.0398864746093750, -0.0663452148437500,  0.0543823242187500,  0.1416015625000000],
            [-0.1589050292968750, -0.1628723144531250, -0.1723327636718750, -0.1340332031250000, 0.0513305664062500]
])
结果:

TF convolution = 0.001403801143169403076171875
TF multiplication + add = 0.00140382
numpy = 0.00140381604433

我相信这些numpy数组
I2D
K2D
的默认
dtype
np.float64
,因此所有操作都是64位的。但你把它和32位操作做比较,结果是tensorflow

我更改了
dtype=tf.float64
,得到了相同的结果,直到最后一位:

i = tf.constant(I2D, dtype=tf.float64, name='i')
k = tf.constant(K2D, dtype=tf.float64, name='k')
。。。结果值为:

0.00140381604433  # tensorflow
0.00140381604433  # numpy

我在2和3中得到了相同的结果。张贴一个例子,当他们是不同的数字和结果被添加。嗯。。。我得到了
0.00140382
。下一点事实上是不同的。您是在CPU上计算TF吗?现在,结果没有偏差,因此开始部分0.0014038对于所有场景都是相同的,但之后会出现差异。我尝试了CPU和GPU,结果保持不变。好的,很好,如果在开始时为numpy数组设置了dtype='float32',场景2和场景3也可以获得相同的结果。现在最大的问题仍然存在——TF卷积内部发生了什么?TF卷积不接受float64输入,因此我可以将所有内容切换到32,但它仍然不同:(