引言

最近在尝试构建GraphTensor时,尝试把默认的特征名hidden_state改成其他时,出现了奇怪的报错。

 

报错

WARNING:tensorflow:Gradients do not exist for variables ['gnn/essay_model/graph_update/edge_set_update/next_state_from_concat/dense_3/kernel:0', 'gnn/essay_model/graph_update/edge_set_update/next_state_from_concat/dense_3/bias:0', 'gnn/essay_model/graph_update/node_set_update/next_state_from_concat_1/dense_4/kernel:0', 'gnn/essay_model/graph_update/node_set_update/next_state_from_concat_1/dense_4/bias:0'] when minimizing the loss. If you're using model.compile(), did you forget to provide a lossargument

 

一般来说出现此类错误时,只需要检查各模型call()函数中的运算,排查问题就行了。

但是当我遇到这个问题后,经过多次检查确定变量都传到了输出。

最后发现当我使用默认的特征名hidden_state后,报错消失了

 

下面是出现错误时的GraphTensor构造方式和GraphUpdate更新方式

node_set = tfgnn.NodeSet.from_fields(
                sizes=[node_num],
                features={
                    'node_feature': node_feature, 
                }
            )

edge_set = tfgnn.EdgeSet.from_fields(
                sizes=[edge_num],
                features={
                    'edge_feature': tf.convert_to_tensor(edge_feature, dtype=tf.float32)},
                adjacency=tfgnn.Adjacency.from_indices(
                    source=('node', adjacency[:, 0]),
                    target=('node', adjacency[:, 1])
                ),
            )

context = tfgnn.Context.from_fields(features=None)

graph_tensor = tfgnn.GraphTensor.from_pieces(
                node_sets={'node': node_set},
                edge_sets={'edge': edge_set},
                context=context,
            )



model = tfgnn.keras.layers.GraphUpdate(
            edge_sets={
                "edge": tfgnn.keras.layers.EdgeSetUpdate(
                    edge_input_feature=['edge_feature'],
                    node_input_feature='node_feature',
                    next_state=tfgnn.keras.layers.NextStateFromConcat(tf.keras.layers.Dense(2)))
            },
            node_sets={
                "node": tfgnn.keras.layers.NodeSetUpdate(
                    edge_set_inputs={"edge": tfgnn.keras.layers.Pool(tfgnn.TARGET, "sum")},
                    node_input_feature='node_feature',
                    next_state=tfgnn.keras.layers.NextStateFromConcat(
                        tf.keras.layers.Dense(264)
                    ),
                )
            },
        )

 

下面是不会出现错误的GraphTensor构造方式和GraphUpdate更新方式

node_set = tfgnn.NodeSet.from_fields(
                sizes=[node_num],
                features={
                    'hidden_state': node_feature, 
                }
            )

edge_set = tfgnn.EdgeSet.from_fields(
                sizes=[edge_num],
                features={
                    'hidden_state': tf.convert_to_tensor(edge_feature, dtype=tf.float32)},
                adjacency=tfgnn.Adjacency.from_indices(
                    source=('node', adjacency[:, 0]),
                    target=('node', adjacency[:, 1])
                ),
            )

context = tfgnn.Context.from_fields(features=None)

graph_tensor = tfgnn.GraphTensor.from_pieces(
                node_sets={'node': node_set},
                edge_sets={'edge': edge_set},
                context=context,
            )



model = tfgnn.keras.layers.GraphUpdate(
           
     edge_sets={
                "edge": tfgnn.keras.layers.EdgeSetUpdate(
                    next_state=tfgnn.keras.layers.NextStateFromConcat(tf.keras.layers.Dense(2)))
            },
            node_sets={
                "node": tfgnn.keras.layers.NodeSetUpdate(
                    edge_set_inputs={"edge": tfgnn.keras.layers.Pool(tfgnn.TARGET, "sum")}
                    next_state=tfgnn.keras.layers.NextStateFromConcat(
                        tf.keras.layers.Dense(264)
                    ),
                )
            },
        )

 

虽然这个方法能够让程序正确运行,但是依然没有解决最根本的原因,为什么在修改特征名之后,会出现该错误。