相同的输入,相同的网络参数,不同的输出

模块A下面有一个函数a(), 在A.py模块下面的模块测试代码if name == 'main’中调用a(x)产生的结果和在另一个模块B.py的某个函数中调用a(x),相同的输入x, a(x)产生的结果不一致。A.py和B.py的所在的目录不同.

来两张图:

inputs是输入, net.mapper()是调用net.mapper网络模型的forward函数,最上面的那些显示不全的是net.mapper.state_dict()的结果。
在这里插入图片描述
在这里插入图片描述
从图片上可以看到,输入inputs相同,net.mapper.state_dict()相同,但是结果却不一致。

跳坑记录:

1 确认输入完全相同,网络的结构和参数一致(将输入&网络参数保存成文件并进行了比较),虚拟环境一致。

2 上图执行是同时进行的,为了确认不是相互干扰,单独执行,结果依旧

3 确认不是网络中存在随即因素,设置了net.eval()确保不是因为在训练过程中有dropout和torch.manual_seed(0),结果依旧

4 同时执行两个模块进行pdb,对网络的forward同时进行深入跟踪,前面一直相同,直到某一步,发现调用的模块的名字相同,但是所在的目录不一致,执行的结果也不一致。定位到问题。因为net.mapper()的前向函数执行的过程中调用的某个模块c.py中有from E.F.G import EqualLinear, 程序执行的当前目录中正好有这个E.F.G的模块,直接调用了。而B.py的搜索路径中的某一条下面也有E.F.G的同名模块,且均有EqualLinear这个函数,虽然这个函数的EqualLinear本身的代码一样,但是函数中某一行调用的函数对应的模块的内容是不同的。

同一个开源代码,路人甲直接用了它,路人乙也用了,但是进行了一些修改,这个修改会某一个函数拥有相同的名字,实现相同的功能,但是结果不一直。而我碰巧两个都有,而且阴差阳错地在同一个函数实现中通过一个函数调用了这两个不同的实现方式。

5 解决办法:文件替换或者显式地修改sys.path将正确执行的那个程序的当前目录添加到sys.path中去。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值