Python Tensorflow卷积vs.Tensorflow乘法和和vs.Numpy乘法和和
在执行点积的单个步骤时,我遇到了不同的结果(在第16个最低有效位),在TF和numpy中实现方式不同 输入是float32 5x5映像和5x5内核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
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,但它仍然不同:(