繁体   English   中英

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

[英]Tensorflow convolution vs. Tensorflow multiplication and sum vs. Numpy multiplication and sum

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

输入是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

我相信,默认dtype为这些numpy的阵列I2DK2Dnp.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM