Deep learning 如何防止我的DNN/MLP收敛到平均值

Deep learning 如何防止我的DNN/MLP收敛到平均值,deep-learning,pytorch,mlp,Deep Learning,Pytorch,Mlp,我想使用几个可用的特性来预测一个变量。它似乎与视力或NLP无关。虽然我相信有很好的理由可以证明,要预测的变量是这些特征的非线性函数。所以我只使用普通MLP,如下所示: class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(53, 200) self.fc2 = nn.Linear(200, 100)

我想使用几个可用的特性来预测一个变量。它似乎与视力或NLP无关。虽然我相信有很好的理由可以证明,要预测的变量是这些特征的非线性函数。所以我只使用普通MLP,如下所示:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(53, 200)
        self.fc2 = nn.Linear(200, 100)
        self.fc3 = nn.Linear(100, 36)
        self.fc4 = nn.Linear(36, 1)

    def forward(self, x):
        x = F.leaky_relu(self.fc1(x))
        x = F.leaky_relu(self.fc2(x))
        x = F.leaky_relu(self.fc3(x))
        x = self.fc4(x)
        return x
net = Net().to(device)
loss_function = nn.MSELoss()
optimizer = optim.Adam(net.parameters(), lr=0.001, weight_decay= 1e-6)


def train_normal(model, device, train_loader, optimizer, epoch):
    model.train ()
    for batch_idx, (data, target) in enumerate (train_loader):
        data = data.to (device)
        target = target.to (device)
        optimizer.zero_grad ()
        output = model (data)
        loss = loss_function (output, target)
        loss.backward ()
        torch.nn.utils.clip_grad_norm_(model.parameters(), 100)
        optimizer.step ()
        if batch_idx % 100 == 0:
            print ('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format (
                epoch, batch_idx * len (data), len (train_loader.dataset),
                       100. * batch_idx / len (train_loader), loss.item ()))
起初,它似乎起了作用,并确实学到了一些东西:

Train Epoch: 9 [268800/276316 (97%)] Loss: 0.217219
Train Epoch: 9 [275200/276316 (100%)] Loss: 0.234965
predicted actual diff
-1.18 -1.11 -0.08
0.15 -0.15 0.31
0.19 0.27 -0.08
-0.49 -0.48 -0.01
-0.05 0.08 -0.14
0.44 0.50 -0.06
-0.17 -0.05 -0.12
1.81 1.92 -0.12
1.55 0.76 0.79
-0.05 -0.30 0.26
但当它不断学习时,我发现无论输入的内容如何,结果似乎都接近彼此的平均值:

predicted actual diff
-0.16   -0.06   -0.10
-0.16   -0.55   0.39
-0.13   -0.26   0.14
-0.15   0.50    -0.66
-0.16   0.02    -0.18
-0.16   -0.12   -0.04
-0.16   -0.40   0.24
-0.01   1.20    -1.21
-0.07   0.33    -0.40
-0.09   0.02    -0.10
什么技术/技巧可以防止它?另外,如何提高精确度,我应该增加更多的隐藏层还是每层增加更多的神经元?

  • 一个可能的问题是没有什么可学的

  • 检查您的数据是否标准化,并尝试不同的学习率(甚至可能是循环学习率)。可能发生的事情是,算法无法进入极小值,并且不断地跳转

  • 我不确定,如果您正在使用它,但是,请使用在另一个数据集中工作的标准实现n,然后将其更改为您的问题,以避免小的开发错误。你可以查看本教程中的任何一个,但如果你真的是新手,我会完全推荐你做这个MOOC。这应该让你获得一些水平和理解

  • 如果你已经有了所有的表格数据,你可以尝试使用机器学习算法。只是为了检查你的数据是否有一些信息

>>将numpy作为np导入
>>>从sklearn.linear\u模型导入线性回归
>>>X=np.数组([[1,1],[1,2],[2,2],[2,3])
>>>#y=1*x_0+2*x_1+3
>>>y=np.点(X,np.数组([1,2]))+3
>>>reg=线性回归().拟合(X,y)
>>>注册分数(X,y)
1
>>>里格科夫_
数组([1,2.]))
>>>注册截获_
3.0000...
>>>reg.predict(np.array([[3,5]]))
数组([16.]))

如果你找到了解决问题的方法,请告诉我

我假设你所有的特征都是连续的,对吗?有些是连续的,有些是谨慎的。没有一个是绝对的。我是ML的新手。你能解释一下在哪里可以找到“标准实现”和“线性回归/梯度增强”吗?我刚刚更新了一些教程链接,可以帮助你入门。如果你想轻松使用一些更经典的实现,你也可以看看sklearn,它为几乎所有经典的机器学习方法提供了良好的实现。文档清晰易懂