Почему точность моего теста так низка для простого нейрона net? - PullRequest
0 голосов
/ 02 мая 2020

Я использую сверхпростую нейронную сеть с прямой связью на наборе данных, состоящем из 128 функций более 50 классов. Эти функции представляют собой вложения предложений, которые я извлек из модели BERT, где я уже достигаю точности 0,73.

Во время обучения потери постоянно снижаются, а точность в тренировочном наборе обычно составляет не менее 0,40 в зависимости от Я установил гиперпараметры на.

Но точность на наборе разработчиков всегда очень низкая. В большинстве случаев это обычно <0,02, что хуже, чем случайное угадывание. </p>

То, что я пробовал:

  • Скорость обучения [0.1, 0.01, 0.001, 0.0005, 0.0001, 0.00001]
  • Добавление дополнительных слои в нейроне net
  • Использование сигмоида и танха вместо ReLU
  • Удаление выпадающего слоя
  • Добавление пакетного нормального слоя
  • SGD вместо Адама

код:

class NeuralNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.hidden1 = nn.Linear(128, 80)
        self.output = nn.Linear(80, 50)

        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(p=0.5)


    def forward(self, x):
        x = self.hidden1(x)
        x = self.relu(x)
        x = self.dropout(x)

        x = self.output(x)
        return x

nnet = NeuralNet()

loss_function = nn.CrossEntropyLoss()

optimizer = optim.Adam(nnet.parameters(), lr=0.001)

nnet.double().to(device)

# Create the DataLoader for our training set.

train_data = TensorDataset(train_features, train_labels)

train_sampler = RandomSampler(train_data)

train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=32)

validation_data = TensorDataset(test_features, test_labels)

validation_sampler = SequentialSampler(validation_data)

validation_dataloader = DataLoader(validation_data, sampler=validation_sampler, batch_size=32)


epochs = 100

for epoch in range(1, epochs+1):
    nnet.train()
    epoch_loss = 0
    epoch_acc = 0
    for batch in train_dataloader:
        features = batch[0].to(device)
        labels = batch[1].to(device)
        optimizer.zero_grad()

        outputs = nnet(features)
        vals, inds = torch.max(outputs, dim=1)

        loss = loss_function(outputs, labels)
        epoch_loss += loss

        acc = torch.eq(inds, labels).sum().item() / labels.shape[0]
        epoch_acc += acc


        loss.backward()
        optimizer.step()
    avg_epoch_loss = epoch_loss / len(train_dataloader)
    avg_epoch_acc = epoch_acc / len(train_dataloader)
    print(f"Epoch: [{epoch}/{epochs}], loss: {avg_epoch_loss}, acc: {avg_epoch_acc}")


nnet.eval()
total_acc = 0
for batch in validation_dataloader:
    features = batch[0].to(device)
    labels = batch[1].to(device)

    with torch.no_grad():
        outputs = nnet(features)
        vals, inds = torch.max(outputs, dim=1)
        loss = loss_function(outputs, labels)
        print(f"Loss: {loss}")
    acc = torch.eq(inds, labels).sum().item() / labels.shape[0]
    total_acc += acc
avg_acc = total_acc / len(validation_dataloader)

print(f'Acc: {avg_acc}')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...