точная проблема / решение будет зависеть от того, какую версию stellargraph
вы используете, но если для вас не проблема использовать последнюю версию (0.11.0
на момент написания), я сделал несколько корректировки, чтобы он работал:
import networkx as nx
import stellargraph as sg
import pandas as pd
import numpy as np
# UPDATED: import from tensorflow.keras instead of keras
from tensorflow.keras import layers, optimizers, losses, metrics, Model
from stellargraph.mapper import GraphSAGENodeGenerator, GraphSAGELinkGenerator
from stellargraph.layer import GraphSAGE, link_classification
from stellargraph.data import UnsupervisedSampler
from sklearn import preprocessing
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
# Loading Data --------------
# Define Edges and Nodes (from_pandas_edgelist creates Nodes automatically from the parsed edgelist)
edgelist= pd.read_csv("./data/cora/cora.cites", sep='\t', header=None, names=['target', 'source'])
edgelist['label'] = 'cites'
Gnx = nx.from_pandas_edgelist(edgelist, edge_attr='label')
nx.set_node_attributes(Gnx, 'paper', 'label')
# Define Node features
feature_names = ["w_{}".format(ii) for ii in range(1433)]
column_names = feature_names + ['subject']
node_data = pd.read_csv("./data/cora/cora.content", sep='\t', header=None, names=column_names)
node_with_features = node_data[feature_names]
# Create StellarGraph object
G = sg.StellarGraph(Gnx, node_features=node_with_features)
# Specify model and training parameter
nodes = list(G.nodes())
number_of_walks = 1
length = 5
batch_size = 50
epochs = 4
num_samples = [10, 5]
unsupervised_samples = UnsupervisedSampler(G, nodes=nodes, length=length, number_of_walks=number_of_walks)
train_gen = GraphSAGELinkGenerator(G,batch_size, num_samples)
# Creating GraphSAGE model
layer_sizes =[50,50]
graphsage = GraphSAGE(layer_sizes=layer_sizes, generator=train_gen, bias=True, dropout=0.0, normalize='l2')
x_inp, x_out = graphsage.build()
prediction = link_classification(output_dim=1, output_act='hard_sigmoid', edge_embedding_method='ip')(x_out)
# UPDATED: `inputs` and `outputs` instead of `input` and `output`
model = Model(inputs=x_inp, outputs=prediction)
model.compile(
# UPDATED: parameter name `optimizer` instead of `optimizers`
optimizer=optimizers.Adam(lr=1e-3),
loss=losses.binary_crossentropy,
metrics=[metrics.binary_accuracy],
)
history = model.fit_generator(
# UPDATED: we need to call .flow before passing it to `fit_generator`
train_gen.flow(unsupervised_samples),
epochs=epochs,
verbose=1,
use_multiprocessing=False,
workers=4,
shuffle=True,
)
# Node Embedding
x_inp_src = x_inp[0::2]
x_out_src = x_out[0]
embedding_model = Model(inputs=x_inp_src, outputs=x_out_src)
node_ids = node_data.index
node_gen = GraphSAGENodeGenerator(G, batch_size,num_samples).flow(node_ids)
node_embeddings = embedding_model.predict_generator(node_gen, workers=4, verbose=1)
print(node_embeddings)
Я написал комментарий для каждой обновленной строки (UPDATED
) - кроме некоторых незначительных опечаток, я подозреваю, что основная проблема заключалась в импорте keras
вместо tensorflow.keras
. С выпуском tenorflow> = 2.0 stellargraph
использует API-интерфейс keras, который является частью базового API-интерфейса tenorflow, и рекомендует пользователям, использующим keras с бэкэнд-сервером tenorflow, использовать tensorflow.keras
В настоящее время мы рекомендуем пользователям Keras, которые используют мульти-бэкенд-Keras с бэкэндом TensorFlow, переключиться на tf.keras в TensorFlow 2.0. tf.keras лучше поддерживается и имеет лучшую интеграцию с функциями TensorFlow (активное выполнение, поддержка распространения и т. д.).
Надеюсь, это поможет!
Как примечание, некоторые другие используемые методы устарели в 0.11.0
- они должны работать как есть на данный момент, но будут выдавать предупреждения об устаревании и будут удалены в будущем:
Создание звездного графа из сети x:
G = sg.StellarGraph(Gnx, node_features=node_with_features)
# switch to
G = sg.StellarGraph.from_networkx(Gnx, node_features=node_with_features)
Получение входных и выходных тензоров из модели звездной графики:
x_inp, x_out = graphsage.build()
# switch to
x_inp, x_out = graphsage.in_out_tensors()