我在执行点积的单个步骤时遇到了不同的结果(在第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:Tensorflow卷积
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)
场景3:Numpy乘法和总和
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
答案 0 :(得分:0)
我认为这些numpy数组dtype
和I2D
的默认K2D
是np.float64
,因此所有操作都是64位。但是你将它与32位运算进行比较会导致张量流。
我已经更改了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