m0_53782829 2023-04-20 10:03 采纳率: 50%
浏览 75
已结题

GNN解决图着色(图论)问题

在tensorflow框架下,模型为GNN模型,要解决图着色(图论)问题,中间大致过程经过编码输入,RNN循环,聚合更新节点,颜色的嵌入,经固定次数嵌入更新,得到最后的节点和颜色的特征,输入MLP,进行预测任务:该图是否接受C中颜色着色?(二分类问题)
其中,负责聚合更新的RNN循环次数设为32时,loss在迭代过程会由很大的值(超过百万以上)逐渐变为lan,循环次数为8,最后loss由50左右经100epoch后会稳定在0.69和acc稳定在0.5左右是什么原因呢?
除此之外,我想在最后一层激活函数sigmoid之前加入BN层应该怎么编写呢,部分段代码如下:

......
 # Get the last embeddings
    last_states = gnn(
      { "M": M_matrix, "VC": VC_matrix, 'chrom_number': chrom_number },
      { "V": vertex_initial_embeddings, "C": colors_initial_embeddings },
      time_steps = time_steps
    )
    GNN["last_states"] = last_states
    V_n = last_states['V'].h
    C_n = last_states['C'].h
    # Compute a vote for each embedding
    V_vote = tf.reshape(V_vote_MLP(V_n), [-1])

    # Compute the number of problems in the batch
    num_problems = tf.shape(n_vertices)[0]

    # Compute a logit probability for each problem
    pred_logits = tf.while_loop(
        lambda i, pred_logits: tf.less(i, num_problems),
        lambda i, pred_logits:
            (
                (i+1),
                pred_logits.write(
                    i,
                    tf.reduce_mean(V_vote[tf.reduce_sum(n_vertices[0:i]):tf.reduce_sum(n_vertices[0:i])+n_vertices[i]])
                )
            ),
        [0, tf.TensorArray(size=num_problems, dtype=tf.float32)]
        )[1].stack()

    # Convert logits into probabilities
    GNN['predictions'] = tf.sigmoid(pred_logits)

或者BN层应该加到其他什么地方呢,希望有详细代码指导?期望得到详细咨询指导,想具体了解代码的可以私信

  • 写回答

6条回答 默认 最新

  • 关注

    关于loss变化的问题,可能是因为RNN循环的次数较多(32),导致模型训练较慢,需要更多的迭代才能收敛。此外,模型可能存在梯度爆炸或消失问题,可以尝试加入梯度裁剪或使用其他的优化器和学习率调整策略。

    而最后loss和准确率稳定在一个相对较高的数值(0.69和0.5)可能是因为该问题本身就比较困难,即使是一个随机猜测的准确率也是0.5左右。

    至于在最后一层激活函数sigmoid之前加入BN层,可以按照以下方式修改代码:

    
    from tensorflow.keras.layers import BatchNormalization
    
    # Get the last embeddings
    last_states = gnn(
      { "M": M_matrix, "VC": VC_matrix, 'chrom_number': chrom_number },
      { "V": vertex_initial_embeddings, "C": colors_initial_embeddings },
      time_steps = time_steps
    )
    GNN["last_states"] = last_states
    V_n = last_states['V'].h
    C_n = last_states['C'].h
    # Compute a vote for each embedding
    V_vote = tf.reshape(V_vote_MLP(V_n), [-1])
    
    # Add a Batch Normalization layer before the final output
    V_vote = BatchNormalization()(V_vote)
    
    # Compute the number of problems in the batch
    num_problems = tf.shape(n_vertices)[0]
    
    # Compute a logit probability for each problem
    pred_logits = tf.while_loop(
        lambda i, pred_logits: tf.less(i, num_problems),
        lambda i, pred_logits:
            (
                (i+1),
                pred_logits.write(
                    i,
                    tf.reduce_mean(V_vote[tf.reduce_sum(n_vertices[0:i]):tf.reduce_sum(n_vertices[0:i])+n_vertices[i]])
                )
            ),
        [0, tf.TensorArray(size=num_problems, dtype=tf.float32)]
        )[1].stack()
    
    # Convert logits into probabilities
    GNN['predictions'] = tf.sigmoid(pred_logits)
    

    在最后一层激活函数sigmoid之前,使用Batch Normalization层进行归一化,可以加速模型收敛,提高模型的精度。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥50 内网的网页打开的Excel下载到本地
  • ¥15 该网站用的是什么程序模版
  • ¥15 verilog modelsim仿真
  • ¥15 Power BI 里面 帕累托图突出显示前20
  • ¥50 用预估矫正法,分数阶微分方程组传染病的最优控制代码怎么写
  • ¥15 画个数据流程图,手画也行
  • ¥60 AS自带模拟器AVD Root 和 Xposed安装
  • ¥30 哪位搞Android的编程师可以帮我远程一下,悬赏30元
  • ¥15 solidity部署上合约,可以mint,也继承接口了,在区块链也不显示代币名字
  • ¥15 讨论 博士论文交互项怎么讨论?