2015-12-29 3 views
5

Я использую 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)) 
+0

Можете ли вы дублировать проблему с меньшим массивом чисел, который вы можете включить в свой вопрос? См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Иногда, изолируя явление, вы можете сами найти проблему в этом процессе. – uhoh

+0

Я могу реплицировать проблему с любым размером массива ... – Julien

+0

Почему есть разница, я не знаю. Почему он настолько велик, что вы используете float32. Оставьте его float64 (я знаю, что он несовместим с использованием графического процессора Anano), и разница падает до e-14/-15. – Julien

ответ

2

Ну, как правило, существует компромисс между производительностью и точностью. Возможно, вам придется компенсировать одну или за другую. Хотя я лично не считаю, что разница в 0,0000001 является большой проблемой в большинстве приложений. Если вы ищете более высокую точность, вам лучше пойти с float64, но обратите внимание, что операции с float64 чрезвычайно медленны на графических процессорах, особенно на графических процессорах NVIDIA 9xx.

Я могу заметить, что упомянутая проблема, похоже, зависит от ваших настроек оборудования, так что я не сталкиваюсь с такой проблемой на своей машине.

Вы также можете использовать np.allclose(x, y), чтобы узнать, существует ли разница.

Смежные вопросы