2015-12-29 6 views
5

Ich benutze Theano/NumPy tun einige tiefe Lernzeug. Ich habe ein sehr nerviges Problem gefunden. Ich habe eine Gewichtsmatrix A (angenommen 50 * 2048) und einen Merkmalsvektor b (2048 dim).NumPy Präzision, wenn Sie dot Produkt

A initialisiert

self.alpha = np.random.random((50, 2048)).astype(np.float32) * 2 - 1.0 

b verwendet, ist ein 2048 dim numpy.ndarrary von Theanos.

Das Problem ist

X = numpy.dot(A, b) 
Y = [numpy.dot(A[i], b) for i in xrange(50)] 

Einige Reihen von X und Y sind nicht genau gleich. Ich habe sie verglichen und festgestellt, dass der Unterschied zwischen 1e-6 und 1e-7 liegt.

Derzeit verwende ich lieber die zweite, um das Punktprodukt zu berechnen, da es scheint, dass es bessere Gewichte lernen kann. Aber das erste ist viel schneller. Ich frage mich, warum es so einen großen Unterschied gibt. Wird es durch verschiedene Implementierungen von Punkt (Matrix, Vektor) und Punkt (Vektor, Vektor) verursacht? Danke vielmals!

--edit Wie bereits erwähnt, ist dies der Code, den Sie reproduzieren können.

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

Können Sie das Problem mit einem kleineren Array von Zahlen duplizieren, die Sie in Ihre Frage aufnehmen können? Siehe [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). Manchmal, indem Sie das Phänomen isolieren, können Sie das Problem selbst finden. – uhoh

+0

Ich kann das Problem mit jeder Array-Größe replizieren ... – Julien

+0

Warum gibt es einen Unterschied, ich weiß es nicht. Warum ist es so groß, dass Sie float32 verwenden? Lass es float64 (ich weiß, es ist nicht kompatibel mit der Nano-GPU-Nutzung) und der Unterschied fällt auf e-14/-15. – Julien

Antwort

2

Nun, es gibt normalerweise einen Kompromiss zwischen Leistung und Präzision. Möglicherweise müssen Sie einen zugunsten oder den anderen kompensieren. Obwohl ich persönlich nicht glaube, dass ein Unterschied von 0,0000001 in den meisten Anwendungen eine große Sache ist. Wenn Sie höhere Genauigkeit suchen, gehen Sie besser mit float64, aber beachten Sie, dass float64 Operationen auf den GPUs extrem langsam sind, besonders NVIDIA 9xx Serie GPUs.

Ich kann beachten, dass das erwähnte Problem scheint auch auf Ihre Hardware-Einstellungen zu hängen, weil ich kein solches Problem auf meinem Computer begegnen.

Sie können auch np.allclose(x, y) verwenden, um festzustellen, ob der Unterschied spürbar ist.

Verwandte Themen