Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhang_wenshuo
GCN_Zhang_Wenshuo
提交
7bdef817
G
GCN_Zhang_Wenshuo
项目概览
zhang_wenshuo
/
GCN_Zhang_Wenshuo
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
29
列表
看板
标记
里程碑
合并请求
29
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
代码片段
项目成员
Pages
G
GCN_Zhang_Wenshuo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
29
Issue
29
列表
看板
标记
里程碑
合并请求
29
合并请求
29
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7bdef817
编写于
10月 27, 2022
作者:
zhang_wenshuo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
10,27 most function finished
上级
df3bf460
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
37 addition
and
25 deletion
+37
-25
GCN-PyTorch-master/layer.py
GCN-PyTorch-master/layer.py
+12
-10
GCN-PyTorch-master/model.py
GCN-PyTorch-master/model.py
+16
-9
GCN-PyTorch-master/train.py
GCN-PyTorch-master/train.py
+9
-6
未找到文件。
GCN-PyTorch-master/layer.py
浏览文件 @
7bdef817
...
@@ -24,34 +24,36 @@ class GraphConvolution(nn.Module):
...
@@ -24,34 +24,36 @@ class GraphConvolution(nn.Module):
self
.
featureless
=
featureless
# 如果啥都没有,那就没有
self
.
featureless
=
featureless
# 如果啥都没有,那就没有
self
.
num_features_nonzero
=
num_features_nonzero
# 返回的是如果有值的时候他值的个数
self
.
num_features_nonzero
=
num_features_nonzero
# 返回的是如果有值的时候他值的个数
self
.
weight
=
nn
.
Parameter
(
torch
.
randn
(
input_dim
,
output_dim
))
# 学习参数,上边的bias那个地方写的公式
self
.
weight
=
nn
.
Parameter
(
torch
.
randn
(
input_dim
,
output_dim
))
# 学习参数,上边的bias那个地方写的公式
,给踢个random
self
.
bias
=
None
# 他这个地方强制置成零了
self
.
bias
=
None
# 他这个地方强制置成零了
if
bias
:
if
bias
:
self
.
bias
=
nn
.
Parameter
(
torch
.
zeros
(
output_dim
))
# 他这个给bias了一个可学的参数
self
.
bias
=
nn
.
Parameter
(
torch
.
zeros
(
output_dim
))
# 他这个给bias了一个可学的参数
def
forward
(
self
,
inputs
):
def
forward
(
self
,
inputs
):
# print('inputs:', inputs)
# print('inputs:', inputs),
x
,
support
=
inputs
# 这个地方的input就是那个连接矩阵,用它做的前馈函数
x
,
support
=
inputs
# 这个接进来,support做的Adcexcay
# 确定在train的状态下,稀疏矩阵和非稀疏矩阵是两种不同的dropout方法
if
self
.
training
and
self
.
is_sparse_inputs
:
if
self
.
training
and
self
.
is_sparse_inputs
:
x
=
sparse_dropout
(
x
,
self
.
dropout
,
self
.
num_features_nonzero
)
x
=
sparse_dropout
(
x
,
self
.
dropout
,
self
.
num_features_nonzero
)
elif
self
.
training
:
elif
self
.
training
:
x
=
F
.
dropout
(
x
,
self
.
dropout
)
x
=
F
.
dropout
(
x
,
self
.
dropout
)
# convolve
# convolve
,看一下有没有特征
if
not
self
.
featureless
:
# if it has features x
if
not
self
.
featureless
:
# if it has features x
if
self
.
is_sparse_inputs
:
if
self
.
is_sparse_inputs
:
xw
=
torch
.
sparse
.
mm
(
x
,
self
.
weight
)
xw
=
torch
.
sparse
.
mm
(
x
,
self
.
weight
)
# 把x和weight相乘
else
:
else
:
xw
=
torch
.
mm
(
x
,
self
.
weight
)
xw
=
torch
.
mm
(
x
,
self
.
weight
)
else
:
else
:
xw
=
self
.
weight
xw
=
self
.
weight
out
=
torch
.
sparse
.
mm
(
support
,
xw
)
out
=
torch
.
sparse
.
mm
(
support
,
xw
)
# 把support和weight乘起来
if
self
.
bias
is
not
None
:
if
self
.
bias
is
not
None
:
out
+=
self
.
bias
out
+=
self
.
bias
# 加了bias
return
self
.
activation
(
out
),
support
return
self
.
activation
(
out
),
support
# 这个前向函数写的有问题吧我感觉?!
GCN-PyTorch-master/model.py
浏览文件 @
7bdef817
...
@@ -6,7 +6,7 @@ from layer import GraphConvolution
...
@@ -6,7 +6,7 @@ from layer import GraphConvolution
from
config
import
args
from
config
import
args
class
GCN
(
nn
.
Module
):
class
GCN
(
nn
.
Module
):
# https://www.educba.com/torch-dot-nn-module/
def
__init__
(
self
,
input_dim
,
output_dim
,
num_features_nonzero
):
def
__init__
(
self
,
input_dim
,
output_dim
,
num_features_nonzero
):
super
(
GCN
,
self
).
__init__
()
super
(
GCN
,
self
).
__init__
()
...
@@ -21,31 +21,38 @@ class GCN(nn.Module):
...
@@ -21,31 +21,38 @@ class GCN(nn.Module):
print
(
'output dim:'
,
output_dim
)
print
(
'output dim:'
,
output_dim
)
print
(
'num_features_nonzero:'
,
num_features_nonzero
)
print
(
'num_features_nonzero:'
,
num_features_nonzero
)
# 这个地方实际上定义的是两层,就是说,输入输出之间增加了一个隐含层,然后他配合了一下维度把他连接起来了,
# 定义的是两层自己层内的特性,层之间的链接还没有
# https://blog.csdn.net/dss_dssssd/article/details/82980222,Sequential 相当于将各个层加入一个容器里边,
# 而且我这个地方调用的时候调用的是类,相当于连接的部分nn.Sequential直接就把forward函数调用进来了,
# 这个地方还没有调用forward函数?
self
.
layers
=
nn
.
Sequential
(
GraphConvolution
(
self
.
input_dim
,
args
.
hidden
,
num_features_nonzero
,
self
.
layers
=
nn
.
Sequential
(
GraphConvolution
(
self
.
input_dim
,
args
.
hidden
,
num_features_nonzero
,
activation
=
F
.
relu
,
activation
=
F
.
relu
,
dropout
=
args
.
dropout
,
dropout
=
args
.
dropout
,
is_sparse_inputs
=
True
),
is_sparse_inputs
=
True
),
# 这个地方是输入->隐层
GraphConvolution
(
args
.
hidden
,
output_dim
,
num_features_nonzero
,
GraphConvolution
(
args
.
hidden
,
output_dim
,
num_features_nonzero
,
activation
=
F
.
relu
,
activation
=
F
.
relu
,
dropout
=
args
.
dropout
,
dropout
=
args
.
dropout
,
is_sparse_inputs
=
False
),
is_sparse_inputs
=
False
),
# 这个地方是隐层->输出
)
)
def
forward
(
self
,
inputs
):
def
forward
(
self
,
inputs
)
:
# 这个地方调用了forword函数,稍等一下再看那个forward函数,感觉他有点问题哈
x
,
support
=
inputs
x
,
support
=
inputs
x
=
self
.
layers
((
x
,
support
))
x
=
self
.
layers
((
x
,
support
))
# 这个地方调用了layer里边的forword函数,这个layer这个里边只有一个函数,所以直接用就行了,
# 他这个相当于直接调用了一个元组扔进去了,x为feature信息,support为联通矩阵的信息
return
x
return
x
def
l2_loss
(
self
):
def
l2_loss
(
self
):
# L2型的损失函数,利用l2范数计算损失情况:(误差的平方)的和,可以有稳定的单一解
# https://zhuanlan.zhihu.com/p/52203156,这个下边的layer是抽取了nn.Model里边的一层
layer
=
self
.
layers
.
children
()
layer
=
self
.
layers
.
children
()
layer
=
next
(
iter
(
layer
))
layer
=
next
(
iter
(
layer
))
# todo: 明天看一下Python迭代器的东西
loss
=
None
loss
=
None
for
p
in
layer
.
parameters
():
for
p
in
layer
.
parameters
():
...
...
GCN-PyTorch-master/train.py
浏览文件 @
7bdef817
...
@@ -69,7 +69,8 @@ feature = torch.sparse.FloatTensor(i.t(), v, features[2]).to(device)
...
@@ -69,7 +69,8 @@ feature = torch.sparse.FloatTensor(i.t(), v, features[2]).to(device)
supports
=
preprocess_adj
(
adj
)
# 把A搞成这个东西的返回值就是那个系数D^-0.5AD^0.5
supports
=
preprocess_adj
(
adj
)
# 把A搞成这个东西的返回值就是那个系数D^-0.5AD^0.5
i
=
torch
.
from_numpy
(
supports
[
0
]).
long
().
to
(
device
)
i
=
torch
.
from_numpy
(
supports
[
0
]).
long
().
to
(
device
)
v
=
torch
.
from_numpy
(
supports
[
1
]).
to
(
device
)
v
=
torch
.
from_numpy
(
supports
[
1
]).
to
(
device
)
support
=
torch
.
sparse
.
FloatTensor
(
i
.
t
(),
v
,
supports
[
2
]).
float
().
to
(
device
)
support
=
torch
.
sparse
.
FloatTensor
(
i
.
t
(),
v
,
supports
[
2
]).
float
().
to
(
device
)
# support是内个连接矩阵的常见版本
print
(
'x :'
,
feature
)
print
(
'x :'
,
feature
)
print
(
'sp:'
,
support
)
print
(
'sp:'
,
support
)
...
@@ -82,11 +83,13 @@ feat_dim = feature.shape[1] # 返回的是那个非稀疏矩阵的维度
...
@@ -82,11 +83,13 @@ feat_dim = feature.shape[1] # 返回的是那个非稀疏矩阵的维度
# 开始train net了
# 开始train net了
net
=
GCN
(
feat_dim
,
num_classes
,
num_features_nonzero
)
net
=
GCN
(
feat_dim
,
num_classes
,
num_features_nonzero
)
# 投进去的只有数据和特征
net
.
to
(
device
)
# torch.nn.Parameter(data,requires_grad)
optimizer
=
optim
.
Adam
(
net
.
parameters
(),
lr
=
args
.
learning_rate
)
net
.
to
(
device
)
# CUDA
optimizer
=
optim
.
Adam
(
net
.
parameters
(),
lr
=
args
.
learning_rate
)
# 底层加速计算用的
net
.
train
()
net
.
train
()
# 一般在开始训练代码的地方加入,涉及Dropout和batch normalizatuon的时候用这个是必须的
# https://blog.csdn.net/qq_46284579/article/details/120439049,如果没有DP和BN,这两个函数的影响好坏不定, 不用细致操作,不是类函数
for
epoch
in
range
(
args
.
epochs
):
for
epoch
in
range
(
args
.
epochs
):
out
=
net
((
feature
,
support
))
out
=
net
((
feature
,
support
))
...
@@ -104,7 +107,7 @@ for epoch in range(args.epochs):
...
@@ -104,7 +107,7 @@ for epoch in range(args.epochs):
print
(
epoch
,
loss
.
item
(),
acc
.
item
())
print
(
epoch
,
loss
.
item
(),
acc
.
item
())
net
.
eval
()
net
.
eval
()
# 一般在测试的地方加入,涉及Dropout和batch normalizatuon的时候用这个是必须的
out
=
net
((
feature
,
support
))
out
=
net
((
feature
,
support
))
out
=
out
[
0
]
out
=
out
[
0
]
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录