我正在使用 Theano/NumPy 做一些深度学习的事情。我发现了一个非常烦人的问题。我得到了一个权重矩阵 A(假设为 50*2048)和一个特征向量 b(2048 dim)。
A使用
初始化self.alpha = np.random.random((50, 2048)).astype(np.float32) * 2 - 1.0
b 是来自 theano 的 2048 dim numpy.ndarrary。
问题是
X = numpy.dot(A, b)
Y = [numpy.dot(A[i], b) for i in xrange(50)]
X 和 Y 的某些行并不严格相等。我比较了它们,发现区别在于 1e-6 到 1e-7。
目前我更喜欢使用第二个来计算点积,因为它似乎可以学习更好的权重。但是第一个要快得多。所以我想知道为什么会有这么大的差异。是dot(matrix, vector)和dot(vector, vector)的实现方式不同造成的吗?非常感谢!
--编辑 正如呃提到的,这是您可以重现它的代码。
import numpy as np
test_time = 1000
vector_size = 100
matrix_size = (100, 100)
for i in xrange(test_time):
a = np.random.random(matrix_size).astype(np.float32) * 2 - 1.0
b = np.random.random(vector_size).astype(np.float32)
x = np.dot(a, b)
y = [np.dot(a[i], b) for i in xrange(a.shape[0])]
for k in xrange(len(y)):
epsilon = x[k] - y[k]
if abs(epsilon) > 1e-7:
print('Diff: {0}\t{1}\t{2}'.format(x[k], y[k], epsilon))
最佳答案
嗯,通常需要在性能和精度之间进行权衡。您可能需要补偿一个或另一个。尽管我个人不认为 0.0000001 的差异在大多数应用程序中有什么大不了的。如果您寻求更高的精度,您最好使用 float64
,但请注意 float64
操作在 GPU 上非常慢,尤其是 NVIDIA 9xx 系列 GPU。
我可能注意到提到的问题似乎也取决于您的硬件设置,因为我在我的机器上没有遇到这样的问题。
您也可以使用 np.allclose(x, y)
来查看差异是否明显。
关于python - 做点积时的 NumPy 精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503471/