使用GCN并且传入edge weights参数时,反向传播报错PowBackward0

使用GCN并且传入edge weights参数时,反向传播报错PowBackward0

问题描述

在使用torch_geometric库的GCN块时,传入edge weights参数。按照官方文档描述,该参数会将本为0-1二值矩阵的邻接矩阵 A A A 中的 1‘s 替换成edge weights中相应的值。
但是在使用edge weights参数的时候,反向传播会报错

RUntimeError: Function 'PowBackward0' returned nan values in its 0th output

后经过设置

with torch.autograd.detect_anomaly():
	loss.backward()

发现是GCN层出了错

 File "/home/user/anaconda3/envs/pytorch1.12.1-python3.9/lib/python3.9/site-packages/torch_geometric/nn/conv/gcn_conv.py", line 210, in forward
    edge_index, edge_weight = gcn_norm(  # yapf: disable
  File "/home/user/anaconda3/envs/pytorch1.12.1-python3.9/lib/python3.9/site-packages/torch_geometric/nn/conv/gcn_conv.py", line 101, in gcn_norm
    deg_inv_sqrt = deg.pow_(-0.5)

经过查看源码,确认是edge _weights的问题

deg = scatter(edge_weight, idx, dim=0, dim_size=num_nodes, reduce='sum')
    deg_inv_sqrt = deg.pow_(-0.5)

默认情况下edge_wight是一个全1的矩阵,但是在传入edge_weights之后,计算的deg矩阵可能会有负值,对负值开平方根导致反向传播报错

解决思路

一、

使用GCN时不使用edge weights

二、

对edge weights做预处理,确保传入的edge weights均为正值(未实验,猜测应当可以)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!关于使用GCN(Graph Convolutional Network)在Matlab中进行预测,你可以按照以下步骤进行操作: 1. 数据准备:首先,你需要准备好用于GCN训练和预测的数据集。这个数据集应该是一个图结构的数据,包含节点和边的信息。 2. 构建图结构:在Matlab中,你可以使用Graph对象来表示图结构。通过添加节点和边,你可以构建一个表示你的数据的图。 3. 特征提取:对于每个节点,你需要提取特征。这可以是节点的属性或其周围节点的属性。你可以使用一些特征提取方法,如节点的度中心性、PageRank等。 4. 构建GCN模型:使用Matlab中的深度学习工具箱,你可以构建GCN模型。GCN模型由多个图卷积层组成,每个图卷积层都是由一个邻接矩阵和一个权重矩阵定义的。 5. 训练模型:使用你准备好的数据集和构建好的GCN模型,你可以进行模型训练。在训练过程中,你可以使用一些优化算法,如随机梯度下降(SGD)。 6. 预测:训练完成后,你可以使用训练好的GCN模型来进行预测。将需要预测的节点特征输入到GCN模型中,即可得到对应的预测结果。 需要注意的是,以上步骤只是一个简单的示例,实际使用GCN进行预测可能需要更多的处理和调整。你可以根据你的具体问题和数据集对以上步骤进行适当的修改和扩展。 希望这些信息对你有所帮助!如有任何进一步的问题,请随提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值