WaveletKernelNet
WaveletKernelNet copied to clipboard
参数更新及权重加载的疑问
- 这代码是否只是用小波形函数初始化第一层卷积的权重,并未实现权重更新由超参数控制?如果是这样的话,这代码和论文就完全不符合
- 该代码除cwconv层外,均是从pytorch模型torchvision源码上修改过来的,将它从2d改成1d后,就别弄pretrained这个加载权重的功能。1d模型加载2d权重,且第一个卷积层形状也不一致,当然会出问题。
- 这代码是否只是用小波形函数初始化第一层卷积的权重,并未实现权重更新由超参数控制?如果是这样的话,这代码和论文就完全不符合
- 该代码除cwconv层外,均是从pytorch模型torchvision源码上修改过来的,将它从2d改成1d后,就别弄pretrained这个加载权重的功能。1d模型加载2d权重,且第一个卷积层形状也不一致,当然会出问题。
不知是不是我理解错了,论文里头讲的权重更新貌似就是反向传播的链式求导。如果我没理解错的话,权重更新也不是创新点,而且Morlet小波基作为卷积核的论文Targeting EEG/LFP Synchrony with Neural Nets早在2017年就在NIPS上发表了
是的,我也刚发现这个问题,a_和b_两个权重完全没有更新。
是的,我也刚发现这个问题,a_和b_两个权重完全没有更新。
这只是模型的代码,参数更新的代码我猜还得自己根据论文里偏导的公式自己弄一下。
是的,我也刚发现这个问题,a_和b_两个权重完全没有更新。
这只是模型的代码,参数更新的代码我猜还得自己根据论文里偏导的公式自己弄一下。
错误的,a_和b_两个权重完全没有更新的原因是:
self.a_ = nn.Parameter(torch.linspace(1, 10, out_channels))
之后,不能加.view(-1, 1)
,不然这个参数根本就没注册上。。因此源代码有效可能就是因为初始值给的好,就算不更新也可以凑合用。。我改了这里以后准确率提了一个点左右
两个参数修改为: b = nn.Parameter(torch.linspace(0, 10, out_channels).view(-1, 1)),否则变成没有grad的constant tensor了.
两个参数修改为: b = nn.Parameter(torch.linspace(0, 10, out_channels).view(-1, 1)),否则变成没有grad的constant tensor了.
这样改也可以,我是在forward的时候view,也能解决。之前训练的时候打印这俩parameter,就发现值怎么都没变,看了老半天才找到这里的问题。改了之后准确率果然上去一点。最后再叠加上别的方法,总之效果不错,就写了篇论文引用了这个,比较幸运没被拒稿,目前还在修
两个参数修改为: b = nn.Parameter(torch.linspace(0, 10, out_channels).view(-1, 1)),否则变成没有grad的constant tensor了.
这样改也可以,我是在forward的时候view,也能解决。之前训练的时候打印这俩parameter,就发现值怎么都没变,看了老半天才找到这里的问题。改了之后准确率果然上去一点。最后再叠加上别的方法,总之效果不错,就写了篇论文引用了这个,比较幸运没被拒稿,目前还在修
欢迎关注一下我们团队的两个工作,对这个工作作了一些思考和扩展,代码也都开源了。 https://github.com/liguge/EWSNet https://github.com/liguge/DLWCB