def test_sgc_conv(): ctx = F.ctx() g = dgl.DGLGraph(sp.sparse.random(100, 100, density=0.1), readonly=True) # not cached sgc = nn.SGConv(5, 10, 3) feat = F.randn((100, 5)) sgc = sgc.to(ctx) h = sgc(g, feat) assert h.shape[-1] == 10 # cached sgc = nn.SGConv(5, 10, 3, True) sgc = sgc.to(ctx) h_0 = sgc(g, feat) h_1 = sgc(g, feat + 1) assert F.allclose(h_0, h_1) assert h_0.shape[-1] == 10
def test_sgc_conv(g, idtype): ctx = F.ctx() g = g.astype(idtype).to(ctx) # not cached sgc = nn.SGConv(5, 10, 3) feat = F.randn((g.number_of_nodes(), 5)) sgc = sgc.to(ctx) h = sgc(g, feat) assert h.shape[-1] == 10 # cached sgc = nn.SGConv(5, 10, 3, True) sgc = sgc.to(ctx) h_0 = sgc(g, feat) h_1 = sgc(g, feat + 1) assert F.allclose(h_0, h_1) assert h_0.shape[-1] == 10
def test_sgconv_e_weight(g, idtype): ctx = F.ctx() g = g.astype(idtype).to(ctx) sgconv = nn.SGConv(5, 5, 3) feat = F.randn((g.number_of_nodes(), 5)) eweight = F.ones((g.num_edges(), )) sgconv = sgconv.to(ctx) h = sgconv(g, feat, edge_weight=eweight) assert h.shape[-1] == 5
def test_sgc_conv(g, idtype, out_dim): ctx = F.ctx() g = g.astype(idtype).to(ctx) # not cached sgc = nn.SGConv(5, out_dim, 3) # test pickle th.save(sgc, tmp_buffer) feat = F.randn((g.number_of_nodes(), 5)) sgc = sgc.to(ctx) h = sgc(g, feat) assert h.shape[-1] == out_dim # cached sgc = nn.SGConv(5, out_dim, 3, True) sgc = sgc.to(ctx) h_0 = sgc(g, feat) h_1 = sgc(g, feat + 1) assert F.allclose(h_0, h_1) assert h_0.shape[-1] == out_dim
def __init__(self, in_dim, hidden_dim, n_classes, hidden_layers, ctype, hops, readout, activation_func, dropout, grid, device): super(Classifier, self).__init__() self.device = device self.readout = readout self.layers = nn.ModuleList() self.batch_norms = nn.ModuleList() self.grid = grid # input layer if ctype == 'tagconv': self.layers.append( conv.TAGConv(in_dim, hidden_dim, hops, activation=activation_func)) else: self.layers.append( conv.SGConv(in_dim, hidden_dim, hops, cached=False, norm=activation_func)) self.batch_norms.append(nn.BatchNorm1d(hidden_dim)) # hidden layers for k in range(0, hidden_layers): if ctype == 'tagconv': self.layers.append( conv.TAGConv(hidden_dim, hidden_dim, hops, activation=activation_func)) else: self.layers.append( conv.SGConv(hidden_dim, hidden_dim, hops, cached=False, norm=activation_func)) self.batch_norms.append(nn.BatchNorm1d(hidden_dim)) # dropout layer self.dropout = nn.Dropout(p=dropout) # last layer if self.readout == 'max': self.readout_fcn = conv.MaxPooling() elif self.readout == 'mean': self.readout_fcn = conv.AvgPooling() elif self.readout == 'sum': self.readout_fcn = conv.SumPooling() elif self.readout == 'gap': self.readout_fcn = conv.GlobalAttentionPooling( nn.Linear(hidden_dim, 1), nn.Linear(hidden_dim, hidden_dim * 2)) else: self.readout_fcn = SppPooling(hidden_dim, self.grid) if self.readout == 'spp': self.classify = nn.Sequential( nn.Dropout(), nn.Linear(hidden_dim * self.grid * self.grid, hidden_dim * 2), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(2 * hidden_dim, 2 * hidden_dim), nn.ReLU(inplace=True), nn.Linear(2 * hidden_dim, n_classes), ) else: var = hidden_dim if self.readout == 'gap': var *= 2 self.classify = nn.Linear(var, n_classes)
def __init__(self, in_dim, hidden_dim, n_classes, hidden_layers, ctype, hops, readout, activation_func, dropout, grid, K, norm, device): super(Classifier, self).__init__() self.device = device self.readout = readout self.layers = nn.ModuleList() self.n_layers = nn.ModuleList() self.grid = grid self.K = K self.hidden_dim = hidden_dim self.norm = norm self.mish = Mish() # input layer if ctype == 'tagconv': self.layers.append( conv.TAGConv(in_dim, hidden_dim, hops, activation=activation_func)) else: self.layers.append( conv.SGConv(in_dim, hidden_dim, hops, cached=False, norm=activation_func)) if self.norm == 'batch': self.n_layers.append(nn.BatchNorm1d(hidden_dim)) elif self.norm == 'layer': self.n_layers.append( nn.LayerNorm(hidden_dim, elementwise_affine=False)) elif self.norm == 'group': self.n_layers.append(nn.GroupNorm(16, hidden_dim)) elif self.norm == 'instance': self.n_layers.append(nn.InstanceNorm1d(hidden_dim)) else: self.n_layers.append(GraphNorm(hidden_dim, affine=False)) # hidden layers for k in range(0, hidden_layers): if ctype == 'tagconv': self.layers.append( conv.TAGConv(hidden_dim, hidden_dim, hops, activation=activation_func)) else: self.layers.append( conv.SGConv(hidden_dim, hidden_dim, hops, cached=False, norm=activation_func)) if self.norm == 'batch': self.n_layers.append(nn.BatchNorm1d(hidden_dim)) elif self.norm == 'layer': self.n_layers.append( nn.LayerNorm(hidden_dim, elementwise_affine=False)) elif self.norm == 'group': self.n_layers.append(nn.GroupNorm(16, hidden_dim)) elif self.norm == 'instance': self.n_layers.append(nn.InstanceNorm1d(hidden_dim)) else: self.n_layers.append(GraphNorm(hidden_dim, affine=False)) # dropout layer self.dropout = nn.Dropout(p=dropout) # last layer if self.readout == 'max': self.readout_fcn = conv.MaxPooling() elif self.readout == 'mean': self.readout_fcn = conv.AvgPooling() elif self.readout == 'sum': self.readout_fcn = conv.SumPooling() elif self.readout == 'gap': self.readout_fcn = conv.GlobalAttentionPooling( nn.Linear(hidden_dim, 1), nn.Linear(hidden_dim, hidden_dim * 2)) elif self.readout == 'sort': self.readout_fcn = conv.SortPooling(self.K) elif self.readout == 'set': self.readout_fcn = conv.Set2Set(hidden_dim, 2, 1) elif self.readout == 'cov': self.readout_fcn = CovPooling(hidden_dim) else: self.readout_fcn = SppPooling(hidden_dim, self.grid) if self.readout == 'spp': self.classify = nn.Sequential( nn.Dropout(), nn.Linear(hidden_dim * self.grid * self.grid, hidden_dim * 2), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(2 * hidden_dim, 2 * hidden_dim), nn.ReLU(inplace=True), nn.Linear(2 * hidden_dim, n_classes)) elif self.readout == 'sort': self.classify = nn.Sequential( #nn.Dropout(), nn.Linear(hidden_dim * self.K, n_classes)) elif self.readout == 'cov': self.classify = nn.Sequential( nn.Dropout(), nn.Linear(int(((hidden_dim + 1) * hidden_dim) / 2), n_classes)) else: var = hidden_dim if self.readout == 'gap' or self.readout == 'set': var *= 2 self.classify = nn.Linear(var, n_classes)