【发布时间】:2019-10-24 04:20:31
【问题描述】:
我是深度学习的新手,我构建了一个非常简单的模型来尝试训练我的数据。我有两个特征输入:sex 和 age。 sex 是 0 或 1 和 age 在 25 和 60 之间。输出只是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或在末端使用sigmoid和torch.nn.NLLLoss(负对数似然)。
标签: python deep-learning pytorch