def test_RGCN_apply_dense_directed(): G, features = create_graph_features(is_directed=True) As = get_As(G) As = [np.expand_dims(A.todense(), 0) for A in As] generator = RelationalFullBatchNodeGenerator(G, sparse=False) rgcnModel = RGCN([2], generator, num_bases=10, activations=["relu"], dropout=0.5) x_in, x_out = rgcnModel.in_out_tensors() model = keras.Model(inputs=x_in, outputs=x_out) # Check fit method out_indices = np.array([[0, 1]], dtype="int32") preds_1 = model.predict([features[None, :, :], out_indices] + As) assert preds_1.shape == (1, 2, 2) # Check fit method preds_2 = model.predict(generator.flow(["a", "b"])) assert preds_2.shape == (1, 2, 2) assert preds_1 == pytest.approx(preds_2)
def test_RGCN_apply_sparse_directed(): G, features = create_graph_features(is_directed=True) As = get_As(G) As = [A.tocoo() for A in As] A_indices = [ np.expand_dims(np.hstack((A.row[:, None], A.col[:, None])), 0) for A in As ] A_values = [np.expand_dims(A.data, 0) for A in As] generator = RelationalFullBatchNodeGenerator(G, sparse=True) rgcnModel = RGCN([2], generator, num_bases=10, activations=["relu"], dropout=0.5) x_in, x_out = rgcnModel.build() model = keras.Model(inputs=x_in, outputs=x_out) # Check fit method out_indices = np.array([[0, 1]], dtype="int32") preds_1 = model.predict([features[None, :, :], out_indices] + A_indices + A_values) assert preds_1.shape == (1, 2, 2) # Check fit_generator method preds_2 = model.predict_generator(generator.flow(["a", "b"])) assert preds_2.shape == (1, 2, 2) assert preds_1 == pytest.approx(preds_2)
def generator_flow(self, G, node_ids, node_targets, sparse=False): generator = RelationalFullBatchNodeGenerator(G, sparse=sparse) n_nodes = len(G.nodes()) gen = generator.flow(node_ids, node_targets) if sparse: [X, tind, *As], y = gen[0] As_indices = As[:self.num_relationships] As_values = As[self.num_relationships:] As_sparse = [ sps.coo_matrix( (A_val[0], (A_ind[0, :, 0], A_ind[0, :, 1])), shape=(n_nodes, n_nodes), ) for A_ind, A_val in zip(As_indices, As_values) ] As_dense = [A.toarray() for A in As_sparse] else: [X, tind, *As], y = gen[0] As_dense = As assert np.allclose(X, gen.features) # X should be equal to gen.features assert tind.shape[1] == len(node_ids) if node_targets is not None: assert np.allclose(y, node_targets) return As_dense, tind, y
def test_generator_flow_targets_as_list(self): generator = RelationalFullBatchNodeGenerator(self.G) node_ids = list(self.G.nodes())[:3] node_targets = [1] * len(node_ids) gen = generator.flow(node_ids, node_targets) inputs, y = gen[0] assert y.shape == (1, 3) assert np.sum(y) == 3
def test_generator_flow_targets_not_iterator(self): generator = RelationalFullBatchNodeGenerator(self.G) node_ids = list(self.G.nodes())[:3] node_targets = 1 with pytest.raises(TypeError): generator.flow(node_ids, node_targets)