add_module:add_module
(name, module)
作用:为当前的module添加子module
具有两个参数:
pytorch不会自动给我们注册模块,我们需要根据传进来的参数对网络进行初始化,pytorch在注册模块的时候,会查看成员的类型,如果成员变量类型是Module的子类,那么pytorch就会注册这个模块,否则就不会。
在__init__中
conv_ls = []
for i in range(hyperpm['nlayer']):
conv = RoutingLayer(hyperpm)
self.add_module('conv_%d' % i, conv)
conv_ls.append(conv)
在forward中
for conv in self.conv_ls:
x = conv(x, src_trg_edges)
有一个替换操作:
self.convs=nn.ModuleList([RoutingLayer(hyperpm) for _ in range(hyperpm['nlayer'])])
python中for _ in range(10) 与 for i in range(10):
for _ in range(n) 一般仅仅用于循环n次,不用设置变量,用 _ 指代临时变量,只在这个语句中使用一次。
在循环中两者的作用相似。
python-格式化字符串(%d %f %s )
https://blog.csdn.net/yokii_/article/details/102811308
print(model)
当print(model)时,默认是按照def __init__(self,in_dim, out_dim, device)中的顺序打印的,而非是forward中的顺序。
mode = ‘test’ if y is None else ‘train’
if y==None:
mode='test'
else:
mode='train'
上面两段代码等价
复现代码结果:
发现seed随机种子又不能用了,不能复现代码的结果,经过检查发现是在model中使用了negative_sampling,这个玩意儿不受seed的约束。
经过抽丝剥茧,我发现一个巨大的问题,不是negative_sampling不受seed的约束,而是我在写seed函数的时候,忘记在.py文件里面import random包了,但是更坑爹的是,他一直没有报错,一直运行良好,这是什么鬼东西啊!
import random
random.seed(seed) #为python设置随机种子
当导入这个包之后,就可以完美的复现代码结果啦。
我发现写代码就是发现一个问题,解决一个问题,周而复始。