Ich arbeite an der Udacity Deep Learning-Klasse und ich arbeite an der ersten Aufgabe, Problem 5, wo Sie versuchen, die Anzahl der Duplikate in, sagen wir, Ihre Testgruppe zu zählen und Trainingssatz. (Oder Validierung und Training, etc.)Udacity Deep Learning: Aufgabe 1, Teil 5
Ich habe die Antworten anderer Leute angeschaut, aber ich bin nicht mit ihnen aus verschiedenen Gründen zufrieden. Zum Beispiel habe ich jemandes Hash-basierte Lösung ausprobiert. Aber ich fühlte, dass die zurückgegebenen Ergebnisse nicht korrekt sein würden.
Also die Hauptidee ist, dass Sie eine Reihe von Bildern haben, die als Arrays formatiert sind. I.e. Sie versuchen, zwei dreidimensionale Arrays auf Index 0 zu vergleichen. Ein Array ist das Trainings-Dataset, das aus 200000 Zeilen besteht, wobei jede Zeile ein 2D-Array enthält, bei dem es sich um die Werte für das Bild handelt. Der andere ist der Testsatz mit 10000 Zeilen, wobei jede Zeile ein 2-D-Array eines Bildes enthält. Das Ziel besteht darin, alle Zeilen in der Testmenge zu finden, die eine Zeile im Trainingssatz (für jetzt ist eine genaue Übereinstimmung in Ordnung) übereinstimmen. Da jede "Zeile" selbst ein Bild ist (welches ein 2-d-Array ist), muss ich in der Lage sein, einen Vergleich beider Sätze als einen elementweisen Vergleich jeder Zeile zu machen, um diese Arbeit schnell zu machen.
arbeitete ich meine eigene ziemlich einfache Lösung wie diese auf:
# Find duplicates
# Loop through validation/test set and find ones that are identical matrices to something in the training data
def find_duplicates(compare_set, compare_labels, training_set, training_labels):
dup_count = 0
duplicates = []
for i in range(len(compare_set)):
if i > 100: continue
if i % 100 == 0:
print("i: ", i)
for j in range(len(training_set)):
if compare_labels[i] == training_labels[j]:
if np.array_equal(compare_set[i], training_set[j]):
duplicates.append((i,j))
dup_count += 1
return dup_count, duplicates
#print(len(valid_dataset))
print(len(train_dataset))
valid_dup_count, duplicates = find_duplicates(valid_dataset, valid_labels, train_dataset, train_labels)
print(valid_dup_count)
print(duplicates)
#test_dups = find_duplicates(test_dataset, train_dataset)
#print(test_dups)
Der Grund ist es „weiterhin“ nur nach 100 da ist, dass allein eine sehr lange Zeit in Anspruch nimmt. Wenn ich versuchen würde, alle 10.000 Zeilen des Validierungssatzes mit dem Trainingssatz zu vergleichen, würde es ewig dauern.
Ich mag meine Lösung im Prinzip, weil es mir erlaubt, nicht nur die Duplikate zu zählen, sondern eine Liste der Übereinstimmungen zu erhalten. (Etwas fehlt bei jeder anderen Lösung, die ich mir angesehen habe.) Dadurch kann ich manuell testen, ob ich die richtige Lösung gefunden habe.
Was ich wirklich brauche, ist eine viel schnellere Lösung (d. H. In Numpy eingebaut), Matrizen dieser Matrizen zu vergleichen. Ich habe mit 'Isin' und 'Wo' gespielt, aber ich habe nicht herausgefunden, wie ich diese verwenden kann, um die Ergebnisse zu erzielen, nach denen ich suche. Kann mir jemand in die richtige Richtung für eine schnellere Lösung zeigen?
Nicht sicher auf die Zeiten hier, aber vorausgesetzt, Ihre 'compare_set' und' trainings_set' sind von Form '(n_images, img_h, img_w)', dann anstelle einer doppelten 'for' Schleife, können Sie einfach über' für img in compare_set' und 'np.where (np.all (training_set == img, axis = (1, 2))' gibt dir die Indizes aller Übereinstimmungen in 'trainings_set'. –