训练图时出现 TF-GNN 错误:ValueError: Could not unbatch scalar (rank=0) GraphPiece

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

我正在尝试对图数据的自动编码器进行建模,以最好地重建图,但在尝试进行训练时遇到了问题。

我创建了图张量,如下所示:

edge_sources = train_data['from_encoded'].values
edge_targets = train_data['to_encoded'].values
edge_signs = train_data['sign'].values


node_ids = tf.concat([edge_sources, edge_targets], axis=0)
unique_ids, _ = tf.unique(node_ids)

num_nodes = len(unique_ids)

hidden_state_dim = 64

# Create a GraphTensor from edges and node features
graph = tf_gnn.GraphTensor.from_pieces(
    node_sets={
        "nodes": tf_gnn.NodeSet.from_fields(sizes=[num_nodes], features={'id': unique_ids, 'hidden_state': tf.zeros((num_nodes, hidden_state_dim))})
    },
    edge_sets={
        "edges": tf_gnn.EdgeSet.from_fields(
            sizes=[len(edge_sources)],
            adjacency=tf_gnn.Adjacency.from_indices(
                source=("nodes", edge_sources),
                target=("nodes", edge_targets)
            ),
            features={
                "sign": tf.convert_to_tensor(edge_signs, dtype=tf.float32)
            }
        )
    }
)

然后我这样创建了模型:

graph_tensor_spec = graph.spec

# Define the GCN model with specified hidden layers
gcn_model = gcn.GCNConv(
        units=64,  # Example hidden layer sizes
        activation='relu',
        use_bias=True
    )
    
# Input layer using the graph tensor spec
inputs = tf.keras.layers.Input(type_spec=graph_tensor_spec)

# Apply the GCN model to the inputs
graph_setup = gcn_model(inputs,  edge_set_name="edges")
    
# Extract node states
node_states = graph_setup

decoder = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(64, activation='sigmoid')
])

decoded = decoder(node_states)
#decoded = decoder(embeddings)

autoencoder = tf.keras.Model(inputs=inputs, outputs=decoded)

我设置培训如下:

autoencoder.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(),
    metrics=[tf.keras.metrics.AUC()])
autoencoder.fit(
    x=graph,
    y=graph,  # For autoencoders, input = output
    epochs=1   # Number of training epochs
)

但是当我这样做时,我收到以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-38-c081c4864baa> in <cell line: 1>()
----> 1 autoencoder.fit(
      2     x=graph,
      3     y=graph,  # For autoencoders, input = output
      4     epochs=1   # Number of training epochs
      5 )

1 frames
/usr/local/lib/python3.10/dist-packages/tensorflow_gnn/graph/graph_piece.py in _unbatch(self)
    780     """Extension Types API: Unbatching."""
    781     if self.rank == 0:
--> 782       raise ValueError('Could not unbatch scalar (rank=0) GraphPiece.')
    783 
    784     def unbatch_fn(spec):

ValueError: Could not unbatch scalar (rank=0) GraphPiece.

我假设模型需要批量格式,即使我只有 1 张图?但我不知道如何解决这个问题。

我没有看到任何与此相关的文档。

我尝试训练图表,但出现了未批量错误,我不知道如何修复。我还怀疑这可能是我将数据提供给 "autoencoder.fit()" 的方式,也许我没有以正确的格式提供它,但我不确定,因为图形数据是 Graph.Tensor

tensorflow graph tf.keras gnn tensorflow-gnn
1个回答
0
投票

是的,TF-GNN(就像绝大多数 TF/Keras 代码一样)是根据对一批输入数据流进行训练的想法编写的。它的用户文档解释了详细信息,尤其是。有关数据准备和输入管道的章节。

顺便说一句:要使用 TF-GNN 的预定义模型构建图神经网络,您通常会堆叠多个 GraphUpdate 层; Conv 层只是其中的一部分。关于建模的章节有更多详细信息。

图重建是一项复杂的任务,从一个工作示例开始并对其进行调整可能会有所帮助。 (不幸的是,我没有关于使用 TF-GNN 的示例的参考。)

© www.soinside.com 2019 - 2024. All rights reserved.