loss在前几个batch处于正常下降状态,之后突变为Nan,没有增大爆炸的过程。
尝试减小学习率,无果。
考虑是网络本身有问题导致梯度爆炸。
网络分类分支head如下:
[nn.Conv3d(ngf, self.opt.n_class, kernel_size=1, padding=0), nn.AdaptiveMaxPool3d((1, None, None))]
考虑最后的时间维度的max pooling之后,没有加激活函数,导致该分支输出的数值容易爆炸,所以在之后加了一个tanh层:
[nn.Conv3d(ngf, self.opt.n_class, kernel_size=1, padding=0), nn.AdaptiveMaxPool3d((1, None, None)), nn.Tanh()]
之后再训练,loss正常下降。
该问题和输入没有归一化类似,导致数值大小爆炸。
在分类模型接近收敛时突然提示input里出现nan,然后loss也变成nan
该问题原因可能是分类的类别里某类的数量很少或者为0,导致接近收敛的模型对该类的softmax预测概率为0,然后同时在计算log时,没有+一个很小的值,导致log里出现了0从而产生nan。