python - 做点积时的 NumPy 精度

标签 python numpy machine-learning precision theano

我正在使用 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/

相关文章:

python - 我的 PyTorch 转发函数可以执行其他操作吗?

python - 将数组与其差异对齐

python - 如何监控可变对象的变化?

python - 从 A 列中获取列名,然后将该列的值保存在新的 C 列中

python - 通过 scipy.io.loadmat 将 matlab 3D 矩阵传输到 python 3D 数组会出错

matlab - 在numpy中获取线性化索引

python - numpy 特征值的精度

machine-learning - 二进制分类: what if the class I care most is only small portion of the data?

r - 如何调整R中Bagging的参数?

python - 在 bash、R、python 或 NCL 中将 hdf5 转换为 netcdf4?