Графический автоэнкодер с PyTorch-Geometric
Я создаю автоэнкодер на основе графа для облаков точек. Исходная форма облака точек
[3, 1024]
- 1024 точки, каждая из которых имеет 3 координаты
Облако точек превращается в неориентированный граф с помощью следующих шагов:
- точка превращается в узел.
- особенность узла - 3 координаты
- для каждой узловой точки найти 5 ближайших к ней узловых точек. они соединены ребром
- Особенностью ребра является расстояние между двумя узловыми точками, которые оно соединяет.
Я использую pytorch-geometric для построения своей сети и расстояния Chamfer от pytorch3d [источник ] в качестве функции потерь.
Архитектура моей сети следующая:
Кодер:GAT (3->16) -> GAT (16->24) -> GAT (24->36) -> форма ([32 * 1024, 36])
Декодер: GAT (36-> 24) -> GAT (24-> 16) -> GAT (16-> 3) -> форма ([32*1024, 3])
Все эти слои принимают функции узла и функции ребра. Кроме того, я использую Dropout и ReLU.
После этого я просто получаю исходные графики:[32, 1024, 3] и спрогнозированные графики:[32, 1024, 3] и скармливаю их для потери фаски из pytorch3d. Я получаю какой-то результат, но если я их визуализирую, то вижу, что сеть ничему не научилась.
Вопрос в следующем: поскольку я сравниваю только функции узлов с расстоянием фаски, использует ли сеть вообще матрицу смежности и функции ребер? Мне просто нужно сделать тонкую настройку или, может быть, эта модель не имеет никакого смысла?
PS: На данный момент меня не волнует архитектура или достаточно ли 5 ближайших соседей.