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))
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
Ich kann das Problem mit jeder Array-Größe replizieren ... – Julien
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