'Activation'类型的对象没有len()

问题描述 投票:0回答:1

我正在尝试使用Keras构建GraphSAGE模型,但出现以下错误:

/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中的Activation方法没有实现len()。我已经阅读了有关此错误的其他几个主题,但也无法解决。请帮助。

python tensorflow keras networkx
1个回答
0
投票

确切的问题/解决方案取决于您所使用的stellargraph版本,但是如果您使用最新版本(撰写本文时为0.11.0)没问题,我已进行了一些调整使它起作用:

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

# 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)

# `inputs` and `outputs` instead of `input` and `output`
model = Model(inputs=x_inp, outputs=prediction)

model.compile(
    # parameter name `optimizer` instead of `optimizers`
    optimizer=optimizers.Adam(lr=1e-3),
    loss=losses.binary_crossentropy,
    metrics=[metrics.binary_accuracy],
)


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

我为我更新的每一行都写了一条注释-除了一些小的错别字,我怀疑主要问题是由于导入了keras而不是tensorflow.keras。随着tensorflow> = 2.0的发布,stellargraph使用了keras API,它是tensorflow核心API的一部分,它是recommended that users that use keras with the tensorflow backend switch to using tensorflow.keras

目前,我们建议在TensorFlow 2.0中将使用多后端Keras与TensorFlow后端一起使用的Keras用户切换到tf.keras。 tf.keras得到更好的维护,并且与TensorFlow功能(渴望执行,发行支持等)具有更好的集成。

希望有帮助!


作为旁注,正在使用的其他一些方法在tensorflow.keras中已弃用-它们现在应该可以正常使用,但是会产生弃用警告,将来会被删除:

从networkx构造恒星图:

0.11.0

从恒星图模型获取输入和输出张量:

G = sg.StellarGraph(Gnx, node_features=node_with_features)

# switch to
G = sg.StellarGraph.from_networkx(Gnx, node_features=node_with_features)
© www.soinside.com 2019 - 2024. All rights reserved.