def test_GCN_apply_sparse(): G, features = create_graph_features() adj = nx.to_numpy_array(G)[None, :, :] n_nodes = features.shape[0] nodes = G.nodes() node_features = pd.DataFrame.from_dict( {n: f for n, f in zip(nodes, features)}, orient="index") G = StellarGraph(G, node_features=node_features) generator = FullBatchNodeGenerator(G, sparse=False, method="none") gcnModel = GCN([2], ["relu"], generator=generator, dropout=0.5) x_in, x_out = gcnModel.node_model() 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, adj]) 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 test_gat_serialize(self): G = example_graph_1(feature_size=self.F_in) gen = FullBatchNodeGenerator(G, sparse=self.sparse, method=self.method) gat = GAT( layer_sizes=self.layer_sizes, activations=self.activations, attn_heads=self.attn_heads, generator=gen, bias=True, normalize="l2", ) x_in, x_out = gat.node_model() model = keras.Model(inputs=x_in, outputs=x_out) ng = gen.flow(G.nodes()) # Save model model_json = model.to_json() # Set all weights to one model_weights = [np.ones_like(w) for w in model.get_weights()] # Load model from json & set all weights model2 = keras.models.model_from_json( model_json, custom_objects={"GraphAttention": GraphAttention}) model2.set_weights(model_weights) # Test deserialized model actual = model2.predict_generator(ng) expected = np.ones( (G.number_of_nodes(), self.layer_sizes[-1])) * (1.0 / G.number_of_nodes()) assert np.allclose(expected, actual[0])
def test_APPNP_apply_propagate_model_dense(): G, features = create_graph_features() adj = nx.to_scipy_sparse_matrix(G) features, adj = GCN_Aadj_feats_op(features, adj) adj = adj.todense()[None, :, :] n_nodes = features.shape[0] nodes = G.nodes() node_features = pd.DataFrame.from_dict( {n: f for n, f in zip(nodes, features)}, orient="index") G = StellarGraph(G, node_features=node_features) generator = FullBatchNodeGenerator(G, sparse=False, method="gcn") appnpnModel = APPNP([2], ["relu"], generator=generator, dropout=0.5) fully_connected_model = keras.Sequential() fully_connected_model.add(Dense(2)) x_in, x_out = appnpnModel.propagate_model(fully_connected_model) 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, adj]) 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 test_gat_node_model_no_norm(self): G = example_graph_1(feature_size=self.F_in) gen = FullBatchNodeGenerator(G, sparse=self.sparse, method=self.method) gat = GAT( layer_sizes=self.layer_sizes, activations=self.activations, attn_heads=self.attn_heads, generator=gen, bias=True, normalize=None, ) gat._layers[1].kernel_initializer = keras.initializers.get("ones") gat._layers[1].attn_kernel_initializer = keras.initializers.get("ones") gat._layers[3].kernel_initializer = keras.initializers.get("ones") gat._layers[3].attn_kernel_initializer = keras.initializers.get("ones") x_in, x_out = gat.node_model() model = keras.Model(inputs=x_in, outputs=x_out) ng = gen.flow(G.nodes()) actual = model.predict_generator(ng) expected = np.ones((G.number_of_nodes(), self.layer_sizes[-1])) * ( self.F_in * self.layer_sizes[0] * self.attn_heads) assert np.allclose(expected, actual[0])
def test_APPNP_apply_sparse(): G, features = create_graph_features() adj = nx.to_scipy_sparse_matrix(G) features, adj = GCN_Aadj_feats_op(features, adj) adj = adj.tocoo() A_indices = np.expand_dims(np.hstack((adj.row[:, None], adj.col[:, None])), 0) A_values = np.expand_dims(adj.data, 0) nodes = G.nodes() node_features = pd.DataFrame.from_dict( {n: f for n, f in zip(nodes, features)}, orient="index") G = StellarGraph(G, node_features=node_features) generator = FullBatchNodeGenerator(G, sparse=True, method="gcn") appnpnModel = APPNP([2], ["relu"], generator=generator, dropout=0.5) x_in, x_out = appnpnModel.node_model() 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)