본문 바로가기

DL & ML/Graph

[DGL] heterogeneous graph를 homogeneous graph로 변환할 때 edata, ndata 함께 전달하기

728x90
반응형

heterogeneous graph를 homogeneous graph의 형태로 변환하는 과정에서 edata를 함께 전달해야하는 상황이었다!

우선 hetero -> homo의 경우 dgl에서 to_homogeneous 라는 라이브러리를 제공한다.

 

 

dgl.to_homogeneous — DGL 0.9 documentation

ndata (list[str], optional) – The node features to combine across all node types. For each feature feat in ndata, it concatenates G.nodes[T].data[feat] across all node types T. As a result, the feature feat of all node types should have the same shape an

docs.dgl.ai

 

문서를 읽어보면 ndata와 edata의 인자에 변형 시 같이 보내고 싶은 데이터를 추가해서 전달할 수 있다고 되어있다.

 

또한 아래 문서에 자세한 예시가 함께 있어서 우선 예시를 따라해보았다.

 

 

 

1.5 Heterogeneous Graphs — DGL 0.9 documentation

When multiple node/edge types are introduced, users need to specify the particular node/edge type when invoking a DGLGraph API for type-specific information. In addition, nodes/edges of different types have separate IDs. To set/get features for a specific

docs.dgl.ai

 

그러나 예시에서 ndata는 전달이 되는데 edata는 전달이 되지않는 문제가 발생했다.

 

우선 edata나 ndata를 전달하기 위해서는 해당하는 데이터 타입의 shape이 동일해야 한다.

(문서의 예시는 전달이 되지 않는다는 것을 보여주는 예시)

 

>>> g = dgl.heterograph({
...    ('drug', 'interacts', 'drug'): (th.tensor([0, 1]), th.tensor([1, 2])),
...    ('drug', 'treats', 'disease'): (th.tensor([1]), th.tensor([2]))})
>>> g.nodes['drug'].data['hv'] = th.zeros(3, 1)
>>> g.nodes['disease'].data['hv'] = th.ones(3, 1)
>>> g.edges['interacts'].data['he'] = th.zeros(2, 1)
>>> g.edges['treats'].data['he'] = th.zeros(1, 1) # 이 부분 변경

 

따라서 예시에서 해당하는 부분을 변경해주면 된다.

 

그러나 나는 처음에 해당하는 데이터 사이즈를 변경해주는게 아니라 그냥 삭제해버리고(;; 처음에는 homogeneous니까 edata가 하나만 있어야 하나 하고 댕청하게 생각했다ㅋㅋ)

to_homogeneous를 했더니 오류는 안나나 edata가 넘어가지 않는 현상이 발생했다.

 

>>> hg = dgl.to_homogeneous(g, edata=['he'])
>>> hg.edata
{'_ID': tensor([0, 1, 0]), '_TYPE': tensor([0, 0, 1])}

 

그래서 대체 왜 edata가 넘어가지 않는가에 대해 계속해서 고민해보고 시도해보고 하다가 알아버렸다..

hetero에서 homogeneous graph로 변환 시 데이터를 넘겨주고 싶으면 edata든, ndata든 모든 노드 / 엣지에 해당하는 데이터 값이 존재해야하기 때문이었다!!

이는 homogeneous graph에서는 heterogeneous graph와 달리 노드 타입과 엣지 타입이 한 종류이므로 모든 노드 / 엣지에 데이터 값이 존재해야하기 때문인 것으로 보인다!

728x90
반응형