[DGL] ndata, edata, srcdata, dstdata란?

2023. 1. 9. 11:08GNN lab study/DGL

ndata : node  data(= node feature) | g.ndata : dictionary type

edata : edge data(= edge feature) | g.edata : dictionary type

 

src, dst 는 edge를 표현할 때 시작점 -> 도착점이므로

scrdata : 시작점

dstdata : 도착점

 

예를 들어 인스타그램 팔로우 그래프를 만든다고 가정해봅시다.

아래 예시는 사용자는 총 6명이고, 각각의 팔로우 여부를 의미합니다.

(*참고로 dgl에서 노드는 0번부터 연속적으로 생성이 됩니다. 중간에 비어있는 id도 노드가 생성이 됩니다.)

 

>>> src_ids = torch.tensor([0, 2, 3, 2, 1])
>>> dst_ids = torch.tensor([2, 3, 1, 5, 4])
>>> g = dgl.graph((src_ids, dst_ids))

이때 각 src, dst 배열에서 같은 index값을 뽑아낸다면 edge가 된다.

ex) src[i] -> dst[i] 는 edge가 존재. 즉 src[0] = 0 , dst[0] = 2 이므로  0번 node에서 2번 node로 도착하는 edge(=link) 존재

 

 

만약 각 사용자의 '나이'라는 data(=feature)을 그래프에 저장하고 싶다면?

이때 ndata를 사용해주면 됩니다. (ndata는 node data입니다!)

 

>>> g.ndata['age'] = torch.tensor([20, 30, 24, 26, 38, 14])

 

그러면 각각 노드 순서대로(0번부터) 나이라는 속성을 하나씩 가지게 됩니다!

 

이렇게 ndata로 설정한 속성은 update함수를 통해 변경할 수도, del 함수를 통해 삭제할 수도 있습니다!

>>> g.ndata.update({'age' : torch.tensor([1, 2, 3, 4, 5, 6])})

>>> del g.ndata['age']

 

 

그렇다면 edge에 data(=feature)을 추가하고 싶다면?

바로 edata를 사용해주면 됩니다! (edge data)

 

만약에 인스타그램 데이터를 단순히 팔로우 여부가 아니라 "친밀도"여부로 표현한다면 같은 edge라도 친밀도라는 가중치 값이 생기게 될 것 입니다.

 

>>> g.edata['weight'] = torch.tensor([0.5, 0.8, 0.47, 0.12, 0.55])

 

간단한 예시로 이해는 아래 사이트 참조

참조 : https://think-tech.tistory.com/51

'GNN lab study > DGL' 카테고리의 다른 글

[DGL] DGL이란?  (0) 2023.01.09