引言
最近在尝试构建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) ), ) }, )
虽然这个方法能够让程序正确运行,但是依然没有解决最根本的原因,为什么在修改特征名之后,会出现该错误。