当张量流在图模式下运行时,矩阵乘法值会变化
张量流中急切和不急切的代码流是不同的。但是这些值必须理想地匹配,而不是。
急切执行:
import tensorflow as tf
from tensorflow.python.ops import gen_math_ops
import numpy as np
tf.enable_eager_execution()
dZ = np.array([[ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, -0.9, 0.1, 0.1, 0.1]])
FC_W = np.array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
import pdb
pdb.set_trace()
a = gen_math_ops.mat_mul(dZ, FC_W, False, True)
print(a)
急切执行的输出:[[-2.77555756e-17 -2.77555756e-17 -2.77555756e-17]
图形执行:
import tensorflow as tf
from tensorflow.python.ops import gen_math_ops
import numpy as np
dZ = np.array([[ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, -0.9, 0.1, 0.1, 0.1]])
FC_W = np.array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
a = gen_math_ops.mat_mul(dZ, FC_W, False, True)
sess = tf.InteractiveSession()
print(str(sess.run(a)))
图形执行的输出:[[-5.55111512e-17 -5.55111512e-17 -5.55111512e-17]]
对于简单的矩阵乘法,两种模式之间的输出差异不是很大吗? (尽管它是e-17)
答案 0 :(得分:0)
产生的差异是由于计算精度以及操作的排序或分组不同所致。这会导致舍入效果。
我通过C#
程序复制了您的发现:
double[] a = new double[] { 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, -0.9, 0.1, 0.1, 0.1 };
double[] b = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
double sum = 0;
for (int i = 0; i < a.Length; i++)
{
sum += a[i] * b[i];
}
Console.WriteLine($"{sum}");
sum = (a[0]*b[0] + a[1]*b[1])
+ (a[2]*b[2] + a[3]*b[3])
+ (a[4]*b[4] + a[5]*b[5])
+ (a[6]*b[6] + a[7]*b[7])
+ (a[8]*b[8] + a[9]*b[9]);
Console.WriteLine($"{sum}");
// output:
// -2.77555756156289E-17
// 5.55111512312578E-17
顺便说一句:
Microsoft Excel365
会提供适当的零作为结果,而不会产生明显的舍入。