一、
最近在修改代码后,训练过程loss出现NAN,而且概率很大,于是查找原因,在此记录。
在给信号按照相应信噪比加噪声的过程中,增加了部分代码,且增加了batch norm,但是训练过程中大概率loss会出现NAN。
增加噪声的代码如下:
1 def wgn(x, snr):
2 P_signal = np.sum(abs(x)**2)/len(x)
3 P_noise = P_signal/10**(snr/10.0)
4 return np.random.randn(len(x)) * np.sqrt(P_noise)
根据查到的资料,先后怀疑过是学习率,batch norm的过程,最后查到是代码中出现开平方的过程,sqrt(P_noise),而P_noise接近于零导致。
故在sqrt前,给P_noise加上一个小数,变为sqrt(P_noise+0.00001),此问题解决。
此过程参考的资料如下:
https://blog.csdn.net/weixin_44191286/article/details/86437924
https://blog.csdn.net/github_36923418/article/details/103010097
https://blog.csdn.net/qq_34914551/article/details/99992341
二、
给权重参数初始化
1.单层网络的情况:
xavier更适合tanh激活函数
torch.nn.init.xavier_normal(tensor, gain=1)
例如:
w = torch.Tensor(3, 5)
nn.init.xavier_normal(w)
kaiming更适合relu
torch.nn.init.kaiming_normal(tensor, a=0, mode='fan_in')
例如:
w = torch.Tensor(3, 5)
nn.init.kaiming_normal(w, mode='fan_out')
2.自定义多层网络:
在__init__
中迭代循环self.modules()
来初始化网络参数
参考的资料如下:
https://blog.csdn.net/dss_dssssd/article/details/83959474
https://blog.csdn.net/dss_dssssd/article/details/83990511