【问题标题】:How to train features in different scales in deep learning model如何在深度学习模型中训练不同尺度的特征
【发布时间】:2019-10-24 04:20:31
【问题描述】:

我是深度学习的新手,我构建了一个非常简单的模型来尝试训练我的数据。我有两个特征输入:sexagesex01age2560 之间。输出只是0 表示此人没有这种疾病,1 表示有这种疾病。

但是,当我训练我的模型时,训练损失根本没有减少。看起来是因为我的两个功能在范围上非常不同。那么我该如何解决这个问题呢?任何建议将不胜感激。

我的代码在这里:

class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()

        self.fc1 = nn.Sequential(
            nn.Linear(2,50),
            nn.ReLU(),
            nn.Linear(50,2)
        )

    def forward(self,x):
        x = self.fc1(x)

        x = F.softmax(x, dim=1)
        return x

#Inputs
X = np.column_stack((sex,age))
X = torch.from_numpy(X).type(torch.FloatTensor)
y = torch.from_numpy(y).type(torch.LongTensor)


#Initialize the model        
model = Net()
#Define loss criterion
criterion = nn.CrossEntropyLoss()
#Define the optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

epochs = 1000

losses = []
for i in range(epochs):

    y_pred = model.forward(X)
    #Compute Cross entropy loss
    loss = criterion(y_pred,y)
    #Add loss to the list
    losses.append(loss.item())
    #Clear the previous gradients
    optimizer.zero_grad()
    #Compute gradients
    loss.backward()
    #Adjust weights
    optimizer.step()
    _, predicted = torch.max(y_pred.data, 1)

    if i % 50 == 0:
        print(loss.item())

火车损失看起来像这样

0.9273738861083984
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618
0.6992899179458618

编辑

感谢您的 cmets。抱歉,我没有清楚地解释我的问题。这是我的网络的一部分,我的输入数据包含两部分:第一部分是一些信号数据,我使用 CNN 模型对其进行训练,效果很好;第二部分就是我上面提到的。我的目标是合并两个模型以提高我的准确性。 我已经尝试过标准化,看起来它可以工作。我想知道在预处理数据时是否总是需要进行规范化?谢谢!

【问题讨论】:

  • 你试过简单的标准化吗?像 Z-score 或 min-max 应该在这种情况下简单地工作。
  • 不管缩放,你确定只有这两个输入可以预测你的输出,损失比这更好吗?
  • 最后,你确定神经网络是必要的吗?它不会学到任何明智的东西,并且会严重过度拟合您的数据。顺便提一句。你应该有1 输出,而不是2,因为它是二进制的。并且您不应该在网络末端使用激活并使用torch.nn.BCEWithLogitsLoss 或在末端使用sigmoidtorch.nn.NLLLoss(负对数似然)。

标签: python deep-learning pytorch


【解决方案1】:

另一种选择。

如果年龄在(25-60) 范围内具有离散值,那么一种可能的方法是学习这两个属性的嵌入,sexage

例如,

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        self.sex_embed = nn.Embedding(2, 20)
        self.age_embed = nn.Embedding(36, 50)

        self.fc1 = nn.Sequential(
            nn.Linear(70, 35),
            nn.ReLU(),
            nn.Linear(35, 2)
        )

    def forward(self, x):
        # write the forward

在上面的例子中,我假设年龄值是整数(25, 26, ..., 60),所以对于每个可能的值,我们可以学习一个向量表示。

所以,我建议学习20d 表示性别和50d 表示年龄。您可以更改尺寸并进行实验以找到最佳值。

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 2019-11-30
    • 2020-11-10
    • 1970-01-01
    • 2020-06-08
    • 2017-07-23
    • 2018-01-09
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多