Объект типа «Активация» не имеет len () - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь построить свою модель GraphSAGE, используя Keras, но получаю следующую ошибку:

/Users/name/anaconda3/envs/tf/bin/python /Users/name/PycharmProjects/keras_autoencoder/NodeEmbeddings.py
Using TensorFlow backend.
2020-03-26 22:35:08.640725: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-03-26 22:35:08.655308: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7f9aa4872710 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-03-26 22:35:08.655323: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
link_classification: using 'ip' method to combine node embeddings into edge embeddings
/Users/name/PycharmProjects/keras_autoencoder/NodeEmbeddings.py:65: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=[<tf.Tenso..., outputs=Tensor("re...)`
  model = Model(input=x_inp, output=prediction)
Traceback (most recent call last):
  File "/Users/name/PycharmProjects/keras_autoencoder/NodeEmbeddings.py", line 65, in <module>
    model = Model(input=x_inp, output=prediction)
  File "/Users/name/anaconda3/envs/tf/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "/Users/name/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/network.py", line 94, in __init__
    self._init_graph_network(*args, **kwargs)
  File "/Users/name/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/network.py", line 241, in _init_graph_network
    self.inputs, self.outputs)
  File "/Users/name/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/network.py", line 1434, in _map_graph_network
    tensor_index=tensor_index)
  File "/Users/name/anaconda3/envs/tf/lib/python3.6/site-packages/keras/engine/network.py", line 1415, in build_map
    for i in range(len(node.inbound_layers)):
TypeError: object of type 'Activation' has no len()

Вот мой код:

import networkx as nx
import stellargraph as sg
import pandas as pd
import numpy as np


from keras import layers, optimizers, losses, metrics, Model

from keras import optimizers

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)#.flow(unsupervised_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)

model = Model(input=x_inp, output=prediction)

model.compile(
    optimizers=optimizers.Adam(lr=1e-3),
    loss=losses.binary_crossentropy,
    metrics=[metrics.binary_accuracy],
)


history = model.fit_generator(
    train_gen,
    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)

Поскольку я не являюсь уверен, что эта ошибка говорит мне, потому что методы активации в Keras API не имеют len (). Я прочитал несколько других тем об этой ошибке, но она тоже не работает. Пожалуйста, помогите.

1 Ответ

1 голос
/ 30 марта 2020

точная проблема / решение будет зависеть от того, какую версию 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...