我正在使用玩具模型从具有近30个特征的数据集中预测名为Probability
的特征。然后,我应用了一个玩具模型和nn.MSELoss()
,试图将模型与数据集拟合。但是,我发现损失并没有减少。
该模型非常简单,下面列出了代码。
class Logistic(nn.Module):
def __init__(self, input_size, output_size=1):
super(Logistic, self).__init__()
self.input_size = input_size
self.output = 0
self.layer1 = nn.Linear(input_size, output_size)
self.activation = nn.Sigmoid()
def forward(self, x):
x = self.layer1(x)
x = self.activation(x)
return x
然后我使用Dataset
和DataLoader
来读取数据集的DataFrame格式。另外,我在GPU中训练了模型。
criterion = nn.MSELoss()
total_epoch = 50
logi = Logistic(len(valuable_col) - 1, 1)
logi.to(device)
lr = 100
optimizer = torch.optim.Adam(logi.parameters(), lr=lr)
train_loss = []
valid_loss = []
logi.double()
for epoch in range(total_epoch):
logi.train()
train_loss_ = 0
for data_, target_ in tqdm.tqdm(train_loader):
optimizer.zero_grad()
data_, target_ = data_.to(device), target_.to(device)
output = logi.forward(data_)
loss = criterion(output, (target_).long())
train_loss_ += loss.item()
loss.backward()
optimizer.step()
train_loss.append(train_loss_ / len(train_loader))
logi.eval()
valid_loss_ = 0
for data_, target_ in tqdm.tqdm(test_loader):
data_, target_ = data_.to(device), target_.to(device)
output = logi.forward(data_)
valid_loss_ += criterion(output, target_)
valid_loss.append(valid_loss_.item() / len(test_loader))
print("[Epoch: %d] train_loss: %.6f, valid_loss: %.6f" % ((epoch + 1, train_loss[-1], valid_loss[-1])))
我发现每个时期的损失几乎相同。我不知道为什么。这让我感到困惑。
答案 0 :(得分:0)
根据我的经验,在这种情况下,通常归因于您的模型对数据的要求过小,或者数据存在问题。确保您确实向网络馈入了您认为正在馈入的输入,这一点非常重要。
一次又一次地归结为数据流水线中扭曲的事物(例如,没有足够的规范化,标签/数据不匹配...)。另一个很好的检查方法是查看您是否可以对单个批次或样本进行过度拟合。
如果您想要一个非常实用的神经网络设置指南,我强烈推荐Andrej Karpathy撰写的this blogpost,经过多年的积累,我一直回想起。