IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

66 wiersze
2.2KB

  1. from .layer import Layer
  2. import torch
  3. from typing import Union, \
  4. List
  5. from ..data import Data
  6. class InputLayer(Layer):
  7. def __init__(self, data: Data, output_dim: Union[int, List[int]]= None, **kwargs) -> None:
  8. output_dim = output_dim or \
  9. list(map(lambda a: a.count, data.node_types))
  10. if not isinstance(output_dim, list):
  11. output_dim = [output_dim,] * len(data.node_types)
  12. super().__init__(output_dim, is_sparse=False, **kwargs)
  13. self.data = data
  14. self.node_reps = None
  15. self.build()
  16. def build(self) -> None:
  17. self.node_reps = []
  18. for i, nt in enumerate(self.data.node_types):
  19. reps = torch.rand(nt.count, self.output_dim[i])
  20. reps = torch.nn.Parameter(reps)
  21. self.register_parameter('node_reps[%d]' % i, reps)
  22. self.node_reps.append(reps)
  23. def forward(self) -> List[torch.nn.Parameter]:
  24. return self.node_reps
  25. def __repr__(self) -> str:
  26. s = ''
  27. s += 'GNN input layer with output_dim: %s\n' % self.output_dim
  28. s += ' # of node types: %d\n' % len(self.data.node_types)
  29. for nt in self.data.node_types:
  30. s += ' - %s (%d)\n' % (nt.name, nt.count)
  31. return s.strip()
  32. class OneHotInputLayer(Layer):
  33. def __init__(self, data: Data, **kwargs) -> None:
  34. output_dim = [ a.count for a in data.node_types ]
  35. super().__init__(output_dim, is_sparse=True, **kwargs)
  36. self.data = data
  37. self.node_reps = None
  38. self.build()
  39. def build(self) -> None:
  40. self.node_reps = []
  41. for i, nt in enumerate(self.data.node_types):
  42. reps = torch.eye(nt.count).to_sparse()
  43. reps = torch.nn.Parameter(reps)
  44. self.register_parameter('node_reps[%d]' % i, reps)
  45. self.node_reps.append(reps)
  46. def forward(self) -> List[torch.nn.Parameter]:
  47. return self.node_reps
  48. def __repr__(self) -> str:
  49. s = ''
  50. s += 'One-hot GNN input layer\n'
  51. s += ' # of node types: %d\n' % len(self.data.node_types)
  52. for nt in self.data.node_types:
  53. s += ' - %s (%d)\n' % (nt.name, nt.count)
  54. return s.strip()