0Pricing
Learn AI with Python · Урок

Классификация узлов с GNN

Набор данных Cora, двухслойная GCN, цикл обучения, маскированная функция потерь, точность на тесте, визуализация эмбеддингов

«Классификация узлов с GNN» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.

Задача классификации узлов

Классификация узлов предсказывает метку для каждого узла, используя его признаки и структуру графа. Классический пример: определить исследовательскую тему каждой статьи в сети цитирования, используя как слова статьи, так и список цитируемых ею статей.

Набор данных Cora

Cora — это MNIST для обучения на графах. Это граф цитирования, содержащий 2 708 научных статей по машинному обучению. Рёбра представляют цитирования; у каждой статьи есть вектор признаков «мешок слов» длины 1433. Цель — отнести каждую статью к одной из 7 тем.

# Cora:
#   nodes  = 2708 papers
#   edges  = citations
#   features per node = 1433
#   classes = 7

Загрузка через Planetoid

PyTorch Geometric поставляется с набором Cora через загрузчик Planetoid, который загружает данные и преобразует их в один объект графа.

from torch_geometric.datasets import Planetoid

dataset = Planetoid(root="data/Cora", name="Cora")
data = dataset[0]
print(data)  # x, edge_index, y, train_mask, test_mask

Объект данных

Объект графа содержит всё необходимое: data.x (признаки размером 2708 x 1433), data.edge_index (связность), data.y (истинные метки), а также логические маски, отмечающие узлы для обучения, проверки и тестирования.

GCN для 7 классов

Мы создаём GCN из двух слоёв, которая преобразует 1433 входных признака через скрытый слой размерности 64 в логиты 7 классов.

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv

class GCN(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = GCNConv(1433, 64)
        self.conv2 = GCNConv(64, 7)

    def forward(self, x, edge_index):
        x = F.relu(self.conv1(x, edge_index))
        x = F.dropout(x, training=self.training)
        return self.conv2(x, edge_index)

Трансдуктивное обучение

Cora — трансдуктивный набор данных: весь граф (включая узлы для тестирования и их признаки) доступен во время обучения; мы скрываем только метки тестовых узлов. Модель использует связи всех узлов, но обучается только на размеченных узлах для обучения.

Маска train_mask

Маска train_mask — это логический вектор, выбирающий узлы, которые участвуют в вычислении функции потерь. Мы запускаем модель на всём графе, но вычисляем перекрёстную энтропию только для узлов обучения, выбранных маской.

model = GCN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

def train():
    model.train()
    optimizer.zero_grad()
    out = model(data.x, data.edge_index)
    loss = F.cross_entropy(out[data.train_mask], data.y[data.train_mask])
    loss.backward()
    optimizer.step()
    return loss.item()

Интуитивное понимание функции потерь с маской

Хотя прямой проход выдаёт логиты для всех 2708 узлов, индексация с помощью train_mask ограничивает функцию потерь размеченными узлами обучения. Неразмеченные узлы по-прежнему передают сообщения и помогают модели, но напрямую не влияют на градиент.

Оценка с помощью test_mask

После обучения мы оцениваем точность на отложенных узлах test_mask, которых функция потерь никогда не затрагивала. Это измеряет способность обобщать на статьи, меток которых модель никогда не видела.

@torch.no_grad()
def test():
    model.eval()
    pred = model(data.x, data.edge_index).argmax(dim=1)
    correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
    return int(correct) / int(data.test_mask.sum())

Визуализация векторных представлений с помощью t-SNE

Чтобы увидеть, чему научилась GCN, возьмите векторные представления узлов со скрытого слоя и спроецируйте их в двумерное пространство с помощью t-SNE. Хорошо обученная GCN создаёт кластеры, в которых узлы одного класса объединяются.

from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

emb = model.conv1(data.x, data.edge_index).detach().numpy()
z = TSNE(n_components=2).fit_transform(emb)
plt.scatter(z[:, 0], z[:, 1], c=data.y, cmap="tab10", s=8)

Интерпретация графика t-SNE

Хорошо разделённые цветные кластеры означают, что векторные представления позволяют различать классы, — это признак того, что GCN выучила полезную структуру. Перекрывающиеся области указывают на недостаточное обучение или чрезмерное сглаживание. t-SNE — это качественная проверка, а не метрика.

Быстрая проверка

Проверьте свои знания о классификации узлов.

Итоги

Вы изучили классификацию узлов с помощью GNN:

  • Planetoid загружает граф цитирования Cora
  • GCN из двух слоёв преобразует 1433 в 64, а затем в 7 классов
  • train_mask ограничивает функцию потерь, а test_mask измеряет способность модели обобщать
  • t-SNE визуализирует векторные представления узлов, чтобы оценить разделение классов

Часто задаваемые вопросы

Урок «Классификация узлов с GNN» бесплатный?

Да — полный текст урока «Классификация узлов с GNN» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.

Чему я научусь в уроке «Классификация узлов с GNN»?

Набор данных Cora, двухслойная GCN, цикл обучения, маскированная функция потерь, точность на тесте, визуализация эмбеддингов Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn AI with Python?

Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Классификация узлов с GNN»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn AI with Python?

Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Теория графов для машинного обучения
  2. Графовые сверточные сети (GCN)
  3. Классификация узлов с GNN
  4. Предсказание связей и классификация графов
← Назад к Learn AI with Python