网络结构创建顺序影响结果
收藏
我最近在写一个程序,很简单的一个模型
网络结构:backbone + CBAM + classifier
发现一个很震惊的事情
在model的__init__中 分别按照 backbone、CBAM、classifier 的顺序创建 和 backbone、classifer、CBAM 的顺序创建,
即 self.cbam=CBAM(channel) self.classifier=nn.Sequential(nn.Conv2D ...)
self.classifier=nn.Sequential(nn.Conv2D ...) self.cbam=CBAM(channel)
forward中代码一致,其他文件也均一致,
训练时的seed固定,设置FLAGS_cudnn_deterministic为True
两次训练除了model__init__中顺序不一致其他均一致,最后训练出来的结果竟然不一致
有大佬可以解惑吗?
0
收藏
请登录后评论
这是个问题,提个issue问问呢
我又去pytorch试了一下,发现pytorch也是两次结果不一样的,我猜可能是因为
所有随机数种子都固定了,生成的一系列数是固定的,导致构成整个模型权重的数固定
假设CBAM的权重为1000个数,classfier的权重为500个数,
按backbone+CBAM+classifier的顺序生成的网络中 CBAM权重由前1000个数组成,classifier权重由后500个数组成
按backbone+classifier+CBAM的顺序生成的网络中 CBAM权重由后1000个数组成,classifier权重由前500个数组成
这样导致了两次生成的CBAM和classifier权重 是不同的,从而导致了网络结果不同
举个例子来说,假设随机数种子固定后生成的三个随机数是4、5、6,
若按照a、b、c的顺序来生成这三个数,a、b、c的值分别为4、5、6, x=[a,b,c], x的值就成了[4,5,6]
而按照a、c、b的顺序来生成这三个数,a、b、c的值分别为4、6、5, x=[a,b,c], x的值就成了[4,6,5]
我也碰到过