Tensorflow卷积与Tensorflow乘法和和Numpy乘法和和

时间:2018-01-26 15:38:19

标签: 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: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

1 个答案:

答案 0 :(得分:0)

我认为这些numpy数组dtypeI2D的默认K2Dnp.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