Auf der Suche nach verborgenen Bedeutungen. Graph neuronale Netze basierend auf Spektral / Sudo Null IT News

Die Entwicklung von Deep-Machine-Learning-Methoden hat dazu geführt, dass neuronale Netze in den Aufgaben der Mustererkennung, maschinellen Übersetzung, Bild- und Textgenerierung und vielen anderen immer beliebter werden. Seit 2009 wurden Versuche unternommen, neuronale Netze direkt in Graphverarbeitungsaufgaben (zu denen durch Links verknüpfte Webseitensysteme, Wörterbücher mit bestimmten Beziehungen zwischen Wörtern, ein Graph sozialer Verbindungen und andere gehören können) und unter den möglichen Aufgaben zu verwenden kann die Suche nach Clustern von Knoten, die Erstellung neuer Graphen basierend auf den verfügbaren Informationen über die Struktur des Graphen, die Erweiterung des Graphen und die Vorhersage neuer Verbindungen und andere bestimmen. Jetzt gibt es mehrere Arten von graphbasierten neuronalen Netzen – Faltungsgraphnetze (Convolutional Graph Network), Graphisomorphismusnetze (Graph Isomorphism Network) und viele andere, und sie werden häufig verwendet, um Artikelzitate zu analysieren, Text zu studieren (der einen Satz darstellt als ein Diagramm, das Arten von Beziehungen zwischen Wörtern anzeigt), das Studium zusammenhängender Strukturen (z. B. das Studium von Proteinmolekülen, insbesondere das Alphafold-Netzwerk verwendet das GNN-Modell) usw. In diesem Artikel werden wir einige allgemeine Probleme beim Erstellen und Trainieren von Graphnetzwerken auf der Grundlage der Python-Bibliothek betrachten. Spektral.

Innerhalb von Spektral wird Keras verwendet und die Topologie des neuronalen Netzwerks kann durch die Standard-Keras-Layer-Mechanismen festgelegt werden, aber zunächst wird eine große Anzahl vorkonfigurierter Modelle angeboten. In Spektral werden die Anfangsdaten für das Netzwerktraining als Instanzen von spektral.data.Graph-Objekten dargestellt, die durch 4 Attribute definiert sind:

  • a – Konnektivitätsmatrix (quadratisches np.array zum Definieren von Kanten, die Knoten oder Konnektivitätstabellen verbinden)

  • x – Knoteneigenschaften (np.array mit Liste der Eigenschaften)

  • e – Kanteneigenschaften (Konnektivitätstabelle, die die Anzahl der Knoten definiert, die die Kante bilden, und die Liste der Kanteneigenschaften)

  • y – Labels (eindimensionales oder zweidimensionales np.array zur Beschreibung von Knotenlabels oder globalen Labels. Im zweidimensionalen Fall ist der erste Index der Knotenidentifizierer, der zweite der Labelidentifizierer innerhalb des Knotens, falls vorhanden mehrere)

Die Knoten des Diagramms sind nummeriert und die Konnektivitätsmatrix ist ein zweidimensionales Array, das die Beziehung zwischen den Knoten angibt (einschließlich der Verbindung des Knotens mit sich selbst). Der Wert am Schnittpunkt definiert die Kanten-ID. Konnektivität kann auch als Tabelle mit drei Spalten dargestellt werden, die Knotennummern und Kanten-ID verknüpfen (Verbindungen können sowohl unidirektional als auch bidirektional sein, dann werden sie durch zwei Linien dargestellt). Dieses Format eignet sich eher für Diagramme mit einer relativ kleinen Anzahl von Verbindungen .

Das Diagramm kann sowohl manuell als auch mithilfe von Hilfsladern generiert werden, die Datensätze aus spektral.dataset.Dataset verwenden. Es gibt auch mehrere vorgefertigte Datensätze zur Artikelzitierung (spectral.datasets.citation package), reddit (spectral.datasets.graphsage.Reddit), eine Beschreibung der Struktur von QM9-Molekülen (spektral.datasets.qm9.QM9) und viele andere.

Für die Studie verwenden wir die Zitationsdatenbank Cora. Installieren Sie das Modul pip install spektral und bereiten Sie einen Datensatz für das weitere Netzwerktraining vor:

aus spektral.datasets import Cora-Datensatz = Cora()-Datensatz Cora(n_graphs=1)-Datensatz[0]
Diagramm (n_nodes=2708, n_node_features=1433, n_edge_features=Keine, n_labels=7)

Der resultierende Datensatz ist eine Sammlung von Diagrammen (in unserem Fall ein Diagramm), die aus 2708 Knoten besteht, 1433 Eigenschaften für jeden Knoten, 7 Beschriftungen, Eigenschaften für die Kanten sind nicht definiert. In realen Datensätzen kann eine große Anzahl von Graphen dargestellt werden (z. B. bei der Beschreibung der Struktur von Molekülen) und Filter / Map / Apply-Methoden können verwendet werden, um einzelne Graphen im Datensatz auszuwählen und zu modifizieren.

Im nächsten Schritt werden die Daten für die Übertragung an das neuronale Netz vorbereitet. Dazu verwenden wir Loader, die leicht unterschiedliche Ansichten der Daten erstellen:

  • SingleLoader wird verwendet, wenn wir nur ein Diagramm im Datensatz haben

  • DisjointLoader kombiniert mehrere Graphen zu einem großen und wandelt ihn in Eingabevektoren für ein neuronales Netzwerk um

  • BatchLoader erstellt einen Satz von Diagrammen zum Trainieren eines neuronalen Netzwerks (ähnlich wie ein Satz von Trainingsbeispielen in anderen Arten von Netzwerken dargestellt wird).

  • MixedLoader erstellt ein großes Diagramm, belässt aber Labels als unabhängige Eingabevektoren

aus spektral.data import SingleLoader loader = SingleLoader(dataset) loader.load()

Als nächstes erstellen wir direkt ein neuronales Netzwerk. Tatsächlich wird die Hauptaufgabe von den ersten Schichten des Netzwerks ausgeführt, und mehrere Optionen für Graphennetzwerke stehen uns im Paket spektral.layers zur Verfügung (z. B. GCNConv – Convolutional Layers for Graph Convolutional NetworkGraphSageConv für per Algorithmus gesammelte Daten GraphSage und andere können Sie mehr über die Unterschiede in den Topologien verschiedener Modelle von Graphennetzwerken lesen hier). Das Netzwerk wird auf die für Keras übliche Weise durch die Modellimplementierung erstellt:

class MyFirstGNN(Model): def __init__(self, n_hidden, n_labels): super().__init__() self.graph_conv = GCNConv(n_hidden) //das Netzwerk selbst self.pool = GlobalSumPool() //Zusammenfassung der Ergebnisse self. dropout = Dropout(0.5) //Überanpassung vermeiden self.dense = Dense(n_labels, ‘softmax’) //nach n_labels klassifizieren def call(self, inputs): out = self.graph_conv(inputs) out = self.dropout(out ) out = self.pool(out) out = self.dense(out) return out

Darüber hinaus unterscheidet sich die Arbeit mit dem Netzwerk nicht von anderen Keras-basierten Netzwerkimplementierungen:

  • Erstellen Sie eine Instanz des Modells

  • Wir erstellen das Modell mit Angabe von Verlustfunktion, Optimierer und Metrik

  • Wir trainieren das Modell mit den Eingabedaten (erhalten nach Verwendung des Loaders)

  • Bewertung der Modellgenauigkeit

  • Wir wenden das Modell an, um Knoten oder anderes zu klassifizieren, was durch die Netzwerktopologie bestimmt wird

model = MyFirstGnn() model.compile( optimizer=Adam(0.01), loss=CategoricalCrossentropy(reduction=”sum”), weighted_metrics=[“acc”]) def mask_to_weights(mask): return mask.astype(np.float32) / np.count_nonzero(mask) weights_tr, weights_va, weights_te = ( mask_to_weights(mask) for mask in (dataset.mask_tr, dataset.mask_va, dataset.mask_te ). =loader_va .load(), validation_steps=loader_va.steps_per_epoch, epochs=Epochen, Callbacks=[EarlyStopping(patience=patience, restore_best_weights=True)])

Die Verwendung von neuronalen Graphnetzen kann bei der Analyse miteinander verbundener Daten (mit möglicher Zuordnung von Knoten und Verknüpfungen zwischen ihnen) nützlich sein und verwendet werden, um neue Knoten (nach ihren Attributen oder Verknüpfungen) zu klassifizieren, mögliche Verknüpfungen vorherzusagen und Grafiken zu erstellen (z. B. neue Proteinmoleküle gemäß den erwarteten Eigenschaften erzeugen).

Beim Schreiben des Artikels wurden Materialien der Veröffentlichung verwendet Graph neuronale Netze in TensorFlow und Keras mit Spektral Daniele Grattarola und Cesare Alippihttps://arxiv.org/abs/2006.12138)

Am Vorabend des Kurses „Python for Analytics“ lade ich alle zu einer kostenlosen Lektion ein, in der wir anhand eines Beispiels die Möglichkeiten der Verwendung von RFM-Praktiken zur Kundensegmentierung in Python betrachten.

Similar Posts

Leave a Reply

Your email address will not be published.