HazeDT / WaveletKernelNet

This is the code for WaveletKernelNet.
99 stars 28 forks source link

参数更新及权重加载的疑问 #3

Open ChenQian0618 opened 3 years ago

ChenQian0618 commented 3 years ago
  1. 这代码是否只是用小波形函数初始化第一层卷积的权重,并未实现权重更新由超参数控制?如果是这样的话,这代码和论文就完全不符合
  2. 该代码除cwconv层外,均是从pytorch模型torchvision源码上修改过来的,将它从2d改成1d后,就别弄pretrained这个加载权重的功能。1d模型加载2d权重,且第一个卷积层形状也不一致,当然会出问题。
JuncongX commented 1 year ago
  1. 这代码是否只是用小波形函数初始化第一层卷积的权重,并未实现权重更新由超参数控制?如果是这样的话,这代码和论文就完全不符合
  2. 该代码除cwconv层外,均是从pytorch模型torchvision源码上修改过来的,将它从2d改成1d后,就别弄pretrained这个加载权重的功能。1d模型加载2d权重,且第一个卷积层形状也不一致,当然会出问题。

不知是不是我理解错了,论文里头讲的权重更新貌似就是反向传播的链式求导。如果我没理解错的话,权重更新也不是创新点,而且Morlet小波基作为卷积核的论文Targeting EEG/LFP Synchrony with Neural Nets早在2017年就在NIPS上发表了

Kanbe-Kotori commented 1 year ago

是的,我也刚发现这个问题,a_和b_两个权重完全没有更新。

LeeJMJM commented 6 months ago

是的,我也刚发现这个问题,a_和b_两个权重完全没有更新。

这只是模型的代码,参数更新的代码我猜还得自己根据论文里偏导的公式自己弄一下。

Kanbe-Kotori commented 6 months ago

是的,我也刚发现这个问题,a_和b_两个权重完全没有更新。

这只是模型的代码,参数更新的代码我猜还得自己根据论文里偏导的公式自己弄一下。

错误的,a_和b两个权重完全没有更新的原因是: `self.a = nn.Parameter(torch.linspace(1, 10, out_channels))之后,不能加.view(-1, 1)`,不然这个参数根本就没注册上。。因此源代码有效可能就是因为初始值给的好,就算不更新也可以凑合用。。我改了这里以后准确率提了一个点左右

fyancy commented 6 months ago

两个参数修改为: b = nn.Parameter(torch.linspace(0, 10, out_channels).view(-1, 1)),否则变成没有grad的constant tensor了.

Kanbe-Kotori commented 6 months ago

两个参数修改为: b = nn.Parameter(torch.linspace(0, 10, out_channels).view(-1, 1)),否则变成没有grad的constant tensor了.

这样改也可以,我是在forward的时候view,也能解决。之前训练的时候打印这俩parameter,就发现值怎么都没变,看了老半天才找到这里的问题。改了之后准确率果然上去一点。最后再叠加上别的方法,总之效果不错,就写了篇论文引用了这个,比较幸运没被拒稿,目前还在修

liguge commented 6 months ago

两个参数修改为: 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

violet1108 commented 1 week ago

我还有个问题,代码里的平移因子和伸缩因子计算为: timedisc.cuda() - self.b.cuda() / self.a_.cuda() 这不会导致b和a先除吗?还是说就是这样用的?我看论文里是先减再除啊

fyancy commented 1 week ago

我还有个问题,代码里的平移因子和伸缩因子计算为: timedisc.cuda() - self.b.cuda() / self.a_.cuda() 这不会导致b和a先除吗?还是说就是这样用的?我看论文里是先减再除啊

你是对的,作者公开的代码应该是script,除了上面的需要调整一下,这里也要根据公式调整,比如

p1 = (time_disc - self.b_.to(dev)) / (self.a_.to(dev) + 1e-8)  # improved version: better
# p1 = time_disc - self.b_ / (self.a_.cuda()+1e-8)  # original codes in WaveletKernelNet, WKN