在PyTorch中训练神经网络时损失值一直为’nan’

我为参数分配了不同的weight_decay,结果training losstesting loss都变成了nan。

我打印了prediction_train,loss_train,running_loss_train,prediction_test,loss_test,and running_loss_test,它们都是nan。

我使用numpy.any(numpy.isnan(dataset))检查了数据,它返回了False

如果我使用optimizer = torch.optim.Adam(wnn.parameters())而不是为参数分配不同的weight_decay,就不会有问题。

您能告诉我如何修复这个问题吗?这是我的代码,我自己定义了激活函数。谢谢您:)

class Morlet(nn.Module):def __init__(self):    super(Morlet,self).__init__()def forward(self,x):    x=(torch.cos(1.75*x))*(torch.exp(-0.5*x*x))    return xmorlet=Morlet()class WNN(nn.Module):def __init__(self):    super(WNN,self).__init__()    self.a1=torch.nn.Parameter(torch.randn(64,requires_grad=True))    self.b1=torch.nn.Parameter(torch.randn(64,requires_grad=True))    self.layer1=nn.Linear(30,64,bias=False)    self.out=nn.Linear(64,1)def forward(self,x):    x=self.layer1(x)    x=(x-self.b1)/self.a1    x=morlet(x)    out=self.out(x)    return outwnn=WNN()optimizer = torch.optim.Adam([{'params': wnn.layer1.weight, 'weight_decay':0.01},                          {'params': wnn.out.weight, 'weight_decay':0.01},                          {'params': wnn.out.bias, 'weight_decay':0},                          {'params': wnn.a1, 'weight_decay':0.01},                          {'params': wnn.b1, 'weight_decay':0.01}])criterion = nn.MSELoss()for epoch in range(10):prediction_test_list=[]running_loss_train=0running_loss_test=0for i,(x1,y1) in enumerate(trainloader):    prediction_train=wnn(x1)    #print(prediction_train)    loss_train=criterion(prediction_train,y1)    #print(loss_train)    optimizer.zero_grad()     loss_train.backward()     optimizer.step()    running_loss_train+=loss_train.item()       #print(running_loss_train)tr_loss=running_loss_train/train_set_y_array.shape[0]for i,(x2,y2) in enumerate(testloader):    prediction_test=wnn(x2)    #print(prediction_test)    loss_test=criterion(prediction_test,y2)    #print(loss_test)    running_loss_test+=loss_test.item()    print(running_loss_test)    prediction_test_list.append(prediction_test.detach().cpu())ts_loss=running_loss_test/test_set_y_array.shape[0]print('Epoch {} Train Loss:{}, Test Loss:{}'.format(epoch+1,tr_loss,ts_loss))    test_set_y_array_plot=test_set_y_array*(dataset.max()-dataset.min())+dataset.min()prediction_test_np=torch.cat(prediction_test_list).numpy()prediction_test_plot=prediction_test_np*(dataset.max()-dataset.min())+dataset.min()plt.plot(test_set_y_array_plot.flatten(),'r-',linewidth=0.5,label='True data')plt.plot(prediction_test_plot,'b-',linewidth=0.5,label='Predicted data')plt.legend()plt.show()print('Finish training')

输出结果是:

Epoch 1 Train Loss:nan, Test Loss:nan

图表上只有真实数据,如图所示。enter image description here


回答:

权重衰减对学习参数应用L2正则化,快速浏览您的代码,您在这里使用a1权重作为分母x=(x-self.b1)/self.a1,并且设置了0.01的权重衰减,这可能导致一些a1权重变为零,除以零会导致什么结果呢?

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注