图神经网络入门代码(2)-逐行分析
逐行详解 GnnLayer
的 __init__
方法
1. 类定义与初始化参数
import torch
import torch.nn as nnclass GnnLayer(nn.Module):def __init__(self, in_feats, out_feats, neighbr, bias=False, activation=False):super(GnnLayer, self).__init__()
-
作用:定义一个自定义的图神经网络层,继承自PyTorch的
nn.Module
。 -
参数:
-
in_feats
:输入特征的维度(例如每个节点的特征向量长度)。 -
out_feats
:输出特征的维度(经过该层后的特征向量长度)。 -
neighbr
:每个节点的最大邻居数(用于权重矩阵维度计算)。 -
bias
:是否在层中添加可学习的偏置项(True
表示添加)。 -
activation
:是否在该层后使用激活函数(True
表示使用)。
-
2. 参数存储与变量初始化
self.in_feats = in_featsself.out_feats = out_featsself.neighbor = neighbrself.activation = activationself.weight = nn.Parameter(torch.FloatTensor(size=(neighbr*in_feats, out_feats)))self.bias_bool = bias# define the network inside the nodesself.relu = nn.LeakyReLU()
-
作用:将输入参数保存为类的成员变量,供后续使用。定义一个可学习的权重矩阵,用于对聚合后的邻居特征进行线性变换。
-
示例:
-
若
in_feats=5
,out_feats=16
,neighbr=2
,则该层会将每个节点的5维特征,结合2个邻居的信息,映射到16维特征。 -
权重矩阵的形状为
(neighbr * in_feats, out_feats)
-
偏置项 (
bias_bool
):-
若
bias=True
,则在该层中添加一个可学习的偏置向量,用于调整线性变换后的输出。 -
偏置的作用:允许模型学习输出值的偏移,增强拟合能力。
-
-
激活函数 (
relu
):-
LeakyReLU
是一种非线性激活函数,其中,x小于0时,α 是一个小斜率(默认0.01),避免负数输入时梯度为零。 -
作用:引入非线性,使模型能够学习复杂的特征映射。
-
-
3. 权重与偏置的初始化
if activation:self.activation = activationnn.init.xavier_uniform_(self.weight, gain=nn.init.calculate_gain('relu'))if bias:self.bias = nn.Parameter(torch.FloatTensor(size=(1, self.out_feats)))nn.init.xavier_uniform_(self.bias, gain=nn.init.calculate_gain('relu'))else:if bias:self.bias = nn.Parameter(torch.FloatTensor(size=(1, self.out_feats)))nn.init.xavier_uniform_(self.bias)nn.init.xavier_uniform_(self.weight)
-
初始化逻辑:
-
当使用激活函数时 (
activation=True
):-
权重初始化:使用Xavier均匀初始化,并根据
relu
的增益(gain)调整初始化范围,以缓解梯度消失问题。-
Xavier初始化的目标是保持输入和输出的方差一致。
-
gain=nn.init.calculate_gain('relu')
根据激活函数类型调整增益值(对ReLU增益为2)。
-
-
偏置初始化:如果启用偏置,同样使用Xavier均匀初始化。
-
-
当不使用激活函数时 (
activation=False
):-
权重初始化:仅使用标准Xavier均匀初始化。
-
偏置初始化:如果启用偏置,初始化方式同上。
-
-
-
代码细节:
-
nn.Parameter
:将张量标记为可学习参数,自动加入模型参数列表。 -
nn.init.xavier_uniform_
:按Xavier均匀分布初始化张量。
-