heterogeneous graph를 homogeneous graph의 형태로 변환하는 과정에서 edata를 함께 전달해야하는 상황이었다!
우선 hetero -> homo의 경우 dgl에서 to_homogeneous 라는 라이브러리를 제공한다.
문서를 읽어보면 ndata와 edata의 인자에 변형 시 같이 보내고 싶은 데이터를 추가해서 전달할 수 있다고 되어있다.
또한 아래 문서에 자세한 예시가 함께 있어서 우선 예시를 따라해보았다.
그러나 예시에서 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와 달리 노드 타입과 엣지 타입이 한 종류이므로 모든 노드 / 엣지에 데이터 값이 존재해야하기 때문인 것으로 보인다!
'DL & ML > Graph' 카테고리의 다른 글
[DGL] remove_edges로 그래프 내 특정 edge 제거하기 (0) | 2022.03.07 |
---|---|
[DGL] RelGraphConv에서 IndexError: index out of range in self 문제! (0) | 2022.03.07 |
[DGL] TypeError : default_collate 에러 (DGL.batch, collate_fn) (0) | 2022.03.03 |
[DGL] 기본 message passing layer 만들기 (0) | 2022.02.04 |
[DGL] local_scope란? (0) | 2022.02.04 |