m0_53782829 2023-04-20 10:03 采纳率: 50%

# GNN解决图着色（图论）问题

......
# 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)



• 写回答

#### 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人已打赏

• 系统已结题 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 讨论 博士论文交互项怎么讨论？