我正在尝试对图数据的自动编码器进行建模,以最好地重建图,但在尝试进行训练时遇到了问题。
我创建了图张量,如下所示:
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
是的,TF-GNN(就像绝大多数 TF/Keras 代码一样)是根据对一批输入数据流进行训练的想法编写的。它的用户文档解释了详细信息,尤其是。有关数据准备和输入管道的章节。
顺便说一句:要使用 TF-GNN 的预定义模型构建图神经网络,您通常会堆叠多个 GraphUpdate 层; Conv 层只是其中的一部分。关于建模的章节有更多详细信息。
图重建是一项复杂的任务,从一个工作示例开始并对其进行调整可能会有所帮助。 (不幸的是,我没有关于使用 TF-GNN 的示例的参考。)