pytorch学习的一些tips(10)

add_module:add_module(namemodule)

作用:为当前的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设置随机种子

当导入这个包之后,就可以完美的复现代码结果啦。

我发现写代码就是发现一个问题,解决一个问题,周而复始。


你可能感兴趣的:(学习)