Basado en el tutorial de redes neuronales de gráficos de biblioteca DGL (1) -operaciones de mapeo básicas

Recientemente entré en contacto con redes neuronales de gráficos y creo que este dispositivo puede proporcionar una perspectiva multigranular. Después de abstraer el objeto de investigación, puede clasificar los nodos, los bordes y el gráfico como un todo. La estructura de la red neuronal gráfica proporciona una capacidad de granularidad múltiple para describir objetos específicos. Es bastante bueno pensar en ello.

Entonces hago un gráfico de red neuronal.
En la actualidad, las rutas de aprendizaje teórico de la red neuronal gráfica son:

  1. Conocimientos básicos de teoría de grafos. Esto es muy familiar, por lo que no es necesario aprenderlo.
  2. Álgebra lineal, especialmente la forma matricial de la transformada de Fourier. Vuelve atrás y lee el libro. Leí la base teórica de la red convolucional de grafos, que en realidad es la aplicación de la forma matricial de la transformada de Fourier. Esto ya es muy común en la clase de análisis matricial y no es un punto de conocimiento nuevo. . Pero si desea ponerse en contacto con la red neuronal gráfica, ¡esta parte debe dominarse con cuidado!
  3. Conocimientos relacionados con las redes neuronales.

Probablemente he pasado por "Explicación profunda y simple de la red neuronal", y se siente similar, pero sigue siendo práctico. Así que escribe sobre aspectos prácticos.

Biblioteca de redes neuronales de Graph

La biblioteca que uso es DGL: https://docs.dgl.ai/index.html
dirección github: https://github.com/dmlc/dgl
Esta biblioteca parece estar escrita por la Universidad de Nueva York. Implementa el modelo de red neuronal de gráfico común actual, que construye directamente la red como bloques de construcción y luego construye los datos.
Inserte la descripción de la imagen aquí

Instalar la biblioteca DGL

Sin instalación cuda:

pip3 install dgl -i https://mirrors.aliyun.com/pypi/simple/

instalación cuda10:

python3 -m pip install dgl-cu100 -i https://mirrors.aliyun.com/pypi/simple/

DGL usa pytorch como la biblioteca de red neuronal subyacente de forma predeterminada

Tutoriales

Agregue nodos, agregue bordes y visualice gráficos

Los bordes en DGL son todos bordes dirigidos. Para los bordes no dirigidos, se pueden crear dos bordes opuestos al mismo tiempo.

__author__ = 'dk'
#构建图,添加节点和边
import networkx as nx
import  dgl
import matplotlib.pyplot as plt
#构建星型图
u=[0,0,0,0,0]
v=[1,2,3,4,5]
#第一种方式,u和v的数组,他们是相同的长度
star1 = dgl.DGLGraph((u,v))
nx.draw(star1.to_networkx(),with_labels=True)#可视化图
plt.show()

star2 = dgl.DGLGraph((0,v))
#对于星型,是可以广播的
nx.draw(star2.to_networkx(),with_labels=True)
plt.show()

star3= dgl.DGLGraph([(0,1),(0,2),(0,3),(0,4),(0,5)])
#直接枚举
nx.draw(star3.to_networkx(),with_labels=True)
plt.show()

También puede agregar bordes más tarde, en lugar de agregar bordes en el constructor:

#也可以边构图,边加边,而不是在构造函数里面加边
g = dgl.DGLGraph()#这是一张空白图
g.add_nodes(9)#添加节点,注意一定要先加节点,后加边
for i in range(1,8):
    g.add_edge(0,i)
nx.draw(g.to_networkx(),with_labels=True)
plt.show()

¡Nota! Al agregar bordes (u, v), u y v no pueden exceder el ID de nodo máximo que ya tiene la red (el número de nodos menos 1). Para los nodos redundantes sin discrepancia, DGL los considera aislados.
Por ejemplo, la imagen de arriba: el nodo 8 está conectado sin cambios.
Inserte la descripción de la imagen aquí

Asignación y extracción de características de nodo

Después de crear el gráfico, puede agregar características a los nodos.
En DGL, las características de los nodos se tratan como un diccionario. El usuario puede tomar un key_name que tiene un significado característico para la característica del nodo, y el usuario también puede definir múltiples características para un nodo al mismo tiempo.
Por ejemplo, el modelo de estrella de arriba:

import numpy as np
features = np.random.normal(0,1,(9,5)) #随机生成一个9x5的正态分布矩阵
print(features)
g.ndata['features'] = features

Producción:

[[-0.73241917  0.78738566  1.21160063 -0.83944648 -0.15739715]
 [-0.05520377  0.83418124 -0.68477259 -1.29054549 -1.2375015 ]
 [-0.23807425 -0.40030208  1.74318389 -0.70699831 -0.61449034]
 [-0.48597221  0.65284435 -0.27101916 -0.69242791 -0.83134013]
 [-0.00580359  1.29773141  1.28545031 -0.41703836  0.97254182]
 [-1.19173936  1.18409306 -0.24284504 -1.93560515 -1.1080128 ]
 [-0.4854841   0.06257814 -1.3432515  -0.53297016 -0.01270537]
 [-0.16906863  0.17349874  1.0057332   1.85554737  0.13355367]
 [-1.45619866  0.77784642  1.52454762 -0.86608947  0.28595569]]

El atributo ndata es la abreviatura de node-data. Es un dict.
Tenga en cuenta que el número de filas de entidades debe ser el mismo que el número de nodos que posee actualmente el gráfico.
De lo contrario, se informará un error:

dgl._ffi.base.DGLError: Expect number of features to match number of nodes (len(u)). Got 7 and 9 instead.

Acceder a la función del nodo:
directamente g.ndata [nombre de la función] [ID del nodo] puede:
Por ejemplo: acceder a la función del nodo 3

print(g.ndata['features'][3])

Resultado: la tercera fila de la matriz de características

tensor([-0.4860,  0.6528, -0.2710, -0.6924, -0.8313], dtype=torch.float64)

Por supuesto, puede modificar las características de un nodo:

g.ndata['features'][3]=th.zeros(1,5)
print(g.ndata['features'][3])

Producción:

tensor([0., 0., 0., 0., 0.], dtype=torch.float64)

Se puede ver que DGL usa un tensor internamente para almacenar características de los nodos. Se implementa finalmente la modificación y acceso de las características del nodo a la modificación y acceso a esta matriz.

print(g.ndata)

Producción:

{
    
    'features': tensor([[-0.4771,  1.7900, -1.1160,  0.2916, -0.7986],
        [-1.6190, -0.5006, -0.0437,  1.6412, -1.6979],
        [ 1.8872,  0.5236,  0.5123, -0.7658, -0.5050],
        [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
        [-0.3382, -0.4218,  0.8622,  1.1720,  0.3460],
        [-0.1710,  0.2713, -0.1639, -1.1159, -0.3623],
        [-0.9241,  1.2943,  0.1137,  1.5348,  0.1791],
        [-1.0372,  1.4145, -2.0653, -0.1469, -0.6041],
        [ 0.1035, -1.4215,  0.3288, -0.5195, -1.4120]], dtype=torch.float64)}

Asignación, acceso y modificación de características de borde

Como características de nodos, bordes también pueden especificar características y acceder y modificar características.
Asignación:

g.edata['w']=th.randn(len(g.edges),2)

Tenga en cuenta que la función de fila de la matriz de asignación debe ser igual al número
de bordes para acceder a las características de un cierto borde y, en última instancia, debe implementarse para acceder a una determinada fila en la matriz de bordes. Y qué línea es la ID del borde.
Por lo tanto, debemos determinar cuál es el ID del borde que estamos visitando.
Por ejemplo: Obtenga el ID del borde (0,7):

g.edge_id(0,7)

Acceda a las funciones de este borde:

g.edata(g.edge_id(0,7))

Luego, también puede eliminar características: esto es en realidad una operación de diccionario

g.ndata.pop('features')
g.edata.pop('w')

Supongo que te gusta

Origin blog.csdn.net/jmh1996/article/details/106881394
Recomendado
Clasificación