Я использую Theano/NumPy, используя некоторые глубокие учебные материалы. Я нашел очень неприятную проблему. Я получил матрицу весов A (предположим, что она 50 * 2048) и вектор-функция b (2048 dim).Точность NumPy при работе с точечным продуктом
А инициализирована с помощью
self.alpha = np.random.random((50, 2048)).astype(np.float32) * 2 - 1.0
б является тусклым 2048 numpy.ndarrary от Теано.
Проблема заключается в
X = numpy.dot(A, b)
Y = [numpy.dot(A[i], b) for i in xrange(50)]
Некоторые ряды X и Y не являются строго равными. Я сравнил их и обнаружил, что разница находится в 1е-6 до 1е-7.
В настоящее время я предпочитаю использовать второй, чтобы вычислить продукт-точка, так как кажется, что он может узнать больше веса. Но первое происходит намного быстрее. Поэтому мне интересно, почему существует такая большая разница. Является ли это причиной различных реализаций точки (матрица, вектор) и точки (вектор, вектор)? Большое спасибо!
--edit Как упоминалось выше, это код, который вы можете воспроизвести.
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))
Можете ли вы дублировать проблему с меньшим массивом чисел, который вы можете включить в свой вопрос? См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Иногда, изолируя явление, вы можете сами найти проблему в этом процессе. – uhoh
Я могу реплицировать проблему с любым размером массива ... – Julien
Почему есть разница, я не знаю. Почему он настолько велик, что вы используете float32. Оставьте его float64 (я знаю, что он несовместим с использованием графического процессора Anano), и разница падает до e-14/-15. – Julien