TL; DR: Wie kann ich bei einem großen Bilddatensatz (ca. 36 GiB Rohpixel) unbeschrifteter Daten die Bilder (basierend auf den Pixelwerten) gruppieren, ohne zunächst die Anzahl der Cluster K
zu kennen?
Ich arbeite derzeit an einem unbeaufsichtigten Lernprojekt, um Bilder zu gruppieren. Stellen Sie sich das als Clustering von MNIST mit 16 x 16 x 3 RGB-Pixelwerten vor, nur dass ich ungefähr 48 Millionen Beispiele habe, die ich zum Clustering benötige. Ohne ihre Identität zu kennen, weiß ich, dass einige der Bilder definitiv verwandt sind, weil sie aus derselben Quelle stammen, aber - sagen wir - ich kenne auch keine geeignete K
, um "nur" K-means am Set noch laufen zu lassen .
Ich dachte daran, eine manuelle 2D-Einbettung mit t-SNE durchzuführen und dann manuell im eingebetteten Bereich zu gruppieren (eine einfachere Aufgabe als manuell in 16x16x3
-d), aber alle t-SNE-Implementierungen, die ich finden konnte, erforderten das Laden der Daten in den Speicher. Ich habe auch darüber nachgedacht, zuerst t-SNE und dann K-means für die eingebetteten t-SNE-Daten auszuführen. Wenn Sie sich jedoch die Ergebnisse von t-SNE von MNIST ansehen, ist es sehr offensichtlich, dass diese Cluster möglicherweise verzerrt und verzerrt sind und wahrscheinlich werden auf nichtlineare Weise. Selbst wenn ich a kennen K
würde, würden die Cluster wahrscheinlich aufgeteilt werden. Die Verwendung von Mahalanobis-Entfernungen für K-Mittel mag eine interessante Sache sein, aber da ich zunächst keine Kovarianzen kenne, scheint dies auch eine Sackgasse zu sein.
Derzeit versuche ich, die PCA-Komprimierung für die Beispiele auszuführen, um zumindest etwas Speicher für t-SNE zurückzugewinnen, aber das könnte funktionieren oder nicht ... kann ich vorerst nicht sagen.
Kann mir jemand einen Zeiger in die richtige Richtung geben, um dies zu tun ( idealerweise , aber definitiv nicht erforderlich in einem Python-, TensorFlow- oder Apache Beam / Dataflow-Kontext)? Ich habe vor einiger Zeit daran gearbeitet, ein Streaming / Ball-K-Mittel zu portieren, das die nette Eigenschaft hat, neue Cluster "on demand" zu erstellen, aber bevor ich das wieder in Python / TensorFlow / Dataflow implementiere, hatte ich gehofft, dass es jemand könnte Gib mir einige Ideen, wo ich anfangen soll oder was ich vermeiden soll.